我正在构建一个与youtube网站互动的小插件。 为了在页面中注入自定义脚本,我使用方便的page-mod,如下所示:
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "*",
contentScript: "window.alert('injected');",
contentScriptWhen : 'start',
attachTo: ["existing", "top"],
onAttach: function(worker) {
console.log(worker.tab.url);
}
});
当我浏览页面时,每次加载新页面时都会显示“已注入”消息。但是当涉及到youtube时,我没有得到任何结果。
我访问过的网址是有序的:
https://www.google.com
- > injected
https://www.google.com/?q=youtube
- > injected
https://www.youtube.com
- > injected
https://www.youtube.com/watch?v=lnUeovQ68Tw
- >没什么https://www.youtube.com/results?search_query=dark+side+of+the+moon
- >没什么injected
消息...... 我注意到,当从视频更改为视频时,网址会发生变化,但网页似乎没有重新加载...
当我手动重新加载视频时,我能够在youtube视频上收到injected
消息(cmd+r
或f5
)。
在我搜索时,我发现this article on page-mod's attachTo可能是一个解决方案,但是attachTo: ["existing", "top"]
行的事件,结果是相同的......
你有什么想法吗?
由于
答案 0 :(得分:3)
在查看另一个firefox扩展库时,我找到了一个问题的解决方案:
background.js
pageMod.PageMod({
include : youtubeRegex,
contentScriptFile : 'permanent.js',
onAttach : function(worker){
worker.port.on('update', function(){
console.log('update from contentscript');
worker.port.emit('include'); // call the script update
});
},
contentScriptWhen : 'start',
});
permanent.js
// 1st line of the file
self.port.emit("update");
// stuff called once
// ...
// stuff called on each udpate
self.port.on('include', function(){
window.alert('injected');
});
这样我甚至可以在YouTube网站上获得injected
。
希望它会有所帮助:)
答案 1 :(得分:1)
YouTube使用JS更改其网站的内容。我不确定当youtube更改位置时是否有任何事件被触发。我知道的唯一事件是popstate,只要用户使用后退或前进按钮导航,就会触发(参见https://developer.mozilla.org/en-US/docs/Web/Events/popstate)。