第八篇 一个用JS写的省市县三级联动
前些天,做网站用需要用到一个省市县的三级联动,数据要从数据库里面读取,我想了下思路,动手写了下来。
一、思路
js利用Ajax读取控制器里面的函数,利用函数读取存储过程,返回json。利用JS处理Json构建数组,利用索引加载到下拉菜单中
二、具体实现
1、数据库的设计(数据是提前设计好的,只能对现有的数据库进行编写)
编写存储过程如下SQL:
ALTER PROCEDURE [dbo].[getstatisticProvince] AS BEGIN SELECT RegionCode ,Province,CITY,TOWN FROM [dbo].[Region] END
2、调用存储过程这里省略
3、前台页面(页面的ID要和Js里面的Id值对应)
<tr>
<th>
<label class="col-lg-3 control-label">所在省:</label>
</th>
<th>
<select class="form-control input-sm" id="sProvince" name="sProvince">
</select>
</th>
<th>
<label class="col-lg-3 control-label">所在市:</label>
</th>
<th>
<select class="form-control input-sm" id="sCity" name="sCity">
</select>
</th>
<th>
<label class="col-lg-3 control-label">所在区:</label>
</th>
<th>
<select class="form-control input-sm" id="sTown" name="sTown">
</select>
</th>
<th>
<input type="text" id="txtregion" style="display: none" name="RegionCode"/>
</th>
</tr>
4、js处理代码
function Dsy() {
this.Items = {};
}
var temp = new Dsy();
Dsy.prototype.add = function (id, iArray) {
if (iArray["Province"] != "") {
if (this.Exists(id)) {
this.Items[id] = this.Items[id] + "," + JSON.stringify(iArray);
} else {
this.Items[id] = JSON.stringify(iArray);
}
}
};
Dsy.prototype.Exists = function(id) {
if (typeof(this.Items[id]) == "undefined") return false;
return true;
};
function change(v) {
var str = "province";
for (i = 0; i < v; i++) {
str = document.getElementById(s[i])[document.getElementById(s[i]).selectedIndex].text;
}
var ss = document.getElementById(s[v]);
with (ss) {
length = 0;
options[0] = new Option(opt0[v], '3537');//添加空时的ID
if (v == 1) {
options[0] = new Option(opt0[v], document.getElementById(s[0])[document.getElementById(s[0]).selectedIndex].value);
}
else if (v == 2) {
options[0] = new Option(opt0[v], document.getElementById(s[1])[document.getElementById(s[1]).selectedIndex].value);
}
if (v && document.getElementById(s[v - 1]).selectedIndex > 0 || !v) {
if (dsy.Exists(str)) {
ar = eval("["+dsy.Items[str]+"]");
for (i = 0; i < ar.length; i++) {
if (v == 0) {
options[length] = new Option(ar[i]["Province"], ar[i]["RegionCode"]);
}
else if (v == 1) {
if (ar[i]["CITY"] != document.getElementById(s[1])[document.getElementById(s[1]).length-1].text) {
options[length] = new Option(ar[i]["CITY"], ar[i]["RegionCode"]);
}
} else {
if (ar[i]["TOWN"]!="")
options[length] = new Option(ar[i]["TOWN"], ar[i]["RegionCode"]);
}
}
if (v)options[0].selected = true;
}
}
if (++v < s.length) {change(v);}
}
}
var dsy = new Dsy();
var s = ["sProvince", "sCity", "sTown"];//id对应到前台页面
var opt0 = ["省份", "地级市", "市、县级市、县"];
function SetDsy(code) {
var province;
$.ajax({
url: '/JobInfo/GetJson',//目标路径函数
type: 'GET',
dataType: 'json',
timeout: 10000,
cache: false,
success: function (data) {
province = eval(data);
for (i = 0; i < province.length; i++) {
if ((province[i]["CITY"] == "" || province[i]["CITY"] == null) && (province[i]["TOWN"] == "" || province[i]["TOWN"] == null) && province[i]["Province"]!=null) {
dsy.add("province", province[i]);
} else if (province[i]["TOWN"] == "") {
dsy.add(province[i]["Province"], province[i]);
} else {
dsy.add(province[i]["CITY"], province[i]);
}
}
//dsy.add("province", rPro);
for (i = 0; i < s.length - 1; i++) {
SetEvent(i);
document.getElementById(s[i]).onchange = new Function("change(" + (i + 1) + ");");
}
SetEvent(2);
change(0);
if (code != "") {
GetIndex(code);
}
}
});
}
function SetEvent(i) {
$("#"+s[i]).change(function () {
$("#txtregion").val(this.value);
});
}
//修改时候选择当前ID下面对应的值
function GetIndex(code) {
$.ajax({
url: '/JobInfo/GetQuery',
type: 'GET',
data: { code: code },//$("#txtregion").val(),
dataType: 'json',
timeout: 10000,
cache: false,
success: function(data) {
var Pro = eval("[" + dsy.Items["province"] + "]");
for (i = 0; i < Pro.length; i++) {
if (Pro[i]["Province"] == data[0]["Province"]) {
$("#" + s[0])[0][i + 1].selected = true;
change(1);
break;
}
}
var city = eval("[" + dsy.Items[data[0]["Province"]] + "]");
for (i = 0; i < city.length; i++) {
if (city[i]["CITY"] == data[0]["CITY"]) {
$("#" + s[1])[0][i + 1].selected = true;
change(2);
break;
}
}
var town = eval("[" + dsy.Items[data[0]["CITY"]] + "]");
for (i = 0; i < town.length; i++) {
if (town[i]["TOWN"] == data[0]["TOWN"]) {
$("#" + s[2])[0][i + 1].selected = true;
break;
}
}
}
});
}
新手发帖,多多关照,有兴趣加群
IT项目
324110381
第八篇 一个用JS写的省市县三级联动的更多相关文章
- js实现的省市县三级联动的最新源码
<!DOCTYPE html> <html> <head> <title>省市区三级联动</title> <!-- 直接使用QQ的省市 ...
- 省市县三级联动js代码
省市县三级联动菜单,JS全国省市县(区)联动代码,一般可以用于用户注册或分类信息二手交易网站,需要的朋友直接复制代码就可以用了,不过有朋友反馈说缺少某些城市,具体缺少哪个尚不知,请想用的朋友自己补全吧 ...
- 第二十八篇:关于node.js连接数据库
好家伙,这个不难,但是也不简单. $ cnpm install mysql 教程里是带美元符的,但是我打的时候加上美元符用不了,所以我就没用美元符了,一样能行. 还有,淘宝镜像,yyds, var m ...
- 移动端纯原生JS不依赖ajax后台服务器实现省市县三级联动
最近好多天没有更新文章,是因为公司的项目忙的不行.今天有点时间,就突然想起在移动端项目中遇到三级联动的问题,网上查了很多资料,都是依赖各种插件,或者晦涩难于理解.于是,自己决定写一个出来. 当然,没有 ...
- 一个用js写的接口http调试程序
公司有非常多手机app的项目.手机app又要常常訪问后台提交与查询数据. 所曾经端app与后台的开发与測试过程中接口调试是一个常常要做的工作. 而每当出现一个BUG,前端appproject师与后台p ...
- 一个原生js写的加减乘除运算
根据我的经验我说的再多也没人看,不过还是简单介绍下效果吧,可以选择+,-,*,/,去计算数据,喜欢的话就粘贴复制自己看去吧! <!DOCTYPE html PUBLIC "-//W3C ...
- JS 省市县三级联动
$(".area").change(function(ent,arg){ var $this = $(this), level = $(this).attr("id&qu ...
- 用jquery写的json省市县三级联动下拉
<form action="#" name="myform"> <label>省</label><select nam ...
- 使用php ajax写省、市、区、三级联动
题目要求: 要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下拉跟着变化,市级下拉变化时区下拉跟着变化. 使用china ...
随机推荐
- JMeter使用代理录制脚本
用JMeter做接口测试,有时候接口数量比较多,用录制方式可以节省很多时间,录制接口可以配合badboy使用,但是badboy访问的浏览器是基于ie6的,基本上现在的网站不会对ie6做兼容了,使用代理 ...
- windows中如何查看某个端口被谁占用
说明:本人操作系统为win7 x64,文章转自http://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html,加上本人的注释. 开始--- ...
- cocharan-Armitage trend test
Cochran-Armitage trend test是我们常说的趋势卡方检验,一般是针对基因型的2*3列联表的.譬如说三种基因型,如果按照某一个allele来看,可以有0.1.2个拷贝,是有序的,我 ...
- 日期、时间选择器(DatePicker和TimePicker)的功能与用法
DatePicker和TimePicker是两个比较易用的控件,它们都从FrameLayout派生而来,其中DatePicker供用户选择日期:而TimePicker则供用户选择时间. DatePic ...
- Android中SharedPreferences介绍和使用方法
1.SharedPreferences简介 为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使 ...
- HDU3410(单调队列)
Passing the Message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- iOS initWithFrame、initWithCoder、awakeFromNib的区别解析
当我们需要自定义一个View控件时,会有 initWithFrame.initWithCoder.awakeFromNib 这三个系统方法,关于这三个方法何时调用,如何调用,有时候可能很多人会弄混淆. ...
- [html5] 学习笔记-表单新增的元素与属性(续)
本节主要讲解表单新增元素的controls属性.placeholder属性.List属性.Autocomplete属性.Pattern属性.SelectionDirection属性.Indetermi ...
- We Chall-Encodings: URL -Writeup
MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...
- GIS制图人员的自我修养(2)--制图意识
GIS制图人员的自我修养(2)--制图意识 by 李远祥 上次提及到GIS制图人员的一些制图误区,主要是为GIS制图人员剖析在制图工作中的一些问题.但如何提高制图的自我修养,却是一个非常漫长的过程,这 ...