夜深了,写了个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 ...
随机推荐
- Javascript写入txt和读取txt文件的方法
文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...
- 剑指Offer-【面试题04:替换空格】
package com.cxz.question4; /* * 请实现一个函数,把字符串中的每个空格替换成"%20",例如"We are happy.",则输出 ...
- CSS中使用text-transform实现首字母大写
CSS中首字母大写怎么实现?日常生活中需求方对英文的要求比较多,有的时候需要让英文单词或拼音首个字母大写;有的时候需要让全文中英文单词全大写或小写.这时候我们就需要text-transform属性了. ...
- git使用
1.权限校验 首先,您的数据保存在远端服务器一份,服务器需要对您的身份进行识别,一段RAS加密字串, 启动GUI,step1:创建秘钥,generate SSHkey. step2:添加密钥:去你的代 ...
- 多线程之互斥锁(By C++)
首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...
- java.lang.IllegalStateException: Web app root system property already set to different value
webAppRootKey是在java web项目的web.xml配置文件中表示项目的唯一标示,在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过log4j日志的方 ...
- SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称
SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称 原来数据库名称为 aa,物理文件名称为 aa.mdf 和 aa_log.ldf: 需要修改数据库名称为 bb,物理文件名 ...
- yarn关于app max attempt深度解析,针对长服务appmaster平滑重启
在YARN上开发长服务,需要注意fault-tolerance,本篇文章对appmaster的平滑重启的一个参数做了解析,如何设置可以有助于达到appmaster平滑重启. 在yarn-site.xm ...
- < meta > 元素
< meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 we ...
- js 逻辑或
逻辑或操作符由两个竖线来表示||,属于短路操作符,也就是说,如果第一个操作数的求职结果为true,就不会对第二个操作数进行求值 var found = true; var result = found ...