javascript - 阻止新事件附加到元素

标签 javascript

我正在将事件绑定(bind)到一个元素。

如何防止新的 JavaScript 事件绑定(bind)到它?

我想防止未知脚本使用我的元素。

最佳答案

您无法阻止未知脚本将事件监听器附加到您的对象。浏览器不提供该功能。浏览器确实会阻止从其他域(其他窗口、选项卡或框架)运行的脚本弄乱您的 DOM,但如果脚本位于同一域甚至同一页面中,则它可以自由地执行它想做的任何操作到该页面中的 DOM。

如果您遇到未知脚本做坏事的问题,那么您可能最好向后退一步,向上描述您真正想要防止的事情,因为试图阻止事件监听器就像试图阻止某人一样当它们已经在你的房子里自由漫步时,就从一个抽屉里拿出来。您可能需要在更高级别上保护事物。

<小时/>

如果您想进入“黑客”领域来尝试阻止特定类型的代码,有一些选择。如果第三方代码想要绕过它们,这些并不是万无一失的。换句话说,如果您可以看到第 3 方代码的作用并且它不会自行调整以试图绕过您,那么这些将会更有用:

首先,您可以在安装事件处理程序后替换 elem.addEventListener(),这将阻止其他代码在该对象上使用 elem.addEventListener()再次。

var item = document.getElementById("test");
item.addEventListener("click", function() {
    log("original event handler");
});

// install "do nothing" override method
item.oldAddEventListener = item.addEventListener;
item.addEventListener = function() {};

// this one will do nothing because addEventListener has been replaced
item.addEventListener("click", function() {
    log("2nd event handler");
});

演示:http://jsfiddle.net/jfriend00/C5rzN/

这并不是万无一失的,因为还有其他方法可以安装直接从原型(prototype)调用方法或使用 onclick 属性的事件处理程序。

关于javascript - 阻止新事件附加到元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432590/

相关文章:

javascript - jQuery .addClass() 和 .removeClass() 只适用于元素的第一个实例

javascript - 我怎样才能阻止这个 jQuery 出问题?

javascript - Highcharts - 通过单击单选按钮动态更改图表类型

JavaScript removeNode() 在 Chrome 中不工作

javascript - 为什么 ng-click 不能在动态 html 内容中工作?

javascript - 如何使用 TypeScript 将拖动事件处理程序附加到 React 组件

javascript - 去掉 map 功能

javascript - Cypress 捕获 href 字符串以在以后的请求中使用

Javascript 从内部对象引用外部对象

javascript - 这些换行符是如何保存到 MySql DB 中的?