注JS职能进入网页从油猴子的脚本上铬
题
我有一个油猴子的脚本,工作只是现在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);
请注意反引号 ``
这一定义的开始和结束多行串。