【发布时间】:2011-01-19 04:14:18
【问题描述】:
我有一个在 Firefox 和 Opera 中运行良好的 Greasemonkey 脚本。但是,我很难让它在 Chrome 中工作。问题是将一个函数注入到页面中,该函数可以由页面中的代码调用。以下是我目前正在做的事情:
首先,我得到一个对 Firefox 的 unsafeWindow 的帮助引用。这让我可以为 FF 和 Opera(还有 Chrome,我想)拥有相同的代码。
var uw = (this.unsafeWindow) ? this.unsafeWindow : window;
接下来,我将一个函数注入到页面中。它实际上只是一个非常薄的包装器,除了在我的 GM 脚本的上下文中调用相应的函数之外什么都不做:
uw.setConfigOption = function(newValue) {
setTimeout(setConfigOption, 0, newValue);
}
然后,我的脚本中就有对应的函数:
setConfigOption = function(newValue) {
// do something with it, e.g. store in localStorage
}
最后,我将一些 HTML 注入到页面中,并带有一个链接来调用该函数。
var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);
总结一下: 在 Firefox 中,当用户单击注入的链接时,它将在 unsafeWindow 上执行函数调用,然后触发超时,在我的 GM 脚本的上下文中调用相应的函数,然后执行实际处理。 (如果我在这里错了,请纠正我。)
在 Chrome 中,我只是收到“未捕获的 ReferenceError:未定义 setConfigOption”错误。实际上,在控制台中输入“window.setConfigOption”会产生“未定义”。在 Firebug 和 Opera 开发者控制台中,该功能就在那里。
也许还有另一种方法可以做到这一点,但我的一些函数是由页面上的 Flash 对象调用的,我认为这使得我有必要在页面上下文中拥有函数。
我快速浏览了 Greasemonkey wiki 上的 alternatives to unsafeWindow,但它们看起来都很丑。我在这里完全走错了路还是应该更仔细地研究这些?
解决方案:我关注了Max S.' advice,它现在可以在 Firefox 和 Chrome 中使用。因为我需要对页面可用的函数必须回调到常规函数中,所以我将整个脚本移至页面,即它完全封装在他称为“main()”的函数中。
为了让那个 hack 的额外丑陋更容易忍受,我现在至少可以放弃 unsafeWindow 和 WrappedJSObject 的使用。
我仍然没有设法从 Greasemonkey wiki 获得 content scope runner 工作。它应该做同样的事情并且它似乎执行得很好,但是我的函数永远无法被页面中的<a> 元素访问,例如。我还没弄清楚为什么会这样。
【问题讨论】:
标签: javascript google-chrome google-chrome-extension greasemonkey userscripts