什么可以阻止Array.prototype.filter()在控制台中运行良好的防油精脚本中运行

What could stop Array.prototype.filter() from running in greasemonkey script that runs fine in console

本文关键字:运行 脚本 控制台 Array prototype filter 什么      更新时间:2023-09-26

以下是代码:

function fil(val) {
  console.log('fil'); // never written to console when run in greasemonkey
  return true;
}
var temp = unsafeWindow.someobject;
console.log(temp); // looks fine
temp.filter(fil); // never happens in greasemonkey

如果我在firebug控制台的同一个对象上运行完全相同的代码(当然没有unsafeWindow),它的输出就很好。原因可能是什么?

编辑以澄清:当在润滑器中运行时,字符串"fil"从未写入控制台,这表明从未调用过fil()。此外,如果我做了类似console.log(temp.filter(fil));的事情,当代码从greatemonkey运行时,我永远不会在控制台中看到结果。(尽管我知道应该这样做,因为上面的行告诉temp存在,并且代码一直运行到那个点。

在我的例子中,在Firefox 45和Greasemonkey 3.7中,这段代码运行良好:

// ==UserScript==
// @name        Array.prototype.filter() test
// @namespace   http://stackoverflow.com/questions/33675675/
// @include     http://stackoverflow.com/questions/33675675/*
// @version     1.0
// @grant       none
// ==/UserScript==
function fil(val) {
  console.log('fil'); // never written to console when run in greasemonkey
  return true;
}
var temp = unsafeWindow.allowedHosts;
console.log(temp); // looks fine
temp.filter(fil); // never happens in greasemonkey

输出:

Array [ "stackoverflow.com", "serverfault.com" ]
fil
fil

但是将none更改为,例如,第行中的GM_getValue

// @grant       none

仅输出:

Array [ "stackoverflow.com", "serverfault.com" ]

这是因为向@grant传递除none之外的任何值都会启用沙箱,而且从我所看到的,封装的对象不支持将回调函数作为参数的方法。

您可以用上面链接中的兼容层替换一些GM_*权限。然后你可以通过设置@grant none来禁用沙箱,你就做好了准备。

但是,如果您需要原始函数,可以使用[].filter.call(temp, fil)而不是temp.filter(fil),如注释中所述。