如何首先调用已被扩展覆盖的原始JavaScript函数?

如何首先调用已被扩展覆盖的原始JavaScript函数?,javascript,firefox,preventdefault,firefox-addon-webextensions,eventhandler,Javascript,Firefox,Preventdefault,Firefox Addon Webextensions,Eventhandler,有一个Firefox扩展,它通过 Object.defineProperty(Event.prototype,'preventDefault'。。。 在我的JavaScript脚本执行之前。因此,当我调用preventDefault函数时,将调用修改后的函数,而不是原始函数。函数的行为会因扩展而改变 对我来说,有两种方法可以绕过分机: 在执行扩展之前获取本机preventDefault函数,但我的脚本总是在扩展之后执行,即使我将脚本放在head标记中 我自己实现preventDefault函数

有一个Firefox扩展,它通过

Object.defineProperty(Event.prototype,'preventDefault'。。。
在我的JavaScript脚本执行之前。因此,当我调用
preventDefault
函数时,将调用修改后的函数,而不是原始函数。函数的行为会因扩展而改变

对我来说,有两种方法可以绕过分机:

  • 在执行扩展之前获取本机preventDefault函数,但我的脚本总是在扩展之后执行,即使我将脚本放在head标记中

  • 我自己实现preventDefault函数,但我不知道如何实现

  • 或者这是另一种方式

  • 在执行扩展之前获取本机preventDefault函数,但我的脚本总是在扩展之后执行,即使我将脚本放在head标记中
  • 这是不可能的。该扩展已选择在加载HTML之前运行(即,该扩展正在运行)。如果需要,扩展将首先运行代码。这与浏览器的设计/意图相同。如果扩展更改了原型,您将无法直接访问已被覆盖的函数

  • 我自己实现preventDefault函数,但我不知道如何实现
  • 基本上,您不能方法是一种可以影响浏览器内部数据结构的方法,该数据结构表示的事件将导致浏览器不调用默认操作。即使从DOM中删除元素也不会阻止默认操作。除了调用,您无法影响是否执行默认操作
    .preventDefault()

    您所能做的就是检测到
    .preventDefault()
    方法已被覆盖,并提醒用户您的网站在该扩展已安装/激活的情况下无法正常运行。在这种情况下,您可能会检测到
    .preventDefault()
    方法已通过将
    Event.prototype.preventDefault.toString()返回的内容与未重写该方法时预期返回的内容进行比较而更改

  • 在执行扩展之前获取本机preventDefault函数,但我的脚本总是在扩展之后执行,即使我将脚本放在head标记中
  • 这是不可能的。该扩展已选择在加载HTML之前运行(即,该扩展正在运行)。如果需要,扩展将首先运行代码。这与浏览器的设计/意图相同。如果扩展更改了原型,您将无法直接访问已被覆盖的函数

  • 我自己实现preventDefault函数,但我不知道如何实现
  • 基本上,您不能
    方法是一种可以影响浏览器内部数据结构的方法,该数据结构表示的事件将导致浏览器不调用默认操作。即使从DOM中删除元素也不会阻止默认操作。除了调用,您无法影响是否执行默认操作
    .preventDefault()


    您所能做的就是检测到
    .preventDefault()
    方法已被覆盖,并提醒用户您的网站在该扩展已安装/激活的情况下无法正常运行。在这种情况下,您可能会检测到
    .preventDefault()
    方法已通过比较
    Event.prototype.preventDefault.toString()返回的内容进行更改
    当该方法未被重写时,它将返回您期望的结果。

    您有什么理由需要绕过它吗?如果用户安装了攻击JS引擎的奇怪扩展,那么网站停止工作是他们的问题,而不是您的问题。否则,我认为唯一的方法确实是自己重新实现它。在l的源代码中添加一行代码Library将原始引用存储在全局变量中,可用于调用it@AhmadWabbi你的意思是在扩展源中添加一行?如果在我的源中添加一行,但扩展源总是在我的代码之前执行…。@this.lau uu是否可以自己重新实现preventDefault函数?如果可以,如何实现?很难因为你必须修改事件的内部状态。我自己不知道怎么做,但你可能会通过尝试和错误达到目的。你有什么理由需要绕过这个问题吗?如果用户安装奇怪的扩展来攻击JS引擎,那么网站停止工作是他们的问题,而不是你的问题。否则我认为唯一的办法就是重新导入在库的源代码中添加一行,将原始引用存储在全局变量中,您可以使用该全局变量调用it@AhmadWabbi你的意思是在扩展源中添加一行吗?如果在我的源中添加一行,但扩展源总是在我的代码之前执行…。@this.lau uu是否可以重新实现preventDefault功能如果可能的话,我会自己去做。如果可能的话,如何去做?这很难,因为你必须修改事件的内部状态。我自己不知道如何去做,但你可能会通过尝试和错误来实现。我真的同意你检测方法是否被重写。实际上,我们可以通过一种简单的方式直接检测扩展,因为它修改了一些f其他javascript默认行为。我非常同意您检测该方法是否被重写。实际上,我们可以通过一种简单的方法直接检测扩展,因为它也修改了一些其他javascript默认行为。