2011-08-26 77 views
1

我相信這與chrome擴展的異步性質有關。chrome.tabs.executeScript只處理它之前的警報

我的這一段代碼:

alert(tab.title); 
    chrome.tabs.executeScript(tab.id, {code:"document.title = 'test'"}); 

工作正常,但只要我刪除了警告,它停止工作。有什麼我可以做的,以消除警報,但仍然有js注入?

編輯:更多的代碼

凸片是標籤對象的全局陣列。

chrome.tabs.onSelectionChanged.addListener(function (tabId) { 
    for (var i = 0; i < tabs.length; i++) { 
     if (tabs[i].id == tabId) { 
     var tab = tabs[i]; 
     while (i < tabs.length) {//length-1 
      tabs[i] = tabs[i+1]; 
      i++; 
     } 
     tabs.pop(); 

     alert(tab.title);//WHY IS THIS NEEDED 
     chrome.tabs.executeScript(tab.id, {code:"document.title = document.title.substring(1)"}); 
     return; 
     } 
    } 
    }); 

我很困惑。更改它可解決以下問題:

 chrome.tabs.executeScript(tab.id, {code:"setTimeout('document.title = document.title.substring(1)',100)"}); 

但是,只要將延遲更改爲50,腳本就不會再次執行。我寧願不必這樣做。有誰知道發生了什麼事?

+0

這聽起來不對。請發佈更多代碼。 –

+0

用'break'替換'return'。你如何建立'標籤'數組? – serg

+0

替換。標籤基本上由「chrome.tabs.getAllInWindow」構建。代碼再一次沒有警報。奇怪! – Shazam

回答

0

聽起來就像你有一個競爭條件。我最好的猜測是將注入的代碼更改爲在onLoad上執行。

+0

'chrome.tabs.executeScript(tab.id,{code:「window.onload = function(){document.title = document.title.substring(1 );};「});」不起作用... – Shazam

+0

我會試試這個:http://api.jquery.com/ready/ – Paddy

1

我知道這是一個老問題,但如果有人正在尋找 - 在超時中包裝chrome.tabs.executeScript方法。

setTimeout(function(){chrome.tabs.executeScript(tab.id, {code:"setTimeout('document.title = document.title.substring(1)',100)"});},500); 

這當然不是理想的,但它完成了工作。