Chrome扩展程序:创建了多个页面

时间:2018-11-19 13:07:38

标签: javascript google-chrome-extension

我仍在学习使用javascript编程的知识,而且我也不熟悉Chrome扩展程序。 我尝试开发一个扩展程序,该扩展程序会将选定的文本或图像传输到另一个网页。 一切都可以正常发送图像和文本。 但是,当我多次使用扩展名时,出现文本问题。例如,如果我使用3次,它将在与发送信息的网页相同的选项卡上打开3次。 我认为问题可能出在每次单击时都会注入的内容脚本。但是我不确定,也不知道解决方案。

这是背景文件:

function getClickHandler() {
   function getPageDetails(callback) {
    // Inject the content script into the current page
    chrome.tabs.executeScript(null, { file: 'content.js' });
    // Perform the callback when a message is received from the content script
    chrome.runtime.onMessage.addListener(function(message)  {
        // Call the callback function
        callback(message);
    });
};
function onPageDetailsReceived(details) {
      transfer1= details.summary;
       transfer2= details.url;
       transfer3= details.title;
     page = " http://www.example.com/testing.php?trans1=" + transfer1+"&trans2="+transfer2+"&trans3="+transfer3;
      chrome.tabs.create({"url": page});


}
  return function(info, tab) {

    // The srcUrl property is only available for image elements.
    var url = info.srcUrl;
    if (url == null)
    {
    getPageDetails(onPageDetailsReceived);

    }
    else
    {
        page = " http://www.example.com/testing.php?trans4=" + url;
      chrome.tabs.create({"url": page});
      }
  };
};


chrome.contextMenus.create({
 title : "testing",
  type : "normal",
  contexts : ["image","selection"],
   onclick: getClickHandler()
  });

这是content.js:

chrome.runtime.sendMessage({
    'title': document.title,
    'url': window.location.href,
    'summary': window.getSelection().toString(),
         });

感谢您的帮助和建议!

1 个答案:

答案 0 :(得分:0)

每次调用chrome.runtime.onMessage.addListener时,它都会添加一个另一个侦听器,所有侦听器都会在每个消息上触发。

如果您打算只调用一个特定的处理程序一次,则需要通过引用该处理程序的调用removeListener来实现一些自注销逻辑。

如果您只需要一个不变的处理程序(这似乎是您的情况),则需要注意只调用一次addListener

从当前代码的外观来看,您可以在顶层使用chrome.runtime.onMessage.addListener

chrome.runtime.onMessage.addListener(function(message)  {
    onPageDetailsReceived(message);
});

,然后将其从getPageDetails中删除。我知道有意将callback配置为可配置,但是您在这里不需要它,或者至少您需要确保侦听器仅注册一次。