夜深了,写了个JQuery的省市区三级级联效果
刚刚练手的JQuery,希望大神们指正
主要实现以下功能:
1、三级菜单级联加载数据
2、可以在不操作脚本的情况下,给元素加属性实现级联功能
3、自定义动态显示数据
咨询问题:
对于一般比较固定不变的数据,是不是应该生成静态的文件,直接加载整个数据文件,访问文件比较好?还是这样动态的访问比较好?
一般的数据文件,小的会在50k,大的会在3M
这个可以讨论下
/**
省市区县级联
*/
(function($){ /*
*
*获取ele的相对元素
*
**/
function CssFirstElement(ele, css) {
ele = $(ele);
if (!ele) {
var event = event ? arguments[0] : window.event;
ele = event.srcElement ? event.srcElement : event.target;
ele = $(ele);
}
var targetInpage; if ((typeof css == 'string') && css.constructor == String && css.substr(0, "css:#".length) == "css:#") {
//以css:# 开头,是一个ID选择器
targetInpage = $( $(css.substring(4))[0] );
} else if ((typeof css == 'string') && css.constructor == String && css.substr(0, "css:".length) == "css:") {
//以css: 开头,是一个基于元素的父级元素
var css0 = css.substring(4);
if (css0.split(' ').length==1) {
var parentCss = css0.substring(0, css0.indexOf(' '));
var eleCss = css0.substring(css0.indexOf(' ')).replace(/(^\s*)|(\s*$)/g, "");
targetInpage = ele.parents(eleCss + ":first");
} else {
var parentCss = css0.substring(0, css0.indexOf(' '));
var eleCss = css0.substring(css0.indexOf(' ')).replace(/(^\s*)|(\s*$)/g, "");
targetInpage = ele.parents(parentCss+":first").find(eleCss);
} } else if ((typeof css == 'string') && css.constructor == String) {
targetInpage = $(css);
} else {
//对象直接返回
return [];
} return targetInpage.length > 0 ? $(targetInpage.get(0)) : [];
}
function SelectData(element) {
this.element = element;//元素
this.optionUrl = element.attr("data-optionUrl");//加载选项的url
this.defaultValue = element.attr("data-defaultValue");//加载选项试的默认值
this.display = element.attr("data-display");//返回对象的 option 显示的键
this.value = element.attr("data-value");//返回对象的 option 绑定的键
this.changeTarget = CssFirstElement(element, element.attr("data-changeTarget"));//元素选择改变后,触发目标元素重新加载选项
this.showAll = element.attr("data-showAll");//是否显示全部选项
this.immediately = element.attr("data-immediately");//是否立即加载选项
this.param = element.attr("data-param");//请求时携带的参数
//有需要触发改变选项的目标,就添加change事件,触发目标请求时,携带的参数
if (this.changeTarget.length > 0) {
this.element.on("change.selectDataFill",$.proxy(this.changeEvent,this));
}
this.element.data("SelectDataFillObj",this);
}
SelectData.prototype = {
changeEvent: function () {
this.changeTarget.attr("data-param",
this.element.get(0).name + "=" + this.element.get(0).value);
this.changeTarget.data("SelectDataFillObj").empty(); var targetW=this.changeTarget;
while (true) {
targetW = targetW.data("SelectDataFillObj").changeTarget;
if (targetW && targetW.length>0) {
targetW.data("SelectDataFillObj").empty();
} else {
break;
}
}
this.changeTarget.data("SelectDataFillObj").LoadData();
},
empty: function () {
this.element.empty();
if (this.showAll) {
$("<option value=\"\">全部</option>").appendTo(this.element);
}
},
FillDataSuccess: function (data) {
debugger;
var element = this.element;
this.empty(); for (var i = 0; i < data.list.length; i++) {
var item = data.list[i];
$("<option value=\"" + item[this.value] + "\" " +
(item[this.value] == this.defaultValue ? "selected" : "") + ">" +
item[this.display] + "</option>").appendTo(element);
}
if (this.element.val()!='') {
this.element.trigger("change.selectDataFill");
}
},
LoadData: function () {
$.getJSON(this.optionUrl,this.element.attr("data-param")).success($.proxy(this.FillDataSuccess, this));
}
};
$.fn.SelectDataFill = function () { this.each(function (index, element) { var element = $(element);
var obj = new SelectData(element);
if (obj.immediately) {
obj.LoadData();
} }); } })(jQuery);
应用:
<td colspan="3">
<select name="ProvinceId"
data-optionUrl="/BasicPlugin/Area/ProvinceJson"
data-defaultValue="3"
data-display="Name"
data-value="Id"
data-changeTarget="css:td select[name=CityId]"
data-showAll="true"
data-immediately="true">
<option value="">请选择</option>
</select>
<select name="CityId"
data-optionUrl="/BasicPlugin/Area/CityJson"
data-defaultValue="1"
data-display="Name"
data-value="Id"
data-changeTarget="css:td select[name=DistrictId]"
data-showAll="true">
<option value="">请选择</option>
</select>
<select name="DistrictId"
data-optionUrl="/BasicPlugin/Area/DistrictJson"
data-defaultValue="1"
data-display="Name"
data-value="Id"
data-changeTarget="css:td select[name=StreetId]"
data-showAll="true">
<option value="">请选择</option>
</select>
<select name="StreetId"
data-optionUrl="/BasicPlugin/Area/StreetJson"
data-defaultValue="1"
data-display="Name"
data-value="Id"
data-showAll="true">
<option value="">请选择</option>
</select>
</td>
以上代码中的请求路径,如 /BasicPlugin/Area/StreetJson 返回的json格式为:
{
list:[
{ID:1,Name:"名称",Code:"001"},
{ID:1,Name:"名称",Code:"001"}
]
}
效果如下:

一级选择改变,相关联的均重新加载数据,如果加载项中有默认值,则会选中默认值
暂时公开访问地址可以看到效果:
http://uiprogrammer.sxxxt.cn/Home/Index
夜深了,写了个JQuery的省市区三级级联效果的更多相关文章
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
[C#]使用 C# 代码实现拓扑排序 目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...
- 使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能 要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下 ...
- 项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)
1. 前台客户登录 2. Jquery citypicker省市区三级联动插件 3. 百度地图介绍 4. 业务受理(在线下单) 1 实现前台系统登录功能 1.1 Md5加密 admin(明文)---- ...
- JQuery+Json 省市区三级联动
一.画面以及JS <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content=&qu ...
- 【JavaScript&jQuery】省市区三级联动
HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...
- Ajax来实现下拉框省市区三级联动效果(服务端基于express)
//服务端JS代码: //提供服务端的处理 const express = require('express'); const fs = require('fs'); const app = expr ...
- 用php+mysql+ajax+jquery做省市区三级联动
要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下拉跟着变化,市级下拉变化时区下拉跟着变化. 使用chinastates ...
- jquery全国省市区三级联动插件distpicker
使用步骤: 1.引入js <script src="distpicker/jquery.min.js" type="text/javascript" ch ...
- js&&jQuery实现省市区三级联动
代码参考了:https://codepen.io/anon/pen/WzyNQB;根据自己的需要修改了一下,挂个出处 1.前端页面代码 <html> <head> <me ...
随机推荐
- node.js express架构安装部署
安装-g:表示全局安装(必须以安装node.js) npm install -g express-generator 创建一个express架构的项目文件夹express testWebApp 在pa ...
- PyQt5+Python3.5.2-32bit开发环境搭建
1.基本环境. Window 8.1 64bit Python3.5.2-32bit.exe PyQt5 2.安装python. 去官网下载32位版本的python3.5.2(就是x86那个) 备 ...
- 教你实践ASP.NET Core Authorization
本文目录 Asp.net Core 对于授权的改动很友好,非常的灵活,本文以MVC为主,当然如果说webapi或者其他的分布式解决方案授权,也容易就可以实现单点登录都非常的简单,可以使用现成的Iden ...
- LinkedHashMap源码阅读笔记(基于jdk1.8)
LinkedHashMap是HashMap的子类,很多地方都是直接引用HashMap中的方法,所以需要注意的地方并不多.关键的点就是几个重写的方法: 1.Entry是继承与Node类,也就是Linke ...
- C++模板分离
在正常情况下,c++模板是不允许在头文件声明,在cpp文件中实现.那是因为在cpp文件在编译时内存必须要给它分配储存空间.但是模板本身是一种泛型,在没有明确定义声明类型前,编译器也无法知道它的大小.所 ...
- 基于暗通道优先算法的去雾应用(Matlab/C++)
基于暗通道优先的单幅图像去雾算法(Matlab/C++) 算法原理: 参见论文:Single Image Haze Removal Using Dark Channel Pri ...
- 根据oracle的主键列生成SQLserver的主键
根据oracle的主键列生成MsSQLServer的主键列 select 'alter table ' || cu.table_name ||' add constraint '||' PK_' ...
- LNMP虚拟机开发环境配置--vagrant+virtualbox+ubuntu14.04
工作一直用的是别人打包好的虚拟机开发环境,感觉确实很酷.所以准备自己配个开发环境,为之后自己开发一些有趣的东西做准备. ok,开始~~~ 一.安装软件 vagrant和virtualbox 此处需注意 ...
- tornado学习笔记19 Tornado框架分析
19.1 Http服务器请求处理流程图 (1) 调用HTTPServer的bind方法,绑定Socket的监听端口号: (2) 调用HTTPServer的listen方法,初始化一个listen so ...
- warning C4996: 'sprintf': This function or variable may be unsafe
选项Project | Configuration Properties | C/C++ | Preprocessor | Preprocessor Defin ...