有一个 Firefox 扩展可以通过以下方式修改 native preventDefault
函数
Object.defineProperty(Event.prototype, 'preventDefault', ...
在我的 JavaScript 脚本执行之前。因此,当我调用 preventDefault
函数时,将调用修改后的函数而不是原始函数。函数的行为由扩展更改。
对我来说,有两种方法可以绕过扩展:
在扩展执行之前获取原生的 PreventDefault 函数,但即使我将脚本放在 head 标记中,我的脚本也总是在扩展之后执行。
自己实现了preventDefault函数,但不知道如何实现。
或者这是一些替代方法?
最佳答案
- Get the native preventDefault function before the extension executed, but my script always executed after the extension even I put my script in head tag.
这是不可能的。该扩展程序选择在加载 HTML 之前运行(即该扩展程序在 document_start
处运行)。如果扩展需要的话,它们首先可以运行代码。这是浏览器的设计/意图。如果扩展更改了原型(prototype),您将无法直接访问已被覆盖的函数。
- Implement the preventDefault function by myself, but I don't know how to.
基本上,你不能。 .preventDefault()
方法可以影响表示事件的浏览器内部数据结构,从而导致浏览器不调用默认操作。即使从 DOM 中删除元素也不会阻止默认操作。除了调用 .preventDefault()
之外,您无法影响是否执行默认操作。
您所能做的就是检测 .preventDefault()
方法是否已被覆盖,并提醒用户您的网站在安装/激活该扩展后无法正常运行。在这种情况下,您可能可以通过将 Event.prototype.preventDefault.toString()
返回的内容与当该方法未被重写时,您期望它返回什么。
关于javascript - 如何先调用已被扩展覆盖的原始 JavaScript 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44411618/