1

有一个Firefox扩展,它通过如何调用被扩展首先覆盖的原始JavaScript函数?

Object.defineProperty(Event.prototype, 'preventDefault', ... 

修改本地preventDefault函数执行我的JavaScript脚本之前。所以,当我调用preventDefault函数时,修改的函数将被调用,而不是原来的函数。该功能的行为由扩展名更改。

对于我来说,有绕过扩展双向:

  1. 得到执行扩展之前,本地的preventDefault功能,但我的脚本后延,甚至我把我的脚本在头标记始终执行。

  2. 自己实现preventDefault函数,但我不知道该怎么做。

或者这是一些替代方法?

+4

任何你需要绕过这个的原因?如果用户安装破解JS引擎的奇怪扩展,如果网站停止工作,这是他们的问题,而不是你的。否则,我认为唯一的办法就是自己重新实施它。 –

+0

在库的源代码中添加一行以将原始引用存储在您可用来调用它的全局变量中 – AhmadWabbi

+0

@AhmadWabbi您的意思是在扩展源中添加一行?如果在我的源代码中添加一行,但扩展源始终在我的代码之前执行... – Xhua

回答

0
  1. 得到执行扩展之前,本地的preventDefault功能,但我的脚本后延,甚至我把我的脚本在头标记始终执行。

这是不可能的。扩展程序选择在加载HTML之前运行(即扩展程序在document_start上运行)。如果他们愿意,扩展可以首先运行代码。这是浏览器的设计/目的。如果扩展名更改原型,则不能直接访问已被覆盖的函数。

  1. 自己实现preventDefault函数,但我不知道该怎么做。

基本上,你不能。 .preventDefault()方法是可以影响表示事件的浏览器内部数据结构的方式,这种方式会导致浏览器不调用默认操作。即使从DOM中删除元素也不会阻止默认操作。如果要采取默认操作,则无法影响您,除了调用.preventDefault()之外。

您只能检测到.preventDefault()方法已被覆盖,并提醒用户您的网站在安装/启用该扩展模块时无法正常工作。在这种情况下,您可能可能会检测到.preventDefault()方法已被更改,方法是比较Event.prototype.preventDefault.toString()返回的内容与您希望在方法未被覆盖时返回的内容。

+0

我真的同意你来检测方法是否被覆盖。实际上,我们可以通过一种简单的方式直接检测扩展,因为它还修改了其他一些JavaScript默认行为。 – Xhua