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 相关文章推荐
javascript判断并获取注册表中可信任站点的方法
Jun 01 Javascript
关于微信中a链接无法跳转问题
Aug 02 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
Oct 28 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
Apr 24 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
基于datepicker定义自己的angular时间组件的示例
Mar 14 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
Jul 25 Javascript
elementUI select组件默认选中效果实现的方法
Mar 25 Javascript
Openlayers学习之加载鹰眼控件
Sep 28 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
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实现每天自动变换随机问候语的方法
2015/05/12 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
JS中的三个循环小结
2017/06/20 Javascript
vue中实现移动端的scroll滚动方法
2018/03/03 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python日志模块logging基本用法分析
2018/08/23 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
台湾专柜女包:KINAZ
2019/12/26 全球购物
便利店投资创业计划书
2014/02/08 职场文书
技术支持岗位职责
2015/02/13 职场文书
昆虫记读书笔记
2015/06/26 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
Redis持久化与主从复制的实践
2021/04/27 Redis
python程序的组织结构详解
2021/12/06 Python
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS