1

我是铬扩展的新手,我在开始时遇到了一些问题。邮件在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> 

弹出.js文件

document.addEventListener('DOMContentLoaded', function() { 
    chrome.tabs.getSelected(null, function(tab) { 
     chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(response) { 
      console.log(response.farewell); 
     }); 
    }); 
}); 

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"}); 
    }); 

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

+0

我没看到你的代码有什么问题。你的Chrome版本是什么?根据您的总体目标,我认为您应该听取'chrome.browserAction.onClicked'(不弹出)并以编程方式注入内容脚本(https://developer.chrome.com/extensions/content_scripts.html#pi)在事件处理程序中。 –

+0

@方觉我发送给内容脚本的消息取决于弹出窗口中的某些用户输入,所以我需要它。我的Chrome版本是26.0.1410.63版。 – gsingh2011

回答

2

我刚刚将您的代码复制到我的机器上,并按原样运行,并按预期工作。不过,我想你可能会对感到困惑,其中console.log的输出结果会显示出来。

打开任何网页并打开该页面的控制台。点击你的浏览器动作,弹出窗口出现,果然出现from a content script:chrome-extension://fndmlopghajebfadeabnfnfmhalelokm/popup.html行。

虽然没有看到您的goodbye行显示,但因为这是从popup.js注销的,而不是标签的内容脚本。让我们打开弹出窗口的检查器,然后在那里查找goodbye消息。右键单击浏览器操作图标并选择“Inspect popup”菜单项。您的(空)弹出窗口显示,并出现一个新的检查器窗口;选择控制台选项卡,您将在那里看到goodbye消息。请参阅Chrome Extension Debugging tutorial

PS。chrome.tabs.getSelected已弃用;代替you should use chrome.tabs.query。我同意方觉 - 你应该考虑使用程序注入来改变你的DOM。

+0

谢谢,这有助于。是否可以将数据传递给您以编程方式注入的脚本?这就是我没有这么做的原因,我不认为有可能将任何数据传递给脚本。 – gsingh2011

+0

@ gsingh2011:per [PI文档](https://developer.chrome.com/extensions/content_scripts.html#pi),你可以建立一个任意字符串发送到'chrome.tabs.executeScript'。或者,您可以通过'chrome.tabs.executeScript(null,{file:“content_script.js”});''在需要时插入您的内容脚本,而不是在每个页面上。这将允许您使用您计划的相同体系结构,而不必为用户打开的每个页面添加不必要的脚本。 –

-1

popup.js脚本将在加载popup.html(DOMContentLoaded)时启动该文件。但肯定的是,内容将被注入脚本还没有在任何网页,因为你没有时间没有时间打开它,并且“匹配”:[“http:// */*”],没关系。通过后台脚本更改后台内容脚本,我认为它会起作用。

+0

我认为内容脚本是在页面加载时注入的,这是在我打开popup.html之前... – gsingh2011

相关问题