【问题标题】:Accessing to DOM functions from Firefox extension从 Firefox 扩展访问 DOM 函数
【发布时间】:2014-07-04 11:32:14
【问题描述】:

需要从 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;

【问题讨论】:

  • 当你使用 DOM 函数时,你显然是在某个文档上使用它。所以使用该文档的范围来访问它的 DOM 函数。

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


【解决方案1】:

main.js 只会运行一次,而不是针对每个窗口或选项卡。

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

内容脚本当然是你的querySelectorAllsn-p。

【讨论】:

    【解决方案2】:

    我知道人们不会喜欢我向您推荐这个,他们希望您使用 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 返回的窗口对象是浏览器窗口,而不是我认为您期望的 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;
                }
            }
    
        }
    }
    

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

    【讨论】:

    • 在今年晚些时候 Firefox 进入多进程之后,像这样直接访问文档将会很慢或损坏。
    • 哎呀,这就是我如何做我的引导加载项的所有事情。它是 bootstrap bolierplate 的基础。 bootstrap 支持多进程的推荐方式是什么?
    • 新的Message Manager api。如果您继续使用同步访问内容,您的代码可能会中断或使用CPOWS aka 跨进程对象包装器。
    • 谢谢伙计!我担心这会引起很多开发人员的不满 :( 如果他们能保持不变,那就太好了。你知道我可以在哪里测试这些东西吗?是每晚只启用 pref 吗?或者我可以做到吗测试版?
    • 目前仅适用于 Nightly,距离发布还有几个月的时间。这会激怒开发人员,这是它花了这么长时间的原因之一。 CPOWS 可能会让很多附加组件继续工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 2016-09-13
    • 2012-01-09
    相关资源
    最近更新 更多