Обратный вызов chrome.tabs.executeScript вызывается до того, как я этого хочу, требуется обходной путь - PullRequest
1 голос
/ 08 августа 2011

Я написал расширение в Google Chrome, которое открывает вкладку для веб-страницы и вставляет код на эту страницу.Я также зарегистрировал обратный вызов в chrome.tabs.executeScript, который будет вызываться после завершения кода.Затем этот обратный вызов открывает другую вкладку для другой страницы и выполняет другие действия, но я не хочу, чтобы это происходило до тех пор, пока страница первой вкладки не будет изменена.

Моя проблема заключается в том, что этот обратный вызов вызывается, когда это необходимовызывается, но не тогда, когда я хочу, чтобы он вызывался:

Мой внедренный код содержит setInterval, который проверяет наличие определенных элементов DOM, прежде чем действовать на странице, и я не хочу обратного вызоваактивировать до тех пор, пока не будут задействованы эти элементы DOM.

Я не знаю, как внедрить код, взаимодействующий с кодом на моей странице расширения.

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

Вот код, объясняющий, что я делаю сейчас:

function doStuffWithTabs() {
    chrome.tabs.create({url: 'some/url/here'}, function(tab) {
        chrome.tabs.executeScript(tab.id, code: "var interval = setInterval(function(){if(jQuery(domElement).length){clearInterval(interval);workMagic();}},1);"}, function(){
            goForthAndConquer();
        });
    }
}

workMagic() представляет код, который манипулирует DOM открытой вкладки, а goForthAndConquer() - это то, что я хочу, чтобы завершить манипулирование открытой вкладкой.

Прямо сейчасКак видите, введенный код просто регистрирует setInterval и немедленно вызывает обратный вызов.Опять же, я хочу, чтобы обратный вызов происходил после workMagic().

1 Ответ

4 голосов
/ 08 августа 2011

Вам нужно сделать это в два шага.

script.js:

//I would ditch setInterval in favor of setTimeout
var interval = setInterval(function(){
    if(jQuery(domElement).length){
        clearInterval(interval);
        workMagic();
    }
},15); //15 is recommended minimum

function workMagic() {
    //manipulate dom
    chrome.extension.sendRequest({action: "finished", other: "data"});
}

background.html:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if (request.action === 'finished') {
        console.log("dom manipulation is finished in tab #", sender.tab.id);
        goForthAndConquer();
    }
});

function doStuffWithTabs() {
    chrome.tabs.create({url: 'some/url/here'}, function(tab) {
        chrome.tabs.executeScript(tab.id, {file: "script.js"});
    }
}
...