系统设计地址为省市县三级联动,规范是规范了,但是无形中增加了系统操作的时间成本,因此设计地址自动返填技术,只要把地址拷贝到详细地址框中,可以自动返填到省市县三级联动的下拉框中。

  还好洒家的大学不是混过来的,写起这个模块来感觉饶有趣味。

一、dom结构

  省市县三级自然以三个下拉框的形式展现,详细地址为一个textarea框,id分别使用province、city、coll、detailAddress代表。

 <%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@include file="/WEB-INF/webpage/common/taglibs.jspf"%>
<!-- Author : guanghe-->
<%--
引用方法:
<form id="itemForm" action="item" method="post">
<jsp:include page="../../common/address.jsp">
<jsp:param name="init" value="true" />
<jsp:param name="amount" value="false" />
</jsp:include>
</form>
--%>
<table class="table table-bordered table-condensed dataTables-example dataTable no-footer">
<tbody>
<tr>
<td class="width-15 active text-right">
<label><font color="red">*</font>名称:</label>
</td>
<td class="width-35">
<input id="name" name="name" class="form-control inputxt" datatype="*" errormsg="请填写名称!" />
<label class="Validform_checktip"></label>
</td>
</tr>
<tr>
<td class="width-15 active text-right">
<label><font color="red">*</font>联系人:</label>
</td>
<td class="width-35">
<input id="contactsName" name="contactsName" class="form-control inputxt" datatype="*" errormsg="请填写联系人!" />
<label class="Validform_checktip"></label>
</td>
</tr>
<tr>
<td class="width-15 active text-right">
<label>电话:</label>
</td>
<td class="width-35">
<input id="phone" name="phone" class="form-control inputxt" datatype="/(^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$)|^\-$|^\s*$/" errormsg="请填写固话号、手机号或空!" />
<label class="Validform_checktip"></label>
</td>
</tr>
<c:if test="${param.amount}">
<tr>
<td class="width-15 active text-right">
<label><font color="red">*</font>配送数量:</label>
</td>
<td class="width-35">
<input type="text" id="amount" name="text" class="form-control inputxt" datatype="/^[1-9][0-9]*$/" errormsg="请填写配送数量!" />
<label class="Validform_checktip"></label>
</td>
</tr>
</c:if>
<tr>
<td class="width-15 active text-right">
<label><font color="red">*</font>地址:</label>
</td>
<td class="width-35">
<div style="margin-bottom: 5px;">
<select name="province" class="inputxtcommon" id="province"
onchange="changCity('${adminPath}/basic/usualaddress/regionSelect');">
<option value="0">请选择省份</option>
</select>
<select name="city" class="inputxtcommon" id="city"
onchange="changColl('${adminPath}/basic/usualaddress/regionSelect')">
<option value="0">请选择市</option>
</select>
<select name="coll" id="coll" class="inputxtcommon" onchange="setColl() ">
<option value="0">请选择区</option>
</select>
</div>
<div>
<textarea id="detailAddress" name="detailAddress" class="form-control inputxt" datatype="*" errormsg="请填写具体地址!"></textarea>
<label class="Validform_checktip"></label>
</div>
</td>
</tr>
</tbody>
</table>
<script>
//省数据字典
var proDict = null;
//页面初始化
$(function(){
<c:if test="${param.init}">
var address = null;
<c:if test="${not empty data && not empty data.province}">
address = {
province : "${data.province}",
city : "${data.city}",
coll : "${data.coll}",
detailAddress : "${data.detailAddress}"
};
</c:if>
//初始化地址组件
setAddress(address);
//加载已有数据
var item = {
name : "${data.name}",
contactsName : "${data.contactsName}",
phone : "${data.phone}",
<c:if test="${param.amount}">
amount : "${data.amount}"
</c:if>
};
setItem(item);
</c:if>
});
//初始化地址组件
function setAddress(address) {
proDict = window.initSelect(1, 'province','${adminPath}/basic/usualaddress/regionSelect');
//加载默认地址数据
if(address && address.province) {
window.$("#province").val(address.province);
window.changCity('${adminPath}/basic/usualaddress/regionSelect');
window.$("#city").val(address.city);
window.changColl('${adminPath}/basic/usualaddress/regionSelect');
window.$("#coll").val(address.coll);
window.$("#detailAddress").val(address.detailAddress);
}
//绑定地址自动识别功能
$("#detailAddress").blur(function(e) {
autoRecognition(1, 1);
});
}
//初始化已有地址相关数据
function setItem(item) {
$("#name").val(item.name);
$("#contactsName").val(item.contactsName);
$("#phone").val(item.phone);
<c:if test="${param.amount}">
$("#amount").val(item.amount);
</c:if>
}
//获取地址字段信息
function getItem() {
var proId = $("#province").val();
var directCity = [2, 3, 10, 23];
var address = "";
if($.inArray(proId - 0, directCity) >= 0) {
address = $("#province").find("option:selected").text() +
$("#coll").find("option:selected").text() + $("#detailAddress").val();
} else {
address = $("#province").find("option:selected").text() + $("#city").find("option:selected").text() +
$("#coll").find("option:selected").text() + $("#detailAddress").val();
}
return {
name : $("#name").val(),
contactsName : $("#contactsName").val(),
phone : $("#phone").val(),
<c:if test="${param.amount}">
amount : $("#amount").val(),
</c:if>
province : $("#province").val(),
city : $("#city").val(),
coll : $("#coll").val(),
detailAddress : $("#detailAddress").val(),
address : address
};
}
</script>

二、工具函数与核心递归函数

  主要是设计地址数据的查询、dom修改工具函数、核心递归函数

 //初始化选项,并拿到数据字典
function initSelect(pid, selectId,url) {
var dict = {};
selectUrl = url;
$("#" + selectId + "").find('option').not(':eq(0)').remove();
$.ajax({
url : url,
type : 'post',
dataType : "json",
data : { pid : pid },
async : false,
success : function(result,status,xhr) {
var list = result.list;
var options = "";
for (var index in list) {
var opt = list[index];
options += '<option value="' + opt.id+'">' + opt.name + '</option>';
dict[opt.id] = opt.name;
}
$("#" + selectId + "").append(options);
},
error : function(xhr,status,err) {
top.layer.alert(err);
}
});
return dict;
}
function changCity(url) {
var dict = null;
if ($("#province").val() != 0) {
dict = initSelect($("#province").val(), 'city',url);
province = $("#province").find("option:selected").text();
$("#coll").find('option').not(':eq(0)').remove();
}else{
$("#city").find('option').not(':eq(0)').remove();
$("#city").val("0");
$("#coll").find('option').not(':eq(0)').remove();
$("#coll").val("0");
}
return dict;
}
function changColl(url) {
var dict = null;
if ($("city").val() != 0) {
dict = initSelect($("#city").val(), 'coll',url);
city = $("#city").find("option:selected").text();
}
return dict;
}
//地址自动识别器 level 1:省 2:市 3:县
function autoRecognition(level, pid) {
var address = $("#detailAddress").val();
var isMatched = false; //终止器
//迭代体
if(address && level) { //剪枝函数
var url = '${adminPath}/basic/usualaddress/regionSelect';
var dict = null;
var dom = null;
var nextLevel = null;
var exeMatcher = true;
if(level == 1) {
dict = proDict;
dom = "#province";
nextLevel = 2;
} else if(level == 2){
dict = window.changCity(url);
dom = "#city";
nextLevel = 3;
//如果是直辖市
if($.inArray(pid - 0, [2, 3, 10, 23]) >= 0) {
//关闭匹配器
exeMatcher = false;
}
} else if(level == 3) {
dict = window.changColl(url);
dom = "#coll";
nextLevel = 0;
}
//开启匹配则运行匹配器
if(exeMatcher) {
$.each(dict, function(key, value) {
if(address.indexOf(value) == 0) {
window.$(dom).val(key);
address = address.substring(value.length, address.length);
$("#detailAddress").val(address);
autoRecognition(nextLevel, key);
isMatched = true;
return false;
}
});
} else { //直辖市跳过市级遍历,直接进入区级遍历
$.each(dict, function(key, value) {
window.$(dom).val(key);
var isFound = autoRecognition(nextLevel, key);
if(isFound) {
return false;
}
});
}
}
return isMatched;
}

JS地址自动返填技术的更多相关文章

  1. JS 获取和返填单选按钮Value值

    1.获取Radio值 $('input[name="sex"]:checked ').val(); 2.返填Radio值 $('input[name="sex" ...

  2. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  3. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  4. JavaScript实现http地址自动检测并添加URL链接

    一.天生我材必有用 给http字符自动添加URL链接是比较常见的一项功能.举两个我最近常用到的自动检测http://地址并添加链接的例子吧,首先是QQ邮箱,在使用QQ邮箱时,如果输入了URL地址(ht ...

  5. JS图片自动和可控的轮播切换特效

    点击这里查看效果:http://hovertree.com/texiao/js/1.htm HTML文件代码如下: <!DOCTYPE html> <html xmlns=" ...

  6. JS实现自动倒计时

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. (转)在网页中JS函数自动执行常用三种方法

    原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...

  8. JavaScript实现url地址自动检测并添加URL链接示例代码

    写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签,下面是具体的实现,感兴趣的朋友不要错过 背景:写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签.  实现代码: 复制代码代码如 ...

  9. JS图片自动或者手动滚动效果(支持left或者up)

    JS图片自动或者手动滚动效果(支持left或者up) JS图片自动或者手动滚动效果 在谈组件之前 来谈谈今天遇到搞笑的事情,今天上午接到一个杭州电话 0571-28001187 即说是杭州人民法院的 ...

随机推荐

  1. SpringMvc 400 Bad Request解决方法

    今天做项目的时候突然报出400 Bad Request错误,后台没有出现任何问题. 首先我看了看log日志中没有接受到任何参数,可以确定这个请求并没有发送出去,所以应该是前台数据提交的问题. 然后我看 ...

  2. HTML5怎么实现录音和播放功能

    小旋风柴进 html: [html] view plain copy <span style="white-space:pre"> </span><a ...

  3. poj_1151 线段树

    题目大意 在平面上给定n个矩形,可以相互覆盖全部或者部分,求出矩形占据的总面积. 题目分析 将矩形按照x方向的进行分割之后,将平面沿着y方向划分一系列单元(不定高度),每个矩形在y方向上占据若干连续的 ...

  4. 【WebService】快速构建WebService示例

    package com.slp.webservice; import javax.jws.WebService; /** * Created by sanglp on 2017/2/25. * 接口 ...

  5. JS-随机div颜色

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. jQuery回溯

    1.jQuery有个很好用的方法是 end(); 2.在进行链式操作时,使用end方法,可以回溯到上一个jQuery对象. 3.实现原理: jQuery内部有一个对象栈,当形成新的对象时,会将新对象推 ...

  7. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  8. 【黑金ZYNQ7000系列原创视频教程】07.自定义IP——定制RTC IP实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36641&extra=page%3D1 爱奇艺地址: http: ...

  9. DG快照备库

    1.使用快照先决条件:主备库开启闪回功能 2.把备库转为快照库 DGMGRL> convert database satest to SNAPSHOT STANDBY; Converting d ...

  10. angular -- get请求该如何使用?

    在做 angualr 的开发过程中,经常会用到的就是 ajax 请求.下面是 get 请求示例: 如果存在多个 get 请求可以考虑进行封装下: // get 携参数访问 ajaxGet(getUrl ...