2015-12-06 4 views
1

Я пишу расширение chrome и на некоторых веб-сайтах chrome.tabs.onUpdated.addListener() вызывается дважды.chrome.tabs.onUpdated.addListener() вызывается дважды

В основном это происходит, если я нажимаю ссылку, а не когда я набираю URL-адрес самостоятельно.

Из того, что я нашел в Интернете, и из многих вопросов, заданных на StackOverflow, была ошибка на хроме, но она была исправлена ​​несколько лет назад.

Некоторые люди утверждают, что это происходит, если на странице есть несколько фреймов, но в моем случае на моей странице нет фреймов.

Это мой код:

var storage = chrome.storage.local; 

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { 
    if (changeInfo.status == 'complete' && tab.status == 'complete' && tab.url != undefined) { 
      storage.get('URLs', function(URLs){ 
       for (var item in URLs) 
       { 
        if (tab.url == item) 
        { 
         return; 
        } 
        else 
        { 
         //alert ("tab load complete"); 
         storage.set({URLs: [tab.url]}); 
         chrome.tabs.executeScript(tab.id, { 
         "file": "flashblocker.js" 
         }, function() { // Execute your code 
         console.log("Script Executed .. "); // Notification on Completion 
         }); 
        } 
       } 
      }); 
    } 
}); 

Как я могу сделать это запустить только один раз?

Спасибо.

+0

onUpdated может быть вызван при вызове API истории или изменении хэша '#foo'. Я думаю, вам нужно использовать метод @Nikhil. –

ответ

2

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

var tabUpdated = false; 
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { 
    if (changeInfo.status == 'complete' && tab.status == 'complete' && tab.url != undefined) { 
     if (!tabUpdated) { 
      alert("tab load complete"); 
      tabUpdated = true; 
     } 
    } 
}); 

Но это не сработает, если сценарий содержание фактически загружаются в два раза переменная tabUpdated снова будет инициализирован ложь. В этом случае вы можете использовать API хранения хром и сохранить URL-адрес, для которого прослушиватель уже вызван. Просто добавьте проверку для этого, если URL-адрес находится в хранилище, предупреждение не будет вызвано, иначе оно будет вызываться. Затем вы можете очистить хранилище при запуске или закрытии браузера.

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { 
    if (changeInfo.status == 'complete' && tab.status == 'complete' && tab.url != undefined) { 
     chrome.local.storage.get('URLs', function(URL's) { 
      // Iterate through this list here and match with tab.url, if the match is found, just return. 
      if (url is there in list) {return;} 
      else { 
       alert("tab load complete"); 
       chrome.local.set({URLs: [tab.url]}); 
      } 
     }); 
    } 
}); 

Это просто пример того, как вы можете достичь этого. Подстройте его в соответствии с вашими потребностями.

Надеюсь, это поможет.

+0

Nikhil благодарит за комментарий. Он работает с предупреждением («»), но проблема в том, что я пытаюсь запустить скрипт (я обновил свой ответ с помощью кода), и скрипт все еще работает дважды. Любая идея? – Shay

+0

Да, потому что вы заменяете старый URL на новый. Просто добавьте новый URL-адрес в старый массив URL-адресов, а затем сохраните его с помощью 'storage.set()'. Храните URL-адреса, которые вы используете с помощью 'storage, get()' для переменной, а затем в блоке else добавьте новый URL-адрес в этот массив и затем сохраните. Извините, я забыл добавить код в свой ответ. Просто попробуйте это так. Надеюсь, это поможет. –

+0

Кроме того, просто используйте переменную, чтобы сохранить результат поиска совпадения или нет, а затем используйте эту переменную, если else заблокирован за пределами цикла for. Используйте break вместо возврата. Можете ли вы подумать, почему его не следует проверять внутри цикла. ?? –

Смежные вопросы