无法删除chrome中的内联事件处理程序

我想删除一个包含onsubmit内联定义的表单的事件处理程序。

我已经尝试过:

 $("#loginForm").off("submit") $("#loginForm").unbind("submit") $("#loginForm").die("submit") $("#loginForm").removeAttr("onsubmit") $("#loginForm").removeProp("onsubmit") $("#loginForm").attr("onsubmit", "") $("#loginForm").prop("onsubmit, "") $("#loginForm")[0].onsubmit = null $("#loginForm")[0].onsubmit = undefined $("#loginForm")[0].onSubmit = null $("#loginForm")[0].onSubmit = undefined 

什么都行不通!

我在j()的jquery方法中添加了我自己的事件监听器,但它永远不会被调用。 它是旧的事件监听器在我之前执行的…它与按钮上的onClick事件做同样的事情。

我必须明确表示我正在使用chrome扩展,更准确地说是在页面中注入的内容脚本中。

所以问题是,有没有办法清除事件处理程序? 或者更好的是有没有办法添加一个将在内联处理程序之前调用的事件监听器?

编辑:经过很多丑陋的代码,我找到了一种方法来做我想要的…我做了一个表格的副本,删除内联envent处理程序,在我的dom旧表单中替换,然后创建我的事件处理程序。 这很丑,但它有效…如果有人能解释为什么我不能这样做…

这是一个孤立的世界问题。 Chrome扩展程序运行是与页面分开的上下文; 在共享对DOM的访问时, 内联事件侦听器是隔离的

从文档引用,强调我的:

值得注意的是页面和扩展共享的JavaScript对象会发生什么 – 例如, window.onload事件。 每个孤立的世界都会看到自己的对象版本。 分配给对象会影响对象的独立副本。 例如,页面和扩展都可以分配给window.onload ,但是没有人可以读取另一个的事件处理程序。 事件处理程序按照分配顺序进行调用。

因此,要覆盖页面级侦听器,您需要将重写代码注入页面上下文本身。 这个有可能; 有关详细信息,请参阅此优秀答案,以下是一个示例:

 var actualCode = "document.getElementById('loginForm').onsubmit = null;"; var script = document.createElement('script'); script.textContent = actualCode; (document.head||document.documentElement).appendChild(script); script.parentNode.removeChild(script); 

这会向页面添加一个元素,然后在页面自己的上下文中执行。

我实际上不知道在这里处理’onSubmit’事件的对象,所以在这里使用伪逻辑:

  1. 识别正在处理其事件的对象 – 比如说obj。
  2. 识别它的已注册事件 – console.log(obj._events); – 说它返回提交[function]
  3. 清除回调:obj._events.submit = null;
  4. 注册您的处理程序

希望这可以帮助。

试试这个:

 window.addEventListener('submit', function(event) { event.stopImmediatePropagation(); }, true); 

它将阻止事件的传播。