2016-07-24 42 views
0

這裏是我做過什麼:不能操縱通過chrome.tabs創造了新的選項卡的DOM

chrome.tabs.create({url:msg.url}, function(tab) { 
    chrome.tabs.executeScript(tab.id, { 
     runAt:"document_end", 
     allFrames:true, 
     code:"var ready = function(fn){ if(typeof fn!== 'function') return ; if(document.readyState === 'complete') {return fn();} if(document.readyState === 'interactive'){ return fun(); };}; ready(function() { console.log(document.querySelector('#rso h3 a')) alert('yes'); document.querySelector('#rso h3 a').click(); });" 

    }); 
}); 

但似乎在孤立的環境中運行的js,所以我不能操縱DOM,有沒有什麼解決方法嗎?

我也試過code屬性僅包含下面的代碼片段

document.querySelector('#rso h3 a').click(); 

PS:如果code屬性,例如到alert()函數的調用,它完美地炒菜。

+0

什麼是真正的非工作代碼?你想訪問由頁面設置的變量嗎?此外,該網站可能會動態添加其內容,因此您可能需要一個MutationObserver或setTimeout。 – wOxxOm

+0

@wOxxOm:編輯帖子並添加了代碼。代碼有額外的部分是爲了確保代碼在DOM準備好後運行。 – cipher

+0

什麼是'document.addEventListener('interactive')'? –

回答

0

感謝@Xan和我們的話題討論,這個問題是通過使用setIntervalclearInterval組合與code屬性解決如下:

code: "var intrvl = null; function fn(){ var a = document.querySelector('#rso h3 a'); if(a !== null){ clearInterval(intrvl); a.click(); } }; intrvl = setInterval(fn, 500);" 

的問題是,在特定的頁面我試圖注入這個JavaScript創建了我想動態操作的元素,並且document_end只保證所有靜態DOM都被加載了,我不得不做這個解決方法。

另一種方式可能是使用JavaScript中的突變庫或原始MutationObserver API。