【问题标题】:How do I access the popup page DOM from bg page in Chrome extension?如何从 Chrome 扩展中的 bg 页面访问弹出页面 DOM?
【发布时间】:2010-05-05 00:20:34
【问题描述】:

在谷歌浏览器的extension developer section 中,它说

扩展中的 HTML 页面 可以完全访问彼此的 DOM,它们可以调用函数 彼此。 ...弹出的内容 是由 HTML 文件定义的网页 (popup.html)。弹出窗口不需要 复制代码中的 背景页面 (background.html) 因为弹出窗口可以调用函数 在后台页面上

我已经加载并测试了 jQuery,并且可以使用 jQuery 访问 background.html 中的 DOM 元素,但我不知道如何从 background.html 访问 popup.html 中的 DOM 元素。

【问题讨论】:

    标签: google-chrome google-chrome-extension


    【解决方案1】:

    你能谈谈你为什么要这样做吗?背景页面是在您的扩展程序的生命周期内永远存在的页面。而弹出页面仅在您单击弹出窗口时才存在。

    在我看来,它应该被重构,你的弹出窗口应该从后台页面请求一些东西。您只需在弹出窗口中执行此操作即可访问后台页面: chrome.extension.getBackgroundPage()

    但如果您坚持,您可以使用带有sendRequest()onRequest 的扩展页面进行简单通信。或许你可以使用chrome.extension.getViews

    【讨论】:

    • 昨天我在调查时意识到弹出窗口似乎是短暂的;每次打开脚本时都会重新加载脚本。我曾假设它是一个持久对象。但是现在我看到任何弹出状态都需要存储在后台并在弹出窗口打开时加载。
    • 我最终来到这里的原因是,在我的 Chrome 扩展程序中,使用弹出 UI 触发了一个操作,但实际工作是在后台脚本中完成的,所以我希望 UI 根据如何更改后台脚本报告的操作需要多长时间。
    【解决方案2】:

    我明白你为什么要这样做,因为我自己也遇到了问题。

    我能想到的最简单的方法是使用 Google 的回调方法 - sendRequest 和 onRequest 方法也可以,但我发现它们笨拙且不那么简单。

    Popup.js

    chrome.extension.getBackgroundPage().doMethod(function(params)
    {
        // Work with modified params
        // Use local variables
    });
    

    Background.html

    function doMethod(callback)
    {
        if(callback)
        {
            // Create/modify params if needed
            var params;
    
            // Invoke the callback
            callback(params);
        }
    }
    

    【讨论】:

    • 那不行,你不能从内容脚本访问后台页面。他们生活在不同的世界。您可以从内容脚本访问后台页面的唯一方法是通过消息传递。您可以在 stackoverflow 上快速搜索一些示例。
    • @Mohamed:问题是关于弹出页面,而不是内容脚本。
    【解决方案3】:

    正如其他答案所提到的,您可以像这样从 popup.js 调用 background.js 函数:

    var _background = chrome.extension.getBackgroundPage();
    _background.backgroundJsFunction();
    

    但要从 background.js 访问 popup.js 或 popup.html,您应该像这样使用消息架构:

    // in background.js
    chrome.runtime.sendMessage( { property: value } );
    
    // in popup.js
    chrome.runtime.onMessage.addListener(handleBackgroundMessages);
    function handleBackgroundMessages(message)
    {
        if (message.property === value)
            // do stuff
    }
    

    不过,你似乎可以从 background.js 同步访问 popup.js,就像你可以反过来同步访问一样。 chrome.extension.getViews 可以让您弹出window 对象,您可以使用它来调用函数、访问变量和访问 DOM。

    var _popup = chrome.extension.getViews( { type: 'popup' } )[0];
    _popup.popupJsFunction();
    _popup.document.getElementById('element');
    _popup.document.title = 'poop'
    

    请注意,如果弹出窗口未打开,getViews() 将返回 [],因此您必须处理它。

    我不确定为什么没有其他人提到这一点。也许我忽略了一些陷阱或不良做法?但是在我自己扩展的有限测试中,它似乎有效。

    【讨论】:

    • getViews 在 ManifestV3 服务工作者中不起作用,并且永远不会起作用,因为工作者使用单独的线程。您可以改用消息传递。归功于 wOxxOm。 stackoverflow.com/questions/67245672/…
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多