我有一个油猴子的脚本,工作只是现在Firefox和歌剧院。我斗争得到它的工作在铬,但是。该问题注入一个功能进入网页,可以援引通过代码从页。这里是我在做什么,迄今为止:

第一,我得到一个辅助参考 unsafeWindow 为Firefox。这让我有同样的代码,用于FF和歌剧院(和铬,我想)。

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

接下来,我注入一个功能进入网页。这真的只是一个非常薄的包装,这并没有什么但是援引了相应的功能在我的通用脚本:

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);

以总结:在火狐,当用户的点击次数,注链接,它将执行的功能的呼吁unsafeWindow,然后触发超时调用相应的功能在我的通用脚本,然后执行实际的处理。(纠正我,如果我错了这里.)

在铬的,我刚得到一个"未捕获的ReferenceError:setConfigOption不是定义的"错误。实际上,进入"窗口。setConfigOption"到控制台产生了一个"未定义的".在萤火和歌剧开控制台功能是存在的。

也许还有另一种方式来做到这一点,但我的几个功能援引一个闪光对象的网页,其中我相信使必要的,我有功能在网页上下文。

我花了快看 替代unsafeWindow 在油猴子的wiki,但他们都看起来很丑陋。我完全错误的轨道在这里或者我应该更仔细地进入这些?

决议: 我跟着 Max S.'的建议 和它的工作在两个火狐和铬现在。因为我需要提供的网页不得不叫回到普通的那种,我把我的整个剧本的网页,即它完全的包裹进入功能,他被称为'主要()'.

要使额外的uglyness的,黑客多一点可以忍受,我至少可以降的使用情况的unsafeWindow和wrappedJSObject。

我还没有得到 内容范围的亚军 从油猴子的wiki工作。它应该做的一样,它似乎是执行得很好,但我的功能是从来没有访问 <a> 元素的网页,例如。我还没有想通了,为什么,是。

有帮助吗?

解决方案

在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'));

injected.js:

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

main();
  

我参加了一个快速浏览一下替代unsafeWindow 在Greasemonkey的维基,但他们都看起来很丑陋。上午我完全在错误的轨道在这里或者我应该更仔细地到这些?

您应该看看,因为它是唯一可用的选项。我宁愿使用位置劈

myscript.user.js:

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

location.href="javascript:(function(){" + myFunc + "})()"

example.com/mypage.html

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

当然,这是难看。但它运作良好。


内容范围转轮方法,由Max S.提到优于位置劈,因为它更容易调试。

其他的答案,无论是强迫你使用 功能表达, 导入一个 外部附加文件 或者使用 只要修补哈克.

这个答案将增加javascript成的网页直接从你的源码。它将使用写6(ES6) 模板上的文字 获得多线javascript串毫不费力地到的页面。

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.innerHTML = ` 
   function test() {
      alert(1);
   }
`;
document.getElementsByTagName('head')[0].appendChild(script);

请注意反引号 `` 这一定义的开始和结束多行串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top