Chrome扩展程序:如何在非活动选项卡上激活内容脚本

时间:2017-01-31 08:01:50

标签: javascript google-chrome-extension

我正在制作烂番茄扩展,如果你输入电影名称,它将显示评论家/观众得分。现在,我正在尝试让我的后台脚本与内容脚本进行通信,以操作打开的电影选项卡的DOM。存在一个小问题:内容js只能在监听活动选项卡上设置的消息时打印到屏幕上。

编辑:为了澄清我上面写的内容,我试图从非活动选项卡中抓取数据。到目前为止,我只能让script.js在活动选项卡中响应。我推断,为了用chrome api刮一页,必须在标签中打开;但是,我不希望打开的选项卡中断用户的网上冲浪,因此不活动的选项卡。如果某人有更容易的方法去做这件事我就是全部的耳朵。

background.js(这可行)

chrome.runtime.onMessage.addListener(
    function(request,sender,sendResponse){
        if(request.message==="clicked_browser_action"){

            chrome.tabs.query({"active":true, "currentWindow":true},function(tabs){
                console.log(tabs)
                var activeTab = tabs[0];
                console.log(activeTab)
                chrome.tabs.sendMessage(activeTab.id, {"message":"message2Tab"})
            })
        }
    })

但不是这样:

chrome.runtime.onMessage.addListener(
    function(request,sender,sendResponse){
        if(request.message==="clicked_browser_action"){

            chrome.tabs.query({"currentWindow":true},function(tabs){
                var activeTab = tabs[tabs.length-1]; //find last tab
                console.log(activeTab)
                chrome.tabs.sendMessage(activeTab.id, {"message":"message2Tab"})
            })
        }
    })

content.js:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log('started')
    if( request.message === "message2Tab" ) {
    console.log('started')

    }
  }
);

popup.html

<!DOCTYPE html>
<script src="jquery-3.1.1.min.js"></script>
<script src="popup.js"></script>
Search RT for Movie: <input type="text" value=""><input type="submit" id="rt">
</div>

的manifest.json

{
    "manifest_version":2,
    "name":"extension",
    "version":"0.1",
    "content_scripts":[
        {
            "matches": [
                "<all_urls>"
            ],
            "js":["content.js"]
        }],
    "browser_action":{
                "default_icon":"icon.png",
                "default_popup":"popup.html"
            }
        ,
    "background":{
        "scripts":["background.js"]
    },
    "permissions":[
        "tabs"
    ]

}

我在earlier SO question发布了完整的代码。非常感谢你的帮助到目前为止

1 个答案:

答案 0 :(得分:0)

我使用chrome存储来在标签之间进行通信:

content.js

view.setLayoutParam(params)

popup.js

chrome.storage.local.set({"keyName": [critics,audience,title]},function(){console.log('mah critics stored')});