保存并恢复jQuery对象上的"onclick"操作

Pau*_*lin 5 javascript jquery function

我想在页面上禁用一大堆对象,然后再重新启用它们.由于其中一些是标签而不是按钮,我通过删除它们的onclick attr来禁用它们.我试图将旧处理程序存储在.data()中,但不幸的是,当我尝试使用$(obj).attr('onclick',$(obj).data('onclick'))它来恢复它时,它调用函数而不是将其恢复到属性.如果我尝试将它存储在不同的属性而不是数据中,它不存储函数,它存储函数的返回值.

有没有办法在不重写我的页面上的每个标签和每个onclick处理程序的情况下完成此操作?

if( doEnable) {

    $(obj).attr('href', $(obj).data('href'));
    $(obj).attr('onclick', $(obj).data('onclick'));


    $(obj).removeClass(EIS.config.classes.disabled);
    $(obj).show();

}
else {
    // Save the things you're going to remove
    $(obj).data('onclick', $(obj).attr('onclick'));
    $(obj).data('href', $(obj).attr('href'));

    $(obj).prop("href", null);
    $(obj).prop("onclick", null);

    $(obj).addClass(EIS.config.classes.disabled);
    $(obj).show();
   }
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这段代码似乎在Chrome和Firefox中运行良好,但有时只在IE8中运行,而在IE6中从未运行过.不幸的是,客户端首先在IE6中进行测试

bob*_*nce 7

$(obj).attr('onclick', ...
Run Code Online (Sandbox Code Playgroud)

是不明确的,在不同版本的jQuery和不同的浏览器中有不同的结果.它可能不会做你想要的.您应该避免attr在事件处理程序上使用.

问题是onclick 属性onclick 属性之间的脱节.jQuery的试图刷属性,并在过去的地毯下一个属性之间的区别,使用attr来访问,但他们是完全不同的.这在jQuery 1.6中有所改变,并在1.6.1中部分恢复,引起了广泛的争议,混乱和不兼容.

对于许多属性,属性的值和相应的DOM属性是相同的; 对于其他人,包括所有不是字符串的属性,他们不是.事件处理程序当然不是:属性是一个Function对象,而string属性可能是(a)onclick="..."HTML中属性的原始字符串,(b)没有(如果onclick是从脚本分配为Function对象的话) )或(c)不可用(在较旧的IE中).

要访问事件处理函数Function属性,请prop()在jQuery 1.6中使用:

$(obj).data('onclick', $(obj).prop('onclick'));
...
$(obj).prop('onclick', $(obj).data('onclick'));
Run Code Online (Sandbox Code Playgroud)

或者只使用普通的JavaScript,它实际上更简单,更易读; jQuery在这里没有赢任何东西.

obj._onclick= obj.onclick;
...
obj.onclick= obj._onclick;
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,这都不会可靠地"禁用"元素,因为它们可以(并且非常可能,如果您使用jQuery)在其上注册了其他事件侦听器,使用addEventListener/attachEvent而不是old-school事件处理程序接口.