如何解决将数据从网页发送到 chrome 扩展程序的问题?

sha*_*aka 1 javascript google-chrome-extension

我正在尝试将数据从我的网页传递到 chrome 扩展程序。

manifest.json(我首先尝试在本地环境中执行此操作)

  "externally_connectable": {
    "matches": ["*://localhost/*"]
  }
Run Code Online (Sandbox Code Playgroud)

在 listen.js(后台脚本)中:

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.url == blacklistedWebsite)
      return;  // don't allow this web page access
    if (request.openUrlInEditor)
        alert('test2');
        alert(request.openUrlInEditor);
  });
Run Code Online (Sandbox Code Playgroud)

上面没有显示任何警报。

当我导航到 chrome://extensions/ 时,我通过查看 ID 获得了解压后的 chrome 扩展程序的扩展程序 ID。在我的 localhost 环境中的网页中

// DEVELOPMENT extension ID
var editorExtensionId = "fppgjikaoolnlcmdjalbfkmlcadcckmb";

var url = 'test';
// Make a simple request:
chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url},
  function(response) {
    if (!response.success)
      handleError(url);
  });
Run Code Online (Sandbox Code Playgroud)

当我运行这个。在浏览器中,我收到一条错误消息:

Error in event handler for (unknown): TypeError: Cannot read property 'success' of undefined
Run Code Online (Sandbox Code Playgroud)

我不确定从哪里开始调试。

ele*_*ser 6

在对您的代码进行一些更改后,我能够实现您的目标。

请参阅下面的完整代码。

清单文件

{
  "manifest_version": 2,
  "name": "CS to Bg Communication",
  "version": "0.1",
  "background": {
    "scripts": ["listen.js"]
  },
  "content_scripts": [
    {
      "all_frames" : true,
      "matches": ["<all_urls>"],
      "js": ["contentscript.js"]
    }
  ],
  "browser_action": {
    "default_popup": "popup.html"
  },
  "externally_connectable": {
    "matches": ["*://localhost/*"]
  }
}
Run Code Online (Sandbox Code Playgroud)

listen.js - 后台脚本

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    blacklistedWebsite = 'http : / / yourdomain . com /';
    if (sender.url == blacklistedWebsite)
      return;  // don't allow this web page access
    if (request.openUrlInEditor) {
        alert('test2 - ' + request.openUrlInEditor);
        sendResponse({"success": true, "AckFromBG": "I have received your messgae. Thanks!"}); // sending back the acknowlege to the webpage
    }
});
Run Code Online (Sandbox Code Playgroud)

contentscript.js - 内容脚本 - 实际上什么都不做

console.log("this is content script");
Run Code Online (Sandbox Code Playgroud)

web-page.html - 本地网页

<html>
    <body>

        This page will will send some message to BG script

        <script type="text/javascript">
            // DEVELOPMENT extension ID
            var editorExtensionId = "fjaedjckfjgifecmgonfmpaoemochghb"; // replace with your extension ID
            var url = 'test';
            chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url}, function(response) {
                console.log(response);
                if (!response.success)
                    handleError(url);
            });
            function handleError(url) {
                console.log(url);
            }
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

变更概要:

  • 已定义blacklistedWebsite- 这是未定义的。

  • 添加sendResponse({"success": true, "AckFromBG": "I have received your messgae. Thanks!"});以将确认发送回网页。

  • 定义function handleError(url) { console.log(url); }这个没有定义。

就是这样。希望这能解决您的问题。