JS地址自动返填技术
系统设计地址为省市县三级联动,规范是规范了,但是无形中增加了系统操作的时间成本,因此设计地址自动返填技术,只要把地址拷贝到详细地址框中,可以自动返填到省市县三级联动的下拉框中。
还好洒家的大学不是混过来的,写起这个模块来感觉饶有趣味。
一、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地址自动返填技术的更多相关文章
- JS 获取和返填单选按钮Value值
1.获取Radio值 $('input[name="sex"]:checked ').val(); 2.返填Radio值 $('input[name="sex" ...
- 分享:根据webservice WSDL地址自动生成java调用代码及JAR包
分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...
- 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...
- JavaScript实现http地址自动检测并添加URL链接
一.天生我材必有用 给http字符自动添加URL链接是比较常见的一项功能.举两个我最近常用到的自动检测http://地址并添加链接的例子吧,首先是QQ邮箱,在使用QQ邮箱时,如果输入了URL地址(ht ...
- JS图片自动和可控的轮播切换特效
点击这里查看效果:http://hovertree.com/texiao/js/1.htm HTML文件代码如下: <!DOCTYPE html> <html xmlns=" ...
- JS实现自动倒计时
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
- JavaScript实现url地址自动检测并添加URL链接示例代码
写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签,下面是具体的实现,感兴趣的朋友不要错过 背景:写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签. 实现代码: 复制代码代码如 ...
- JS图片自动或者手动滚动效果(支持left或者up)
JS图片自动或者手动滚动效果(支持left或者up) JS图片自动或者手动滚动效果 在谈组件之前 来谈谈今天遇到搞笑的事情,今天上午接到一个杭州电话 0571-28001187 即说是杭州人民法院的 ...
随机推荐
- final,finally,finalize的区别
1.final用于声明属性.方法和类,分别表示属性不可变.方法不可覆盖,类不可继承: 2.finally是异常处理语句结构的一部分,表示总是执行代码块: 3.finalize是Object类的一个方法 ...
- 硝烟中的Scrum和XP-我们如何实施Scrum 12)发布计划 13)组合XP
12 怎样制定发布计划, 处理固定价格的合同 一次只计划一个sprint的事情会显得提前量不足, 提前做计划是个好习惯; 尤其是签了固定价格的合同之后, 不得不预先计划好, 防止无法按期交付的危险情况 ...
- Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法
Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法http://www.cnblogs.com/cat-l ...
- hihocoder [Offer收割]编程练习赛14 小Hi和小Ho的礼物
题目1 : 小Hi和小Ho的礼物 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 某人有N袋金币,其中第i袋内金币的数量是Ai.现在他决定选出2袋金币送给小Hi,再选2袋 ...
- 1.执行环境判断 window 或 self
window or self ? 在 underscore 的判断所处环境的代码中,似乎我们没有看到 window 对象的引用,其实,在浏览器环境下,self 保存的就是当前 window 对象的引用 ...
- 【Mac】Docker安装及基础使用
Docker 安装 在 Mac OS X 系统中,首先你要下载安装包安装:Docker Toolbox 安装过程中,可以选择是否安装 Docker Machine,Docker Compose 等,默 ...
- KM算法(最优匹配)
hdu2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- postgresql----唯一索引,表达式索引,部分索引
一.唯一索引 唯一索引字面上理解就是在索引上增加唯一约束,不允许出现索引值相同的行,目前只有Btree索引可以声明唯一索引,唯一键会自动创建唯一索引. 测试表: test=# create table ...
- C++程序风格的思考
转载自:http://www.cppblog.com/weiym/archive/2013/04/27/199781.html 发现厚积薄发中有很多值得学习的东西 故引用之: 最近有机会看号称是公司最 ...
- pta 习题集 数列求和-加强版
给定某数字AA(1≤A≤91≤A≤9)以及非负整数NN(0≤N≤1000000≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯AS=A+AA+AAA+⋯+AA⋯A(NN个AA).例如A ...