刚刚练手的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的省市区三级级联效果的更多相关文章

  1. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  2. 使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能

    使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能 要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下 ...

  3. 项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)

    1. 前台客户登录 2. Jquery citypicker省市区三级联动插件 3. 百度地图介绍 4. 业务受理(在线下单) 1 实现前台系统登录功能 1.1 Md5加密 admin(明文)---- ...

  4. JQuery+Json 省市区三级联动

    一.画面以及JS <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content=&qu ...

  5. 【JavaScript&jQuery】省市区三级联动

    HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...

  6. Ajax来实现下拉框省市区三级联动效果(服务端基于express)

    //服务端JS代码: //提供服务端的处理 const express = require('express'); const fs = require('fs'); const app = expr ...

  7. 用php+mysql+ajax+jquery做省市区三级联动

    要求:写一个省市区(或者年月日)的三级联动,实现地区或时间的下拉选择. 实现技术:php ajax 实现:省级下拉变化时市下拉区下拉跟着变化,市级下拉变化时区下拉跟着变化. 使用chinastates ...

  8. jquery全国省市区三级联动插件distpicker

    使用步骤: 1.引入js <script src="distpicker/jquery.min.js" type="text/javascript" ch ...

  9. js&&jQuery实现省市区三级联动

    代码参考了:https://codepen.io/anon/pen/WzyNQB;根据自己的需要修改了一下,挂个出处 1.前端页面代码 <html> <head> <me ...

随机推荐

  1. Javascript写入txt和读取txt文件的方法

    文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...

  2. 剑指Offer-【面试题04:替换空格】

    package com.cxz.question4; /* * 请实现一个函数,把字符串中的每个空格替换成"%20",例如"We are happy.",则输出 ...

  3. CSS中使用text-transform实现首字母大写

    CSS中首字母大写怎么实现?日常生活中需求方对英文的要求比较多,有的时候需要让英文单词或拼音首个字母大写;有的时候需要让全文中英文单词全大写或小写.这时候我们就需要text-transform属性了. ...

  4. git使用

    1.权限校验 首先,您的数据保存在远端服务器一份,服务器需要对您的身份进行识别,一段RAS加密字串, 启动GUI,step1:创建秘钥,generate SSHkey. step2:添加密钥:去你的代 ...

  5. 多线程之互斥锁(By C++)

    首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...

  6. java.lang.IllegalStateException: Web app root system property already set to different value

    webAppRootKey是在java web项目的web.xml配置文件中表示项目的唯一标示,在Eclipse调试Web项目时,项目的路径是一个临时路径,不在真正的路径下,可以通过log4j日志的方 ...

  7. SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称

    SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称   原来数据库名称为 aa,物理文件名称为 aa.mdf 和 aa_log.ldf:   需要修改数据库名称为 bb,物理文件名 ...

  8. yarn关于app max attempt深度解析,针对长服务appmaster平滑重启

    在YARN上开发长服务,需要注意fault-tolerance,本篇文章对appmaster的平滑重启的一个参数做了解析,如何设置可以有助于达到appmaster平滑重启. 在yarn-site.xm ...

  9. < meta > 元素

    < meta > 元素 概要 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 we ...

  10. js 逻辑或

    逻辑或操作符由两个竖线来表示||,属于短路操作符,也就是说,如果第一个操作数的求职结果为true,就不会对第二个操作数进行求值 var found = true; var result = found ...