chrome.tabs проблемы с chrome.tabs.update и chrome.tabs.executeScript

Я хочу написать небольшое расширение Chrome, которое будет получать информацию с веб-страницы A (текущая веб-страница), обновлять вкладку на веб-странице B, а затем вводить код на веб-страницу B. К сожалению, следующий код обновляет веб-страницу до B, но вводит код в веб-страница A. Код в background.html:

chrome.tabs.update(tab.id,{url: "http://B.com"});
chrome.tabs.executeScript(tab.id, {file: "inject_into_B.com.js"}); /* injections goes misleadingly to webpage A*/

person dayscott    schedule 03.01.2011    source источник


Ответы (2)


Вы хотите что-то вроде этого:

chrome.tabs.update(tab.id, {url: request.url, active: true}, function(tab1) {

    // add listener so callback executes only if page loaded. otherwise calls instantly
    var listener = function(tabId, changeInfo, tab) {

        if (tabId == tab1.id && changeInfo.status === 'complete') {
            // remove listener, so only run once
            chrome.tabs.onUpdated.removeListener(listener);
            // do stuff
        }
    }
    chrome.tabs.onUpdated.addListener(listener);
});
person Keven Wang    schedule 26.08.2013
comment
Это сработало для меня, а ответ Серга - нет. Как ни странно, я некоторое время использовал метод, предложенный Сергом, который работал, и только что заметил, что он больше не работает. Пытаясь исправить это, я обнаружил, что ваше решение сделало это. - person JeffG; 20.02.2015
comment
@Keven Большое спасибо, ты мне очень помог! - person Jeremy Belolo; 26.12.2018

chrome.tabs.update — это асинхронный вызов (как и почти все остальные), поэтому, если вы хотите запустить эти команды, вам нужно использовать функцию обратного вызова:

chrome.tabs.update(tab.id,{url: "http://B.com"}, function(tab) {
    chrome.tabs.executeScript(tab.id, {file: "inject_into_B.com.js"});
});
person serg    schedule 03.01.2011
comment
если я добавлю предупреждение о коде (готово) в конце inject_into_B.com.js, я увижу, что (даже с вашим кодом) предупреждение запускается на веб-странице A, поэтому мы можем сказать, что вызовы все еще асинхронны: / - person dayscott; 03.01.2011