在Chrome上从Greasemonkey脚本将JS函数注入页面

我有一个Greasemonkey脚本,在Firefox和Opera中运行得很好。 但是,我努力在Chrome中使用它。 问题是注入一个函数到页面中的代码可以调用的页面。 以下是我到目前为止所做的:

首先,我得到了Firefox的unsafeWindow的帮助参考。 这使我有相同的FF和Opera代码(和Chrome,我想)。

var uw = (this.unsafeWindow) ? this.unsafeWindow : window; 

接下来,我向页面中注入一个函数。 它实际上只是一个非常薄的包装器,除了在我的GM脚本的上下文中调用相应的函数外,什么也不做:

 uw.setConfigOption = function(newValue) { setTimeout(setConfigOption, 0, newValue); } 

然后,在我的脚本中有相应的function:

 setConfigOption = function(newValue) { // do something with it, eg 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中,我刚刚收到“Uncaught ReferenceError:setConfigOption is not defined”错误。 事实上,input“window.setConfigOption”到控制台产生一个“未定义”。 在Firebug和Opera开发者控制台中,函数就在那里。

也许有另一种方法来做到这一点,但我的一些function是由页面上的一个Flash对象调用的,我相信这使我有必要在页面上下文中的function。

我快速浏览了Greasemonkey wiki上的unsafeWindow的替代品 ,但它们都显得很丑陋。 我在这里完全走错了路,还是应该仔细观察这些?

解决scheme:我跟着Max S.' build议 ,现在可以在Firefox和Chrome上运行。 因为我需要使用的function必须callback到正常的function,所以我把整个脚本移到了页面上,也就是说它被完全包装到了他所谓的“main()”函数中。

为了使这种黑客的额外的丑陋可以忍受一点,我现在至less可以放弃使用unsafeWindow和包裹JSObject。

我还没有设法从Greasemonkey维基上获得内容范围的运行。 它应该这样做,它似乎执行得很好,但我的function是从来没有访问的<页面元素,例如。 我还没弄清楚为什么。

在Chrome中与页面上运行的代码进行通信的唯一方法是通过DOM,因此您必须使用黑客来插入<script>标记和代码。 请注意,如果您的脚本需要在页面上的其他所有内容之前运行,则可能会出现问题。

编辑:这是如何尼斯警报扩展这样做:

 function main () { // ... window.alert = function() {/* ... */}; // ... } var script = document.createElement('script'); script.appendChild(document.createTextNode('('+ main +')();')); (document.body || document.head || document.documentElement).appendChild(script); 

我有这个 :

contentscript.js:

 function injectJs(link) { var scr = document.createElement('script'); scr.type="text/javascript"; scr.src=link; document.getElementsByTagName('head')[0].appendChild(scr) //document.body.appendChild(scr); } injectJs(chrome.extension.getURL('injected.js')); 

inject.js:

 function main() { alert('Hello World!'); } main(); 

我快速浏览了Greasemonkey wiki上的unsafeWindow的替代品 ,但它们都显得很丑陋。 我在这里完全走错了路,还是应该仔细观察这些?

你应该看,因为它只是可用的选项。 我宁愿使用位置攻击 。

myscript.user.js:

 function myFunc(){ alert('Hello World!'); } location.href="javascript:(function(){" + myFunc + "})()" 

example.com/mypage.html

 <script> myFunc() // Hello World! </script> 

当然,这是丑陋的。 但是它运作良好。


内容范围由Max S.提到的Runner方法比位置hack更好,因为它更易于debugging。