无法正确地向内容脚本发送消息

时间:2014-07-02 13:36:13

标签: javascript google-chrome-extension

我非常接近完成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. 在第一个代码块中,一旦我右键单击链接,它就会立即将已保存的未定义警告<书签,而据我所知它应该只发送一条消息右键单击,当我单击上下文菜单时,第二个代码块应提醒保存 到书签。我错过了什么或做错了什么?
  2. 我可能没有正确使用参数(我对扩展开发和Javascript一般都很新)。上面看起来没问题吗?
  3. 提前谢谢你,

    ķ。

2 个答案:

答案 0 :(得分:2)

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

过去,chrome.extension.sendRequestchrome.extension.onRequest已被弃用,转而采用上述chrome.runtime API方法。

请参阅Chrome Extensions - Message Passing

答案 1 :(得分:0)

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

应该是:

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