Mobile 移动Firefox(Fennec)插件:在页面加载时执行代码

Mobile 移动Firefox(Fennec)插件:在页面加载时执行代码,mobile,firefox-addon,fennec,Mobile,Firefox Addon,Fennec,我正在尝试编写一个移动firefox插件,在每次加载页面时自动执行一段javascript代码。我为早期版本的Fennec编写了一些代码,但是在更新的Fennec版本中使用了多处理系统(https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis/),此代码必须进行移植。我基于来自的一个教程来获得一个版本,每当在浏览器菜单中选择一个选项时,该版本都会执行一段代码。此解决方案由两部分组成,即overlay.js(用于主(应用程序)进程

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

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”之类的),但什么都找不到

有人对如何在每次加载页面时自动执行代码有什么想法吗

问候,


William

在content.js脚本中,您只需为“load”事件注册一个事件侦听器,就像在旧的单进程Firefox中一样:

addEventListener("load", someFunc, true);
每当在选项卡中加载网页时,这将调用“someFunc”

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

这对我很有效

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 ...
}

你好,马克,谢谢你的快速回复(还有你的教程!)。在发布我的问题后,我在content.js中尝试了类似的东西,尝试addEventListener(带有“load”和“DOMContentLoaded”),然后在content、content.document、content.windowRoot之前添加内容。。出于某种原因,如果没有“true”参数(不确定原因),它就无法工作。所以,它现在起作用了,非常感谢!addEventListener(…)适用于某些事件,但诀窍是在“content”对象有效且尚未触发要侦听的事件时设置事件侦听器。“内容”是网页的DOM窗口,因此在加载新页面时会发生更改。将全局对象用于addEventListener意味着侦听器始终可用,而使用“true”意味着捕获事件,即使事件本身没有气泡。并不是所有的DOM事件都需要“true”,因为它们已经冒泡了。好吧,事情对我来说越来越清楚了:)再次感谢。