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源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
javascript异步处理工作机制详解
Apr 13 Javascript
javascript实现手机震动API代码
Aug 05 Javascript
javascript插件开发的一些感想和心得
Feb 28 Javascript
关于vue.js弹窗组件的知识点总结
Sep 11 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
jQuery实现鼠标滑过图片移动特效
Dec 08 Javascript
js时间戳与日期格式之间转换详解
Dec 11 Javascript
通过fastclick源码分析彻底解决tap“点透”
Dec 24 Javascript
AngularJS 事件发布机制
Aug 28 Javascript
微信小程序生成分享海报方法(附带二维码生成)
Mar 29 Javascript
Javascript实现鼠标移入方向感知
Jun 24 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
PHP连接access数据库
2015/03/27 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
原生js实现图片轮播特效
2015/12/18 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
JavaScript“尽快失败”的原则实例详解
2016/10/08 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
javaScript语法总结
2016/11/25 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
javascript实现简单留言板案例
2021/02/09 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
Python 日志logging模块用法简单示例
2019/10/18 Python
Python中无限循环需要什么条件
2020/05/27 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
企业管理培训感言
2014/01/27 职场文书
好学生评语大全
2014/05/05 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python
React配置子路由的实现
2021/06/03 Javascript
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers