阻止Javascript事件的默认行为
这几天,因为一个项目中的bug而头痛。
这是一个条码扫描程序,为了保证扫描工作的连续性,在页面中利用
Javascript自动捕获keydown事件,因为条码扫描枪在完成一次扫描任务后会触发回车键,所以,在keydown事件中判断是否
keyCode==13,然后触发页面中一个隐藏的按钮,提交此数据保存至服务器。
程序中,为条码输入文本框注册了类似这样的脚本:
if(event.keyCode==13){
document.getElementById('buttonClientID').click();
}
因
为开始时系统并未要求对条码进行校验,所以问题没有暴露,直到后来系统升级,对扫入的条码进行各种合理性判断,才发现有些不太对头。数据似乎进行了两次保
存,但页面看起来只做了一次回滚,所以,第一反应是服务器端的代码问题。但问题怪就怪在这里,提交数据的服务器代码是一个事务,要么成功,要么失败回滚,
但数据却是被成功保存了的,这让我百思不得其解。在花了大量时间对服务器代码进行改造却毫无进展之后,还是把目标放在了客户端,因为通过测试也能确定数据
有被重复提交的迹象。
经过大量的尝试后,终于找到了问题所在,原来,这和浏览器的事件处理模型有关。为了简化,这个
程序被限制在IE下工作。在IE中,响应一个事件的并非只有一个元素,处理的方法是所谓冒泡型事件,也就是从最特定的事件到最不特定的事件目标的顺序进行
触发,也就是按照DOM的层次结构不断地上升到顶端,这个概念被称作事件流。所以,在本程序中,扫描枪触发的回车事件,除了会执行JS指定的动作之外,还
会默认有其它一些元素去响应它,具体会触发哪些动作和页面布局有关。这种情况类似于在填写表单的时候,有些用户(特别是常用Excel的财务人员)会在填
写完一个文本框后习惯性地按下回车以换行,如果,未针对这种情况进行处理的话,很可能会触发提交表单的事件。对于直接键盘输入的程序很容易想到这个问题,扫描枪这种输入设备平时较少用到,晕。
解决的方法很简单,就是在脚本中加上这样一段代码:
event.returnValue=false;
这是在IE下,如果是Mozilla,则要调用preventDefault()方法。
这样,就能够阻止该事件的默认行为,而只去执行指定的动作。
经测试,Bug死了,程序活了。
******
相关文档:
function isTrueName(s) { var patrn=/^[a-zA-Z]{1,30}$/; if (!patrn.exec(s)) return false return true } }} //校验密码:只能输入6-20个字母、数字、下划线
function isPasswd(s)
{
var patrn=/^(\w){6,20}$/;
if (!patrn.exec(s)) return false
return true
}
//校验普通电话、传真号码:可以 ......
javascript的parseInt函数
javascript的parseInt函数,大家都知道是干啥的
但你知道
parseInt("07") 返回多少 ?
parseInt("08") 又返回多少 ?
正确答案是
parseInt("07") 返回8
parseInt("08") 返回0
你知道问题在哪?
其实,这个问题可能大家都没想过吧。
用javascript的parseInt函数时,
parseInt("08") ......
在编写构造函数时,可以使用原型对象(它本身是所有构造函数的一个属性)的属性来创建继承属性和共享方法。原型属性和方法将按引用复制给类中的每个对象,因此它们都具有相同的值。可以在一个对象中更改原型属性的值,新的值将覆盖默认值,但仅在该实例中有效。属于这个类的其他对象不受此更改的影响。下面给出了使用自定义 ......
null, undefined
相同:
当一个变量的值是null, undefined时,表示:我们声明并定义了一个变量,仅仅是这个变量的值是null, undefined.
被调用者:
将null, undefined作为参数传入"JavaScript内置函数"时,不会出现异常,内置函数返回:null -> null, undefined->undefined
但typeof函数除外。
调 ......
一个可拖放的JS效果;
var isIE = (document.all) ? true : false;
var $ = function (id) {
return "string" == typeof id ? document.getElementById(id) : id;
};
var Class = {
create: function() {
return function() { this.initialize.apply(this, arguments); }
}
}
var Extend = function( ......