6

在深入探讨这个问题的细节之前,我想先说明一下情况。我们的网络分析公司是大型网站的顾问,并且(除了添加单个 SCRIPT 标签)我们无法控制页面本身。

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

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

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

请记住:我们无法修改安装我们脚本的站点。(我必须强调,因为对此类问题的默认答案始终是,“只需重写页面,以相同的方式完成所有操作。”)

4

2 回答 2

5

你能再试试你的快速和肮脏的测试吗?这在FF3中不会发生在我身上。

elem.onclick = function() { alert("foo"); };
elem.addEventListener("click", function() { alert("bar"); }, false);

当我单击元素时,两个处理程序都会为我触发。

I'm guessing you forgot the final boolean argument in addEventListener (whether to use the capture phase). I'm also guessing you forgot that IE's attachEvent needs onclick, not click.

于 2008-10-21T18:46:26.817 回答
1

addEventListener/attachEvent 在你问的意义上是安全的。他们将新的事件处理程序添加到节点,而不会更改以前添加到它的任何处理程序(即使曾经通过属性 onxxx 分配)。对于使用 addEventListener/attachEvent 将一些内容带到外国页面的公司,必须是唯一的做法。通过属性分配 onxxx 处理程序确实会破坏托管页面 scipts(以前以相同的方式分配)

于 2008-10-21T18:37:27.503 回答