2011-07-14 82 views
3

我正在尝试编写一个移动Firefox插件,每次加载页面时都会自动执行一段JavaScript代码。我已经为早期版本的Fennec编写了一些代码,但是在更新的Fennec版本(https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis/)中使用了多处理系统,该代码必须是移植。我基于http://people.mozilla.com/~mfinkle/tutorials/的教程获得了一个可以在浏览器菜单中选择一个选项时执行一段代码的版本。该解决方案由两部分组成,即overlay.js(用于主(应用程序)进程)和content.js(用于子进程)。 overlay.js中通过下面的代码加载在overlay.xul,而content.js被装载新的选项卡在overlay.js中:移动Firefox(Fennec)附加组件:执行页面加载代码

window.messageManager.loadFrameScript("chrome://coin/content/content.js", true); 

在overlay.js中的代码将消息发送到content.js每当点击浏览器菜单中的选项,然后正确执行所需的代码(某些脚本标记仅添加到页面的头部)。但是,我不知道如何在页面加载时自动执行代码。我在content.js中尝试了以下内容:

function addCoin(aMessage) { ... } 

// this executes the desired code every time an option is clicked in the browser menu 
addMessageListener("coin:addCoin", addCoin); 

// this attempts to execute the code on every page load; i.e., after this script has  
been loaded for the new tab 
addCoin(null); 

但是最后一条语句没有效果。然后,我试图在最后加入以下语句:

sendAsyncMessage("coin:scriptLoaded", { }); 

该语句将消息发送到所述overlay.js中脚本,这对于该消息,并且响应寄存器收听者简单地发送相同的消息作为当选项在浏览器菜单中单击,即“coin:addCoin”。但是,这也不起作用。最后,我尝试寻找overlay.js脚本可以侦听的某些事件(如“tabOpened”或其他),但找不到任何东西。

有没有人有关于如何在每个页面加载自动执行代码的任何想法?

问候,

威廉

回答

3

在你content.js脚本,你可以简单地注册一个事件侦听器“load”事件,就像你会在老单进程的Firefox:

addEventListener("load", someFunc, true); 

这会在网页加载到标签页时随时调用“someFunc”。

content.js中的任何全局代码在标签初始创建时执行,而不是在页面加载时执行。使用全局代码来设置事件监听器或消息监听器。网页内容仍会触发您可以在content.js(子脚本)中捕获的事件。

+0

您好马克,感谢您的回复迅速(和你的教程!:)。在发布我的问题后,尝试了content.js中的类似内容,尝试addEventListener(使用“load”和“DOMContentLoaded”),然后预先考虑内容,content.document,content.windowRoot,..由于某些原因, “真实”参数(不知道为什么)。所以,它现在起作用了,非常感谢! –

+0

content.addEventListener(...)适用于某些事件,但技巧是在“content”对象有效时设置事件侦听器,并且尚未触发您要侦听的事件。 “内容”是网页的DOM窗口,所以它会在新页面加载时更改。将全局对象用于addEventListener意味着监听器始终可用,并且使用“true”意味着事件被捕获,即使它本身没有冒泡。并非所有的DOM事件都需要“真实”,因为它们已经泡沫化了。 –

+0

好吧,事情变得越来越清楚知道:)再次感谢。 –

1

这对我有效。

content.js

var addEventListener; 

if (window.BrowserApp) { // We are running in Mobile Firefox 
    addEventListener = window.BrowserApp.deck.addEventListener; 
} else { 
    var appcontent = document.getElementById("appcontent"); 
    if (appcontent) { 
     addEventListener = appcontent.addEventListener; 
    } 
} 

if (addEventListener) { 

    var onDOMContentLoaded = function() { /* Code here */ }; 
    addEventListener("DOMContentLoaded", onDOMContentLoaded, true); 

    var onLoad = function() { /* Code here */ }; 
    addEventListener("load", onLoad, true); 

    // etc ... 
}