Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome扩展中的消息传递不工作_Javascript_Google Chrome_Google Chrome Extension_Event Listener_Message Passing - Fatal编程技术网

Javascript chrome扩展中的消息传递不工作

Javascript chrome扩展中的消息传递不工作,javascript,google-chrome,google-chrome-extension,event-listener,message-passing,Javascript,Google Chrome,Google Chrome Extension,Event Listener,Message Passing,我是chrome扩展的新手,在开始使用时遇到了一些麻烦 首先,我的总体目标是能够在弹出窗口中单击一个按钮,并在DOM中进行一些更改。如果我理解正确,那么执行此操作的方法是加载内容脚本并向此内容脚本发送消息。这是我在Chrome开发者页面上看到的内容,但我在控制台日志中没有看到任何内容: manifest.json { "manifest_version": 2, "name": "Test", "version": "1.0", "permissions":

我是chrome扩展的新手,在开始使用时遇到了一些麻烦

首先,我的总体目标是能够在弹出窗口中单击一个按钮,并在DOM中进行一些更改。如果我理解正确,那么执行此操作的方法是加载内容脚本并向此内容脚本发送消息。这是我在Chrome开发者页面上看到的内容,但我在控制台日志中没有看到任何内容:

manifest.json

{
    "manifest_version": 2,

    "name": "Test",
    "version": "1.0",

    "permissions": [
        "tabs", "http://*/*"
    ],

    "content_scripts": [
        {
            "matches": ["http://*/*"],
            "js": ["content.js"]
        }
    ],

    "browser_action": {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    }
}
popup.html

<html>
  <body>
    <script src="popup.js"></script>
  </body>
</html>
content.js

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        console.log(sender.tab ?
                    "from a content script:" + sender.tab.url :
                    "from the extension");
        if (request.greeting == "hello")
            sendResponse({farewell: "goodbye"});
    });

很多代码直接来自文档,所以我不知道我做错了什么。

加载popup.html(DOMContentLoaded)时,popup.js脚本将启动该文件。但可以肯定的是,内容将被注入脚本还没有出现在任何网页中,因为您还没有时间打开它,而且“匹配项”:[“http://*/*”]是可以的。按背景脚本更改背景内容脚本,我认为它会工作。

加载popup.html(DOMContentLoaded)时,popup.js脚本将启动文件。但可以肯定的是,内容将被注入脚本还没有出现在任何网页中,因为您还没有时间打开它,而且“匹配项”:[“http://*/*”]是可以的。按背景脚本更改背景内容脚本,我认为它会工作。

我刚刚将您的代码复制到我的计算机上,并按原样运行,它会按您的预期工作。不过,我想您可能会对您期望的
console.log
输出将出现在哪里感到困惑

打开任何网页并打开该网页的控制台。单击您的浏览器操作,弹出窗口显示,并确保内容脚本中的行
:chrome-extension://fndmlopghajebfadeabnfnfmhalelokm/popup.html
出现

但是,您在那里看不到您的
再见
行,因为这是从
popup.js
注销的,而不是选项卡的内容脚本。让我们打开弹出窗口的检查器,并在那里查找
再见
消息。右键单击浏览器操作图标并选择“检查弹出窗口”菜单项。您的(空)弹出窗口显示,并出现一个新的检查器窗口;选择Console选项卡,您将在那里看到
再见
消息

有关其他信息,请参阅


PS.
chrome.tabs.getSelected
已弃用;相反我同意你的看法方 觉 – 您应该考虑使用编程注入来更改DOM。

< P>我只是将您的代码复制到我的机器上,按原样运行它,正如您所期望的那样工作。不过,我想您可能会对您期望的
console.log
输出将出现在哪里感到困惑

打开任何网页并打开该网页的控制台。单击您的浏览器操作,弹出窗口显示,并确保内容脚本中的行
:chrome-extension://fndmlopghajebfadeabnfnfmhalelokm/popup.html
出现

但是,您在那里看不到您的
再见
行,因为这是从
popup.js
注销的,而不是选项卡的内容脚本。让我们打开弹出窗口的检查器,并在那里查找
再见
消息。右键单击浏览器操作图标并选择“检查弹出窗口”菜单项。您的(空)弹出窗口显示,并出现一个新的检查器窗口;选择Console选项卡,您将在那里看到
再见
消息

有关其他信息,请参阅


PS.
chrome.tabs.getSelected
已弃用;相反我同意你的看法方 觉 – 您应该考虑使用编程注入来更改DOM。

我没有发现您的代码有任何错误。你的Chrome版本是什么?根据您的总体目标,我认为您可能应该听
chrome.browserAction.onClicked
(无弹出窗口),并以编程方式在事件处理程序中插入内容脚本()@方觉 我发送到内容脚本的消息取决于弹出窗口中的一些用户输入,因此我需要它。我的chrome版本是26.0.1410.63。我没有发现你的代码有任何问题。你的Chrome版本是什么?根据您的总体目标,我认为您可能应该听
chrome.browserAction.onClicked
(无弹出窗口),并以编程方式在事件处理程序中插入内容脚本()@方觉 我发送到内容脚本的消息取决于弹出窗口中的一些用户输入,因此我需要它。我的chrome版本是26.0.1410.63。我认为内容脚本是在页面加载时注入的,这是在我打开popup.html之前……我认为内容脚本是在页面加载时注入的,这是在我打开popup.html之前……谢谢,这很有帮助。是否可以将数据传递给以编程方式注入的脚本?这就是我没有这样做的原因,我认为不可能向脚本传递任何数据。@gsingh2011:per,您可以创建任意字符串发送到
chrome.tabs.executeScript
。或者只需在需要时插入内容脚本,而不是在每个页面上,通过
chrome.tabs.executeScript(null,{file:“content_script.js”})。这将允许您使用与计划中相同的体系结构,而无需向用户打开的每个页面添加不必要的脚本。谢谢,这很有帮助。是否可以将数据传递给以编程方式注入的脚本?这就是我没有这样做的原因,我认为不可能向脚本传递任何数据。@gsingh2011:per,您可以创建任意字符串发送到
chrome.tabs.executeScript
。或者只需在需要时插入内容脚本,而不是在每个页面上,通过
chrome.tabs.executeScript(null,{file:“content_script.js”})。这将允许您使用计划中的相同体系结构,而无需向用户打开的每个页面添加不必要的脚本。
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        console.log(sender.tab ?
                    "from a content script:" + sender.tab.url :
                    "from the extension");
        if (request.greeting == "hello")
            sendResponse({farewell: "goodbye"});
    });