在我深入了解这个问题的细节之前,我想说明一下情况。我们的网站分析公司是大型网站的顾问,除了添加单个SCRIPT标签外,我们无法控制网页本身。
我们现有的脚本使用“旧”方式安装处理程序(element.onclick = blah的花哨版本;它还执行原始处理程序),它完全不知道页面上的“new”(addEventListener或attachEvent)处理程序。我们想解决这个问题,使我们的脚本能够在更多站点上运行,而无需进行太多的自定义开发。
这里最初的想法是让我们自己的脚本使用addEventListener / attachEvent,但这会产生一个问题:客户端的网站使用“旧”方式设置处理程序,它会消灭我们安装的“新”处理程序办法。快速而肮脏的测试表明,这种情况在IE7和FF3中都会发生,尽管我没有测试整个浏览器范围。如果我们在设置了页面的事件处理程序之后使用“新”方式,那么我们也可能会删除它们的处理程序。
所以我的问题是:我可以使用什么安全技术在Javascript中使用addEventListener / attachEvent添加事件处理程序,无论页面上的其他事件处理程序是如何安装的,它都能正常工作?
请记住:我们无法修改安装脚本的网站。 (我必须强调,因为像这样的问题的默认答案总是如此,“只需重写页面以同样的方式完成所有事情。”)
答案 0 :(得分:5)
您可以再次尝试快速和肮脏的测试吗?这在FF3中不会发生。
elem.onclick = function() { alert("foo"); };
elem.addEventListener("click", function() { alert("bar"); }, false);
当我点击元素时,两个处理程序都会向我发射。
我猜你忘了addEventListener
中的最后一个布尔参数(是否使用捕获阶段)。我也猜你忘了IE的attachEvent
需要onclick
,而不是click
。
答案 1 :(得分:1)
addEventListener / attachEvent在某种意义上是安全的。他们向Node添加一个新的事件处理程序,而不改变之前添加到它的任何处理程序(甚至一旦通过属性onxxx分配)。对于使用addEventListener / attachEvent将一些内容带到外部页面的公司必须是唯一的做法。通过属性分配onxxx处理程序确实会破坏托管页面的scipts(之前已经以相同的方式分配)