函数(..)抛出'eval is evil'消息

时间:2012-04-27 17:13:00

标签: javascript eval jslint

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

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

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

并且JSLint检查程序抛出eval is evil错误。

是否有更好的方法可以避免围绕href行动的多个事件的竞争条件?

2 个答案:

答案 0 :(得分:7)

您隐式使用eval,因为您要求回调函数,因为它已在HTML中指定为字符串,然后构建{{1}用它。

只需使用Function 属性,您就可以直接获取浏览器根据属性构建的功能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

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

  1. 它不会创建新的全局变量 - 所有内容都隐藏在匿名闭包中
  2. 它确保使用与提供给替换函数的完全相同的参数调用原始处理程序

答案 1 :(得分:2)

var oldClick = myImg.onclick;
myImg.onclick = function(evt){ 
  // Put you own code here
  return oldClick.call( this, evt );
};