【问题标题】:Cannot send message to content script properly无法正确向内容脚本发送消息
【发布时间】:2014-07-02 13:36:12
【问题描述】:

我即将完成我的 Chrome 扩展程序。我有一两件事要做。其中之一是从内容脚本向后台脚本发送消息。我写了以下内容,但这并不是我想要的。

content.js

var a=document.getElementsByTagName('a');
for (i=0,len=a.length;i<len;i++) {
  a[i].addEventListener('contextmenu', function() {
    var linkTitle = this.getAttribute('title').trim();
    var linkUrl = this.getAttribute('href');
    if ((linkTitle != null) && (linkTitle.length > 0)) {
      chrome.extension.sendMessage({action:'bookmarkLink', 'title':linkTitle, 'url': linkUrl}, function(msg) {
        alert('Messages sent: '+action+' and '+linkTitle+' also '+linkUrl);
      });
    }
  });
};

background.js

chrome.contextMenus.create({'title': 'Add to mySU bookmarks', 'contexts': ['link'], 'onclick': mySUBookmarkLink});

function mySUBookmarkLink(info, tab) {
  chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {
    if (msg.action == 'bookmarkLink') {
      chrome.storage.sync.set({'title': msg.linkTitle, 'url': msg.linkUrl}, function(msg) {
        alert('Saved '+msg.linkTitle+' to bookmarks');
      });
    } 
  });
};

我的问题是:

  1. 在第一个代码块中,只要我右键单击链接,它就会提醒 Saved undefined 到书签,而据我所知,它应该只在右键单击,当我单击上下文菜单时,第二个代码块应该提醒 Saved 到书签。我错过了什么或做错了什么?
  2. 我可能没有正确使用参数(我对扩展开发和一般的 Javascript 相当陌生)。以上看起来好吗?

提前谢谢你,

K.

【问题讨论】:

    标签: javascript google-chrome-extension


    【解决方案1】:

    它是chrome.runtime.sendMessagechrome.runtime.onMessage,而不是chrome.extension

    曾经有 chrome.extension.sendRequestchrome.extension.onRequest 已被弃用,取而代之的是上面提到的 chrome.runtime API 方法。

    Chrome Extensions - Message Passing

    【讨论】:

    • 我明天试试。谢谢你:)
    【解决方案2】:

    它是 JSON 可序列化消息,其中第一对用于识别,然后是成对的
    key: value
    您可以通过调用它的键来从收到的消息中提取值。

    应该是:

    alert('Saved '+msg.title+' to bookmarks');
    

    甚至更好:

    function mySUBookmarkLink(info, tab) {
      chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {
        if (msg.action == 'bookmarkLink') {
          var receivedValue = msg.title; //pull it out first, for better overview
          chrome.storage.sync.set({'title': msg.title, 'url': msg.url}, function(msg) {
            alert('Saved '+receivedValue+' to bookmarks');
          });
        } 
      });
    };
    

    【讨论】:

    • 没有chrome.extension.onMessage
    • 是的,有。即使这些方法已被弃用,它们仍然可用。我刚刚在最新的 Canary 中对其进行了测试。他的问题不是 chrome.runtime >> chrome.extension,而是语法错误。请不要仅仅因为你没有得到问题就拒绝我的回答:)
    • granted ...随着时间的推移,Chrome 开发人员对 API 的使用次数之多令人惊讶。有 chrome.extension.sendMessage(甚至在 API 文档中都没有提到)、chrome.extension.sendRequest(在 API 文档中标记为已弃用),最后是 chrome.runtime.sendMessage,这是目前首选方式。让我们看看接下来会发生什么
    • 仍然...我认为您应该将 msg.linkTitle 替换为 msg.title 并将 msg.linkUrl 替换为 msg.url,因为这就是定义已发送对象的方式
    • 是的,忽略了...我刚刚复制了他的代码并更改了警报,没有意识到 chrome.storage.sync.set 也是错误的...但是 OP 可能会得到它来自描述 :)...关于 API 混乱,我最喜欢的是 chrome.app.window .... 大量边界(尺寸)+已弃用+错误 ....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2018-12-25
    相关资源
    最近更新 更多