Расширения Chrome: создано более одной страницы - PullRequest
0 голосов
/ 19 ноября 2018

Я все еще изучаю кодирование в javascript, и я также не знаком с расширениями Chrome.Я пытаюсь разработать одно расширение, которое будет передавать выбранный текст или изображение на другую веб-страницу.Все отлично работает для отправки изображения, а также для текста.Но с текстом возникают проблемы, когда я использую расширение более одного раза.Если я использую его 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 голосов
/ 19 ноября 2018

Каждый раз, когда вызывается chrome.runtime.onMessage.addListener, он добавляет другого слушателя, каждый из которых продолжает вызывать каждое сообщение.

Если вы намереваетесь вызывать определенный обработчик только один раз,вам нужна некоторая логика саморегистрации, вызывая removeListener со ссылкой на обработчик.

Если вам когда-либо нужен только один обработчик, который не меняется (что, как кажется, ваш случай), вам нужно принятьНе забудьте позвонить addListener только один раз.

Исходя из вашего текущего кода, вы можете взять chrome.runtime.onMessage.addListener на верхнем уровне:

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

, а затем удалить его из getPageDetails.Я понимаю намерение сделать callback настраиваемым, но вам это здесь не нужно, или, по крайней мере, вам нужно убедиться, что слушатель зарегистрирован только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...