Javascript级联下拉菜单以及AJAX数据验证核心代码


Posted in Javascript onMay 10, 2013

虽然也使用了Prototype.js来编写,但是由于对它的不了解,类的实现仍然是使用了《JavaScript高级程序设计》里的方法。使用AJAX进行数据验证时,最初使用的是XML来当数据源,然而在使用了一段时间后,发现XML效率太低,于是又使用JSON来做为数据源。

一年过去了,客户又提出了新的需求,最初是只要输入框的两个数据相符就行,现在的要求是两个下拉菜单的数据也要相符,于是,我利用此机会,将代码重构了一次。

需求
1、根据下拉菜单产品名称、产品包装的选择,右面的图片要进行相应的变化。
2、产品名称、产品包装、生产日期、生产批次都验证正确后,右图出现相应的提示。

简要说明
使用Prototyp.js完成类的构建,面向对象的方式实现功能,事件导向让代码更清晰明了,使用AJAX的状态管理,让验证过程对用户更友好,JSON作为数据源的执行效率也让人满意。
Linkage Drop Down List And AJAX Validation
This JS script has special meaning for me.
I got a new start one year ago, the first task was to solve this linkage drop down list and data validation. At that time I had no deep understanding of Javascript. With my ability of study, after the reference to the code of colleague's, I finally finished it in several days.
Although I used Prototype.js to code, I still used the method in the to make up Class. In the process of AJAX validation, I used XML as data source at the beginning. Aftet time past, I changed data source from XML to JSON for the low efficiency of XML.
Now the clients have new requirements, they need four data to be validated. So I rebuild the scripts.
Requirements:
1. change images of products with the change of product name and package.
2. after the validation with product name, package, date, batch, change images of products.
Brief:
Construct class with Prototype.js, use OOP's approach and event management to make a clear idea.
The management of AJAX status let the process be more friendly for customer. I'm also satisfied with the efficiency of JSON.
核心代码 | Core Code:

var ValidProduct = Class.create(); 
ValidProduct.prototype = { 
initialize:function(prodData,validDataUrl,validData,prodType,prodPack,prodDate,prodPatch,prodImg,validBtn,validMsg){ 
this.prodData = $H(prodData); //产品类别数据 | product type data 
this.validDataUrl = validDataUrl; //验证数据路径 | product data url 
this.validData = validData; //验证数据 | product data 
this.prodType = $(prodType); //产品验证类别 | product type 
this.prodPack = $(prodPack); //产品验证包装 | product package 
this.prodDate = prodDate; //产品验证日期ID | product date 
this.prodPatch = prodPatch; //产品验证批次ID | product batch 
this.prodImg = $(prodImg); //产品验证图片 | product images 
this.validBtn = $(validBtn); //产品验证按钮 | validate button 
this.validMsg = $(validMsg); //产品验证过程提示 | validate message 
this.init(); 
}, 
init:function(){//程序初始化 | Application init 
this.productTypeBind(); 
this.prodType.observe("change",this.productTypeChange.bind(this)); 
this.prodPack.observe("change",this.productPackChange.bind(this)); 
this.validBtn.observe("click",this.productValid.bind(this)); 
}, 
productTypeBind:function(){//绑定产品类别下拉列表数据 | Binding product type data 
this.prodPack.selectedIndex = 0; //for IE after page refreshed 
var o = this.prodType; 
this.prodData.each(function(pair){ 
o.options.add(new Option(pair.key, pair.value.code)); 
}); 
}, 
productTypeChange:function(e){//产品类别下拉列表事件监听 | Eventlistener of product type 
var o = this.prodPack; 
o.length = 1; 
o.selectedIndex = 0; //for IE after packing choosed the first 
this.prodImg.writeAttribute("src",o[0].id); 
var selected = this.prodType.selectedIndex; 
if (selected!=0){ 
this.productPackBind(this.prodType[selected].text); 
} 
}, 
productPackBind:function(choosedValue){//绑定产品包装下拉列表数据 | Binding product package data 
var o = this.prodPack; 
$H(this.prodData.get(choosedValue).type).each(function(pair){ 
var newOption = new Option(pair.key, pair.value.packing); 
newOption.id = pair.value.img; 
o.options.add(newOption); 
}); 
}, 
productPackChange:function(e){//产品包装下拉列表事件监听 | Eventlistener of product package 
var o = this.prodPack; 
this.prodImg.writeAttribute("src",o[o.selectedIndex].id); 
}, 
productValid:function(){//产品验证 | validate product 
var v1 = $F(this.prodDate).strip(), v2 = $F(this.prodPatch).strip(); 
if(v1!=""&&v2!=""){ 
if(this.prodPack.selectedIndex != 0){ 
var validAjax = new Ajax.Request(this.validDataUrl,{ 
method:"get", 
parameters:"rnd="+Math.random(), 
onCreate: function(){ 
this.validMsg.show(); 
}.bind(this), 
onComplete:this._validProd.bind(this) 
}); 
}else{ 
alert("请选择产品及包装!"); 
} 
}else{ 
alert("请填好产品生产日期和产品批号!"); 
} 
}, 
_validProd:function(oReq){//产品验证Ajax callback 
this.validMsg.hide(); 
var v1 = this.prodType.getValue(), v2 = this.prodPack.getValue(); 
var v3 = $F(this.prodDate).strip(), v4 = $F(this.prodPatch).strip(); 
var imgUrl = this.prodPack[this.prodPack.selectedIndex].id; 
//alert(v1+"n"+v2+"n"+v3+"n"+v4+"n"+imgUrl); 
var prodBatchs = oreq.responseText.evalJSON()[this.validData]; 
var result=prodBatchs.any(function(a){ 
return (v3==a[1] && v4==a[0] && a[2].startsWith(v1) && v2==a[3]); 
}); 
if(result){ 
this.prodImg.writeAttribute("src", imgUrl.split(".")[0] + "-valid.jpg"); 
}else{ 
this.prodImg.writeAttribute("src", "images/invalid.jpg"); 
}; 
} 
} 
document.observe("dom:loaded",function(){ 
var validOne = new ValidProduct(prodTypeData,"data/batchs_new2.txt","batchs","productType", 
"productPack","prodate","probatch","credit-img","vaSubmit","ajaxsearch"); 
});
Javascript 相关文章推荐
jquery遍历input取得input的name
Apr 27 Javascript
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
Dec 04 Javascript
extjs 初始化checkboxgroup值的代码
Sep 21 Javascript
关于JS控制代码暂停的实现方法分享
Oct 11 Javascript
JQuery中操作Css样式的方法
Feb 12 Javascript
node.js中的fs.chown方法使用说明
Dec 16 Javascript
jquery操作angularjs对象
Jun 26 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
Feb 08 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
浅析JS抽象工厂模式
Dec 14 Javascript
vue微信分享插件使用方法详解
Feb 18 Javascript
Node.js API详解之 Error模块用法实例分析
May 14 Javascript
javascript级联下拉列表实例代码(自写)
May 10 #Javascript
jquery ui对话框实例代码
May 10 #Javascript
javascrip关于继承的小例子
May 10 #Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
May 10 #Javascript
解析瀑布流布局:JS+绝对定位的实现
May 08 #Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 #Javascript
深入document.write()与HTML4.01的非成对标签的详解
May 08 #Javascript
You might like
Views rows style模板重写代码
2011/05/16 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
php实现mysql事务处理的方法
2014/12/25 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP中phar包的使用教程
2017/06/14 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
js 数组去重的四种实用方法
2014/09/09 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
js导出excel文件的简洁方法(推荐)
2016/11/02 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
2016/11/21 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
javascript局部自定义鼠标右键菜单
2020/12/08 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python中的数学运算操作符使用进阶
2016/06/20 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
MIS软件工程师的面试题
2016/04/22 面试题
成绩单家长评语大全
2014/04/16 职场文书
答谢会策划方案
2014/05/12 职场文书
听证通知书
2015/04/24 职场文书
委托收款证明
2015/06/23 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
浅谈JavaScript浅拷贝和深拷贝
2021/11/07 Javascript
MySQL实现用逗号进行拼接、以逗号进行分割
2022/12/24 MySQL