转:『代码』JS封装 Ajax级联下拉列表
在博客园看到一篇不错的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级联下拉列表的更多相关文章
- 使用原生JS封装Ajax
使用原生 的JS封装 Ajax,实现 仿JQuery的Ajax,post,get三种异步请求方式: var MAjax = { //根据浏览器创建异步对象 createXhr: function () ...
- 原生js封装ajax代码
方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...
- 原生JS封装Ajax插件(同域&&jsonp跨域)
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...
- 原生JS封装ajax方法
http://blog.sucaijiayuan.com/article/89 jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只 ...
- js封装ajax的方法
常用的ajax请求方法封装 /** * ajax请求的封装代码 */ function ajaxPost(url, params, cb) { $.ajax({ type : 'post', url ...
- ajax 原生js封装ajax [转]
/* 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @ ...
- js封装ajax
//封装ajax function ajax(obj) { //创建xhr对象; var xhr = new XMLHttpRequest(); obj.method = obj.method.toU ...
- 原生js封装ajax:传json,str,excel文件上传表单提交
由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...
- 原生js封装ajax,深入理解$.ajax()
直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...
随机推荐
- Sublime Text 2结合VS2010配置C C++编译
本文参考以下文章 特此谢谢 http://www.cnblogs.com/akira90/archive/2013/01/02/2842571.html 因遇到错误,浪费一个小时才解决 一.利用VS2 ...
- Project: Individual Project - Word frequency program----11061192zmx
Description & Requirements http://www.cnblogs.com/jiel/p/3311400.html 项目时间估计 理解项目要求: 1小时 构建项目逻辑: ...
- Android实例-LocationSensor位置传感器(XE8+小米2)
结果: 1.启动后有时会闪退,后来重新做的工程就好了.原因不明(可能与地理反码有关). 2.原文是用的GOOGLE地图显示位置,但在咱们这里好像不行,改为百度,但百度用的是HTML文件.太麻烦了,大家 ...
- 转载.Net MVC中Html.RenderPartial和Html.RenderAction 的应用与区别
Html.Partial方法:是将视图内容直接生成一个字符串并返回, Html.RenderPartial方法是直接输出至当前HttpContext, 而Html.RenderAction还调用一下A ...
- 射频识别技术漫谈(8)——动物标签【worldsing笔记】
动物标签也是工作在TTF模式的ID(Identification)卡.之所以通常称为动物标签,估计是因为一来和识别人的ID卡相区分,二是因为动物不如人听话,人的ID卡可以做成卡片形状拿在手上,而动物不 ...
- iOS动画实现总结
在iOS中,动画实现方向有两种,一种是操作UIView的animation方法,另外一种就是核心动画,但到iOS7中,UIView又跟核心动画牵扯在一起. 方式一(利用核心动画添加动画) 核心动画的层 ...
- 海量Office文档搜索
知识管理系统Data Solution研发日记之十 海量Office文档搜索 经过前面两篇文章的介绍,<分享制作精良的知识管理系统 博客备份程序 Site Rebuild>和<分 ...
- 在与SQL Server建立连接时出现与网络相关的或特定于实例的错误
向往前一样.学习牛腩新闻公布系统的视频,写程序,打开数据库.出现一个框框,具体内容例如以下: 数据库连接不上.全部的工作都要歇班,捣鼓了会儿,简单总结一下解决该问题的方法. 首先:第一步,程序--SQ ...
- 【转】memcached工作原理介绍
FROM: http://my.oschina.net/flynewton/blog/8984 官方主页: http://memcached.org/ 面临的问题 对于高并发高访问的Web应用程序来 ...
- 一步一步写算法(之hash表)
[ 声明:版权全部,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...