在博客园看到一篇不错的AJAX级联下拉列表,觉得不错,特地拿下来 :转载来自:『大雪无痕』 ,原文地址

 //当一个 下拉列表 改变时,触发所有联动;(警告:各下拉列表之间 请不要出现 循环依赖)
//本函数,遵守如下规范:不使用任何内存数据(所有数据都是 即时使用,即时获取,数据实时),不初始化注册,
//该规范可以在 HTML 出现任何意外时,保持最好的稳定
function RefreshLinkage(ddlCtrl) {
var curId = !ddlCtrl ? "" : ddlCtrl.id;
//if (curId == undefined || curId.replace(" ","").length <= 0) return; //不指定刷新控件,则刷新所有控件
//var curValue = ddlCtrl.value; //只要触发之后,让子控件自己寻找需要的值:不需要当前值 if (curId && ddlCtrl) {
var hfValueCtrlId = $(ddlCtrl).attr("valueCtrlId");
if (!hfValueCtrlId) hfValueCtrlId = "hf_" + curId;
$("#" + hfValueCtrlId).val($(ddlCtrl).val());
} $("select").each(function (index, elem) {
if (!curId || elem.id != curId) { //全部刷新 或者 不联动自己
var parentId = $(elem).attr("parentId");
if (parentId != undefined && ("" + parentId).replace(" ", "").length > ) {
var parentIds = parentId.split(','); //分割父级Id
if (!curId || parentIds.indexOf(curId) >= ) { //如果某个控件被当前控件联动
//操作 联动子控件
refreshOptions(elem);
}
}
}
}); //刷新 指定的下拉列表
function refreshOptions(elem) {
if (!elem || !elem.id) return; var parentId = $(elem).attr("parentId");
var parentKey = $(elem).attr("parentKey");
if (!parentId || !parentKey) return; var parentIds = parentId.split(',');
var parentKeys = parentKey.split(','); if (parentKeys.length != parentIds.length)
throw new Error("Linkage Select \"" + elem.id + "\": 'ParentKey' And 'ParentId' Length Is Not Same!"); var elemValueId = $(ddlCtrl).attr("valueCtrlId");
if (!elemValueId) elemValueId = "hf_" + elem.id; //清空下拉列表
if ($(elem).find("option").length > )
$("#" + elemValueId).val('');
$(elem).find("option").remove(); //创建默认行
var withEmpty = $(elem).attr("withEmpty") != "false";
var emptyValue = ($(elem).attr("emptyValue") || '');
var emptyText = ($(elem).attr("emptyText") || ((GetSettingValue("IsEnglish", true)) ? "Please Select" : "请选择"));
if (withEmpty) {
$(elem).append("<option value='{V}'>{T}</option>".replace("{V}", emptyValue).replace("{T}", emptyText));
} //需要的数据
var parentIsEmpty = true;
var jsonStr = "{ \"__Action\":\"RefreshSelect\", \"__SelectCtrl\":\"" + elem.id + "\", ";
for (var j = ; j < parentKeys.length; j++) {
var parentValue = ($("#" + parentIds[j]).val() || '');
jsonStr = jsonStr + "\"" + parentKeys[j] + "\":\"" + parentValue + "\"" + (j == parentKeys.length - ? "" : ", ");
if (parentValue && parentValue != emptyValue) parentIsEmpty = false;
}
jsonStr = jsonStr + "}"; //如果所有父级都没有数据 则 不进行 Ajax
if (parentIsEmpty) return; //Ajax提交
var jsonData = JSON.parse(jsonStr);
var postUrl = ($(elem).attr("postUrl") || (window.location.href)); //没有指定 Post地址,则 指向 自身页面
postUrl = postUrl + (postUrl.indexOf("?") >= ? ("&_rd=" + Math.random()) : ("?_rd=" + Math.random())); //防止缓存
$.post(postUrl, jsonData,
function (data, status) {
//alert("Data: " + data + "\nStatus: " + status);
if (data != undefined && data.length > ) {
//动态获取的行
var optionTemp = ($(elem).attr("optionTemp") || "<option value='{V}'>{T}</option>");
$.each(data, function (itemIndex, itemElem) {
var html = perfectExpres(optionTemp, itemElem);
$(elem).append(html);
}); //用隐藏控件的值赋给 下拉列表控件
var $valueCtrl = $("#" + elemValueId);
if($valueCtrl.length>)
$(elem).val($valueCtrl.val()); //触发这个被改变的 下拉列表的改变事件
RefreshLinkage(elem);
}
}, "json");
} //循环 object 中的所有属性,替换 expres 中,对应的部分;
function perfectExpres(expres, object) {
for (var key in object) {
expres = expres.replace("{" + key + "}", (object[key] || ''));
}
return expres;
}
}

转:『代码』JS封装 Ajax级联下拉列表的更多相关文章

  1. 使用原生JS封装Ajax

    使用原生 的JS封装 Ajax,实现 仿JQuery的Ajax,post,get三种异步请求方式: var MAjax = { //根据浏览器创建异步对象 createXhr: function () ...

  2. 原生js封装ajax代码

    方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...

  3. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  4. 原生JS封装ajax方法

    http://blog.sucaijiayuan.com/article/89 jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只 ...

  5. js封装ajax的方法

    常用的ajax请求方法封装 /** * ajax请求的封装代码 */ function ajaxPost(url, params, cb) { $.ajax({ type : 'post', url ...

  6. ajax 原生js封装ajax [转]

    /* 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @ ...

  7. js封装ajax

    //封装ajax function ajax(obj) { //创建xhr对象; var xhr = new XMLHttpRequest(); obj.method = obj.method.toU ...

  8. 原生js封装ajax:传json,str,excel文件上传表单提交

    由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...

  9. 原生js封装ajax,深入理解$.ajax()

    直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...

随机推荐

  1. Spark的部署方式

    1.Spark的应用程序部署 2.Spark的集群部署

  2. thinking in java Generics Latent typing

    The beginning of this chapter introduced the idea of writing code that can be applied as generally a ...

  3. jquery-ui 之droppable详解

    <div class="special">drop me</div> <div class="drag-box"> < ...

  4. ASP .Net提交时禁用Button

    转自:http://gaterking.blog.51cto.com/69893/301691/ 今天遇到一种小情况,想要在.net的服务器控件asp:button按下去时通过OnClientClic ...

  5. C#.NET数据库访问类DBHelper

    这是一个与C# .NET通用的数据库访问类,包含了工厂模式.事务处理等安全机制. 调用方式: DBHelper db = new DBHelper(); DbCommand cmd = db.GetS ...

  6. Struts数据效验

    表单数据的验证: 前台验证:主要是通过JS验证, 表达数据是否合法! 后台验证:通过后台java代码进行验证! Struts也提供了数据效验的方式! Struts数据效验, 通过拦截器完成: < ...

  7. 实战:ORACLE SQL Performance Analyzer

    通过 SPA,您能够依据各种更改类型(如初始化參数更改.优化器统计刷新和数据库升级)播放特定的 SQL 或整个 SQL 负载,然后生成比較报告,帮助您评估它们的影响. 在 Oracle Databas ...

  8. 逗号分隔字符串转换为一张表--解决查询in(逗号分隔字符串)出错问题

    CREATE PROCEDURE [dbo].[Pro_TEST] AS BEGIN ) ) SET @split=',' SET @c='025,023,014,015' )) ) BEGIN IN ...

  9. 数据库中DDL、DML、DCL和TCP概念

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  10. SICP 习题 (1.14)解题总结

    SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...