这正是很多人努力寻找适合跨浏览器事件监听的解决方案的原因。某些浏览器不会在正确的上下文中触发该功能,某些浏览器不会传递事件参数等等。这是一个更容易使用的框架,但如果你使用任何框架...
首先坚持如果你真的太可怕了这样的代码:
<a href="javascript:someFunction(this , evaledVariable);otherFn(ohDearVariable)">
然后不好意思,没有人可以帮你。
否则......
在任何情况下,你不能直接通过简单的设置.onclick
属性附加的事件节点,并期待它的表现同样跨浏览器的,甚至在你的浏览器中正常工作与...发展。您必须同时使用addEventListener
和attachEvent
方法。
分叉跨浏览器事件的最简单的方法是:
var addListener = function(node , event , listener) {
if (node.addEventListener) {
node.addEventListener(event , listener , false);
} else if (node.attachEvent) {
node.attachEvent("on" + event , listener);
}
}
同为消除听众:
var removeListener = function(node , event , listener) {
if (node.addEventListener) {
node.removeEventListener(event , listener , false);
} else if (node.attachEvent) {
node.detachEvent("on" + event , listener);
}
}
就这样使用它:所以,如果你
var nodeListener = function(e) {
alert(e.target);
// run once for demo
removeListener(node , "click" , nodeListener);
}
// notice we omit the "on" part.
addListener(node , "click" , nodeListener);
想要将侦听器附加到节点的WRONG onclick方式:
var wrongOnClick = node.onclick;
var listener = function(e) {
before();
wrongOnClick.call(this , e);
after();
};
addListener(node , "click" , listener);
这将成为最流行的浏览器包括IE,但需要有一个良好的实现实际上更大量optimalisation和内存泄漏预防的代码,但不是自己编写这些代码或让他人为你做,请使用框架/无线工具包!因为到那时你有一个很好的实施运行,工程跨浏览器,你将有更多的代码膨胀,然后当你真正使用的框架...
** **增编
一劈,我还是建议使用addEventListener方法并保持对您的侦听器的引用。
var aListener = function(e) { }
node.addEventListener("click" , aListener , false);
var wrappedListener = function (e) {
before(e);
aListener(e);
after(e);
}
node.removeEventListener("click" , aListener , false);
node.addEventListener("click" , wrappedListener , false);
这显然只能与听众的作品,如果你想让它包装现有的听众在一个页面(从别人监听器),那么就根本没有人知道如何追加他们的听众节点的方式。如果他们在本文的开头使用了addEventListener/attachEvent库或脏例子,那么您无法可靠地将它们包装起来,而无需手动编码,查找引用或手动公开它们。
使用JavaScript控制台(例如Firebug(用于FireFox)或Chrome中的“JavaScript控制台”)将w帽子是'这个'?您可以通过将console.log(this)放入wrapper_onclick中,然后检查控制台中显示的结果项目,轻松找到它。 – Matt 2010-11-03 17:21:49
打印时,“this”是页面的URL。 'arguments [0]'是'mouseevent'。 – 2010-11-03 20:27:52