1

我已在Google Chrome中編寫了一個擴展,該擴展在網頁上打開一個標籤並將代碼注入該頁面。代碼完成後,我還在chrome.tabs.executeScript中註冊了一個回調。這個回調然後打開另一個頁面到另一個頁面並執行其他操作,但我不希望這種情況發生,直到第一個標籤的頁面被操縱。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()之後。

回答

4

您需要分兩步進行。

的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"}); 
    } 
} 
+0

你是天才 – tofutim