我没有使用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
行动的多个事件的竞争条件?
答案 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)
var oldClick = myImg.onclick;
myImg.onclick = function(evt){
// Put you own code here
return oldClick.call( this, evt );
};