安全、通用、在Javascript中使用addEventHandler的方法?

安全、通用、在Javascript中使用addEventHandler的方法?,javascript,events,dom,attachevent,Javascript,Events,Dom,Attachevent,在我讨论这个问题的细节之前,我想把情况弄清楚。我们的网络分析公司是大型网站的顾问(除了添加一个脚本标签),我们无法控制页面本身 我们现有的脚本使用“旧”方式(element.onclick=blah的奇特版本;它也执行原始处理程序)安装处理程序,而该方式完全不知道页面上的“新”(addEventListener或attachEvent)处理程序。我们想解决这个问题,使我们的脚本能够在更多的网站上运行,而不需要太多的自定义开发 这里最初的想法是让我们自己的脚本使用addEventListener/

在我讨论这个问题的细节之前,我想把情况弄清楚。我们的网络分析公司是大型网站的顾问(除了添加一个脚本标签),我们无法控制页面本身

我们现有的脚本使用“旧”方式(element.onclick=blah的奇特版本;它也执行原始处理程序)安装处理程序,而该方式完全不知道页面上的“新”(addEventListener或attachEvent)处理程序。我们想解决这个问题,使我们的脚本能够在更多的网站上运行,而不需要太多的自定义开发

这里最初的想法是让我们自己的脚本使用addEventListener/attachEvent,但这带来了一个问题:如果客户端的站点使用“旧”方式设置处理程序,它将清除我们使用“新”方式安装的处理程序。快速而肮脏的测试表明,这在IE7和FF3中都会发生,尽管我没有测试所有的浏览器。如果我们在页面的事件处理程序已经设置好之后使用“新”方式,也有可能会删除它们的处理程序

所以我的问题是:我可以使用什么安全的技术来使用addEventListener/attachEvent在Javascript中添加事件处理程序,无论页面上的其他事件处理程序是如何安装的


请记住:我们无法修改安装脚本的站点。(我必须强调这一点,因为像这样的问题的默认答案总是“只需重写页面,以同样的方式完成所有工作即可。”)

从某种意义上说,addEventListener/attachEvent是安全的。它们向节点添加一个新的事件处理程序,而不改变以前添加到该节点的任何处理程序(即使是通过属性onxxx分配的处理程序)。对于使用addEventListener/attachEvent将一些内容带到外部页面的公司,必须是唯一的做法。通过属性分配onxxx处理程序确实会破坏托管页面scipts(以前也是以同样的方式分配的)

您能再次尝试快速而肮脏的测试吗?在FF3中,这种情况不会发生在我身上

elem.onclick = function() { alert("foo"); };
elem.addEventListener("click", function() { alert("bar"); }, false);
当我单击元素时,两个处理程序都会为我触发


我猜您忘记了
addEventListener
中的最后一个布尔参数(是否使用捕获阶段)。我还猜你忘了IE的
attachEvent
需要
onclick
,而不是
单击

是,但这里的问题是如果页面使用元素。onclick=“”;使用addEventListener后,它将删除我们的侦听器。我们现有的安装处理程序的方法是使用element.onclick=“”,因为我们保存了处理程序以前的内容,并在触发时“模拟”它。请再次阅读我的文本-刚刚更正。element.onclick确实不会删除添加了addEventListener/attachEvent的处理程序。此外:“模拟”事件是最糟糕的问题之一,请不要这样做。Re:模拟事件,您必须记住这是一个相当“旧”(互联网术语)的产品,我敢打赌IE5、IE5.5和IE6之间几乎没有功能上的区别(事实上,在新版本中添加了新功能,如CSS表达式或HTC等),这在IE或任何其他浏览器中都不是问题,因为如果行为“猜测”事实上,提问的人认为,这将导致任何客户端代码出现严重问题。您似乎是对的。很抱歉,很明显,这个错误是一个糟糕的测试用例,而不是浏览器中的任何特定错误。(至少IE7和FF3)谢谢你为我指明了正确的方向。