【问题标题】:What could stop Array.prototype.filter() from running in greasemonkey script that runs fine in console什么可以阻止 Array.prototype.filter() 在控制台中运行良好的greasemonkey脚本中运行
【发布时间】:2015-11-12 15:53:22
【问题描述】:

代码如下:

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),它的输出就很好。可能是什么原因?

编辑澄清:当在greasemonkey 中运行时,字符串'fil' 永远不会被写入控制台,这表明永远不会调用fil()。另外,如果我执行console.log(temp.filter(fil)); 之类的操作,当代码从greasemonkey 运行时,我永远无法在控制台中看到结果。 (虽然我知道它应该是因为上面的行告诉我temp 存在并且代码运行到那个点。

【问题讨论】:

  • “输出还不错”是什么意思?你看到过滤后的数组了吗?为了方便起见,firebug 控制台会向您显示函数调用的结果,但这不是标准行为,虽然如果您不明确要求输出,您的代码可能在greasemonkey 中运行良好,您将不会有任何输出。
  • console.log('fil') 要求输出? “输出很好”意味着我可以在控制台中看到字符串“fil”(多次)
  • 哦,没关系,我忽略了您的过滤器功能,并认为您希望输出过滤后的数组。那时我真的不知道,对不起。
  • 无论如何你应该使用 Array.prototype.apply 而不是 filter 在这种情况下。也许这会解决你的问题? - 当然,如果您真的打算过滤数组并且只是使用这个模拟函数进行测试,那么该解决方案是无用的......

标签: javascript greasemonkey


【解决方案1】:

就我而言,在 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),如 cmets 中所述。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2019-05-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多