1

Google Chromeには、Webページのタブを開き、そのページにコードを挿入する拡張機能があります。また、コードの完了後に呼び出されるchrome.tabs.executeScriptのコールバックを登録しました。このコールバックは、別のタブを開いて別のページを開き、他のアクションを実行しますが、最初のタブのページが操作されるまで、このコールバックは実行されません。私が望む前にchrome.tabs.executeScriptのコールバックが呼び出され、回避策が必要

私の問題は、それが呼ばれるべきときに、このコールバックが呼び出されるということですが、私は呼ばれたくないとき:

は私がコードを注入

が特定のDOM要素が働く前に存在しているかどうかを確認しsetIntervalが含まれていますこれらの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

2つの手順で行う必要があります。

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

関連する問題