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

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

一、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. iOS 数据类型转换

    1.NSString转化为UNICODE String:(NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname c ...

  2. UVa 130 - Roman Roulette

    模拟约瑟夫环  Roman Roulette  The historian Flavius Josephus relates how, in the Romano-Jewish conflict  o ...

  3. Android 简单案例:onSaveInstanceState 和 onRestoreInstanceState

    import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widg ...

  4. HFS的远程命令执行漏洞(RCE)

    一.HFS漏洞 1.影响版本 : 2.3c以前的2.3x版本 2.HFS: HFS是HTTP File Server,国外的一款HTTP 文件服务器软件,简单易上手. 3.漏洞描述: HTTP Fil ...

  5. IIS 无法访问.net的动态文件

    编译器错误消息:CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319... 在“c:\windows\temp”这个文件夹添 ...

  6. 新浪通过API分享 实践

    注:如果集成了百度的Frontia和SinaCoreSDK, 那么SSO会出现包冲突 https://github.com/sinaweibosdk/weibo_android_sdk/issues/ ...

  7. SpringMVC XXX-servlet.xml ApplicationContext.xml

    因为直接使用了SpringMVC,所以之前一直不明白xxx-servlet.xml和applicationContext.xml是如何区别的,其实如果直接使用SpringMVC是可以不添加applic ...

  8. log file sync 事件(转)

    log file sync   log file sync等待时间发生在redo log从log buffer写入到log file期间. 下面对log file sync做个详细的解释.   何时发 ...

  9. [Android Tips] 30.如何在 Android Studio 中一次性格式化所有代码

    在目录上面右击,有 Reformat Code Ctrl + Alt + L 参考 如何在IntelliJ IDEA或Android Studio中一次性格式化所有代码?

  10. PL/SQL编程基础(一):PL/SQL语法简介(匿名PL/SQL块)

    PL/SQL PL/SQL是Oracle在关系数据库结构化查询语言SQL基础上扩展得到的一种过程化查询语言. SQL与编程语言之间的不同在于,SQL没有变量,SQL没有流程控制(分支,循环).而PL/ ...