Расширение Chrome: как определить, что скрипт контента уже загружен во вкладку? - PullRequest
11 голосов
/ 14 января 2012

У меня есть следующий код в моем фоновом скрипте:

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) {
    if (changeinfo.status !== 'complete')
        return;

    if (!matchesUrlFilters(tab.url))
        return;

    chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() {
        chrome.tabs.executeScript(tabId, { file: "enhance.js" });
    });
});

Однако в некоторых случаях это, кажется, вводит мой скрипт контента дважды (это может случиться, когда enhance.js делает window.history.pushState).

Как я могу узнать, есть ли на вкладке уже мой скрипт контента?Я попытался chrome.tabs.sendRequest, но он никогда не вызывал функцию обратного вызова, если сценарий содержимого еще не был добавлен.

1 Ответ

10 голосов
/ 14 января 2012

РЕДАКТИРОВАТЬ: Обновлено за первый комментарий к этому ответу.

Вы можете попробовать что-то вроде этого. Добавьте прослушиватель onRequest, который будет использоваться в качестве обратного вызова для загрузки необходимых сценариев, но они будут загружаться только на основе значения, отправленного как часть сообщения запроса. Затем используйте executeScript для непосредственного вызова «кода», который отправляет сообщение со значением глобальной переменной (если она существует).

chrome.tabs.onUpdated.addListener(function(tabId, changeinfo, tab) {
    ...

    // execute a content script that immediately sends back a message 
    // that checks for the value of a global variable which is set when
    // the library has been loaded
    chrome.tabs.executeScript(tabId, {
        code: "chrome.extension.sendRequest({ loaded: EnhanceLibIsLoaded || false });"
    });

    ...
});

// listen for requests
chrome.extension.onRequest.addListener(function(req, sender, sendResponse) {
    if (req.loaded === false) {
        chrome.tabs.executeScript(tabId, { file: "jquery-1.7.1.min.js" }, function() {
            chrome.tabs.executeScript(tabId, { file: "enhance.js" }, function() {
                // set the global variable that the scripts have been loaded
                // this could also be set as part of the enhance.js lib
                chrome.tabs.executeScript(tabId, { code: "var EnhanceLibIsLoaded = true;" });
            });
        });
     }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...