Greasemonkey 不允许扩充 Element.prototype,说 "not a function"
Greasemonkey doesn't allow to augment Element.prototype, saying "not a function"
我需要在我的用户脚本中的 Element.prototype
中定义一个方法,但是当我尝试那样做时,我得到了奇怪的错误:
// ==UserScript==
// <...>
// @grant none
// ==/UserScript==
;[Element.prototype, Text.prototype].forEach(e => {
e.findParent = function(selector) {
let node = this
while(node && !node.matches(selector)) {
node = node.parentNode
if (! node.matches) return null;
}
return node
}
}
[...].forEach(...) is not a function
function augmentPrototype(e) {
e.findParent = function(selector) {
/* <...> */
}
}
augmentPrototype(Element.prototype)
augmentPrototype is not a function
(e => {
e.findParent = function(selector) {
/* <...> */
}
})(Element.prototype)
(intermediate value)(...) is not a function
似乎无论在 Element.prototype
上调用什么函数,它都会立即变成 "not a function" 到 Greasemonkey,甚至 [].forEach
。
普通的Firefox控制台没有这个问题。我也修改了 Event.prototype
,它工作正常。
更新:Firefox 的 Tampermonkey 也有同样的问题,所以这不仅仅是 Greasemonkey 的问题。
对不起,虚惊一场。事实证明,在我的代码旁边,我有一个以 (...
开头的立即调用函数,而且我不使用分号。 IIF 之前的前导分号解决了问题。显然,自动分号插入在 Firefox 中的工作方式略有不同,因为它在 Chrome.
中工作正常
我需要在我的用户脚本中的 Element.prototype
中定义一个方法,但是当我尝试那样做时,我得到了奇怪的错误:
// ==UserScript==
// <...>
// @grant none
// ==/UserScript==
;[Element.prototype, Text.prototype].forEach(e => {
e.findParent = function(selector) {
let node = this
while(node && !node.matches(selector)) {
node = node.parentNode
if (! node.matches) return null;
}
return node
}
}
[...].forEach(...) is not a function
function augmentPrototype(e) {
e.findParent = function(selector) {
/* <...> */
}
}
augmentPrototype(Element.prototype)
augmentPrototype is not a function
(e => {
e.findParent = function(selector) {
/* <...> */
}
})(Element.prototype)
(intermediate value)(...) is not a function
似乎无论在 Element.prototype
上调用什么函数,它都会立即变成 "not a function" 到 Greasemonkey,甚至 [].forEach
。
普通的Firefox控制台没有这个问题。我也修改了 Event.prototype
,它工作正常。
更新:Firefox 的 Tampermonkey 也有同样的问题,所以这不仅仅是 Greasemonkey 的问题。
对不起,虚惊一场。事实证明,在我的代码旁边,我有一个以 (...
开头的立即调用函数,而且我不使用分号。 IIF 之前的前导分号解决了问题。显然,自动分号插入在 Firefox 中的工作方式略有不同,因为它在 Chrome.