从Firefox扩展访问DOM功能

时间:2014-07-04 11:32:14

标签: javascript firefox dom firefox-addon firefox-addon-sdk

需要从Firefox扩展程序访问DOM函数。

我的代码在Firefox控制台上完美运行:

var chk = document.querySelectorAll( 'input[type=checkbox]' );
for (var i=0; i < chk.length; i++)
{
    if (!(chk[i].disabled))
    {
        chk[i].checked = true;
    }
}

我想为Firefox做一个简单的扩展,以便每次都不复制粘贴此代码。但是我遇到了无法从main.js访问DOM函数的问题。

你能否告诉我解决这个问题的方法?

注意:

找到了这个解决方案,但没有帮助:

var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.document;

2 个答案:

答案 0 :(得分:2)

main.js只会运行一次,而不会针对每个窗口或标签运行。

使用PageMod内容脚本或通过tabs.attach附加内容脚本。

内容脚本当然是您的querySelectorAll代码段。

答案 1 :(得分:0)

我知道人们不会喜欢我向你推荐这个,他们希望你使用PageMod等,但我想与你分享,因为我看到你的思想在某个轨道上,而PageMod只是完成了这个轨道。你是在正确的方向那么好的工作。这让我想起了如何解决问题。

使用DOM函数时,显然是在某些文档中使用它。因此,请使用该文档的范围来访问它的DOM函数。

如果文档是您最近使用的文档,请执行以下操作:

var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
var document = window.contentDocument;

var chk = document.querySelectorAll( 'input[type=checkbox]' );
for (var i=0; i < chk.length; i++)
{
    if (!(chk[i].disabled))
    {
        chk[i].checked = true;
    }
}

注意window.contentDocument与你拥有的window.document。 geMostRecentBrowserWindow的窗口对象returend是一个浏览器窗口,而不是我认为你期望的HTML窗口。为此,您必须访问contentDocument

现在,如果文档不是当前选中的标签文档,那么您必须识别标签文档,如下所示:

var wuntils = require('sdk/window/utils');
var window = wuntils.getMostRecentBrowserWindow();
if (window.gBrowser && window.gBrowser.tabContainer) { //this checks to make sure it has tabs
    var tabs = window.gBrowser.tabContainer.childNodes;
    var myTab;
    for (var i = 0; i < tabs.length; i++) {
        if (tabs[i].linkedBrowser.contentDocument.location.href = 'my url') {
            myTab = tabs[i];
            break;
        }
    }
    if (!myTab) {
        console.warn('Could not find tab with location.href == "my url"');
    } else {
        var document = myTab.contentDocument;

        var chk = document.querySelectorAll('input[type=checkbox]');
        for (var i = 0; i < chk.length; i++) {
            if (!(chk[i].disabled)) {
                chk[i].checked = true;
            }
        }

    }
}

现在,如果您打开了多个浏览器窗口,那么您必须浏览所有窗口,然后运行上面的代码以浏览每个窗口中的所有选项卡。如果你想浏览每个窗口,请告诉我另一个话题。