4

我没有使用 eval,我不确定 Crockford 的以下问题是什么。是否有更好的方法来解决以下问题,或者这只是我需要忽略的事情(如果有需要改进的地方,我更喜欢完善/改进我的解决方案)。

我正在使用一些像素跟踪的东西,在这种情况下,客户端已将 JS 函数绑定到onclickHTML 图像标记的属性,该标记会重定向到站点之外。我需要可靠地跟踪点击,而不会在图像上遇到多个事件侦听器的竞争条件。策略是在运行时覆盖事件,在我自己的函数中复制并运行它。请注意,这适用于我无法控制且无法更改的站点。所以解决方案看起来像:

...
func = Function(img.attr('onclick'));
...
img.attr('onclick', '');
... //some custom tracking code
func.call(this);

并且 JSLint 检查器会抛出eval is evil错误。

href有没有更好的方法来避免围绕动作的多个事件的竞争条件?

4

2 回答 2

7

您正在隐式使用eval,因为您要求回调函数,因为它在 HTML 中作为字符串指定为属性,然后Function用它构造 a 。

只需使用img.onclick 属性,您将直接获得浏览器从属性中构建的功能,然后您可以.call

var func = img.onclick; // access already compiled function
img.onclick = null;     // property change updates the attribute too

... // some custom tracking code

func.call(img, ev);     // call the original function

或者更好:

(function(el) {
    var old = el.onclick;
    el.onclick = function() {
        // do my stuff
        ..
        // invoke the old handler with the same parameters
        old.apply(this, arguments);
    }
})(img);

后一种方法的优点有两个:

  1. 它不会创建新的全局变量 - 一切都隐藏在匿名闭包中
  2. 它确保使用与提供给替换函数的参数完全相同的参数调用原始处理程序
于 2012-04-27T17:16:05.683 回答
2
var oldClick = myImg.onclick;
myImg.onclick = function(evt){ 
  // Put you own code here
  return oldClick.call( this, evt );
};
于 2012-04-27T17:34:10.013 回答