工作需要,研究了一下时间绑定的事,这里拿点击事件为例,从 onclick属性,jquery的bind函数以及unbind函数做了一些测试(谷歌浏览器) 顺便记录一下测试结果
onclick属性:
1、直接在DOM文档中添加 onclick属性,单一属性可以加多个函数,用逗号隔开,如果有多个onclick属性 则只识别第一个,后面的都无效
2、jquery的unbind函数无法解绑onclick属性中定义的事件,它只能解绑通过jquery的bind函数添加的事件
对于同名函数,bind 一次绑定一个,unbind 一次性全部解绑
jQuery事件绑定函数: bind, 官方定义:
$(selector).bind(event,data,function)
其中 selector是选择器,不解释, event 可选: click,keypress load submit dblclick keydown change resize mouseenter keyup scroll focus 等
data
function 不能写参数列表 即 .bind("click", fn1(param1));是错误的写法, 写上之后不绑定只是执行一次, 所以对于无参的函数比较简单,有两种写法,
正确写法1 : .bind("click", fn1);
正确写法2 : .bind("click", function() { fn1() };
正确写法3(一次绑定多个的快捷写法):.bind({"click": fn1}, {"click", fn2}...);
对于有参的函数:
直接写参数列表肯定是不行了,在网上看到其他人的解决办法,一共三种,但都有瑕疵
第一种:.bind("click", function() { fn1(param1); }); 缺点:匿名,后面无法操作了 后面的 unbind 就没法去定位并删掉
第二种:.bind("click", data, fn2); data是个js对象或数组 传递后 存储在自定义函数的 param.data属性下
比如: 函数 function fn2(event) { alert(event.data) } 如果是普通字符串,那么这个值就是 event.data,如果是数组 event.data[i] 对象 event.data.objName 类推
缺点:可能导致自定义的函数不可重用,需要先判断参数类型
第三种:.bind("click", fn1(param)); 奇怪,这个不是上边说过的错误的吗?但是来看看自定义的函数,
function fn1(str) {
return function() {
alert(str);
}
}
用了闭包。。。但是缺点还是有的,就是 unbind即使知道了函数名也无法解绑
jQuery 事件解绑函数:unbind 官方定义
$(selector).unbind(event,function)其中,function为undefined时 解绑 由jquery绑定的 这个事件的全部函数,不管document自带的属性
同样,function不能包含参数列表,只能有函数名称
正确写法: .unbind("click", fn1);
jQuery attr函数 直接修改onclick的值 通过attr修改的 unbind一样删不掉