2016-07-24 18 views
0

Hier ist, was ich getan habe:Kann nicht Manipulieren DOM von neuen Tab über chrome.tabs erstellt

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(); });" 

    }); 
}); 

Aber es scheint, dass der js läuft in isolierter Umgebung, so kann ich nicht auf das DOM manipuliert, gibt es eine Abhilfe?

Ich habe auch versucht die code Attribut nur das folgende Snippet

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

PS zu enthalten: Wenn das code Attribut ist, ein Aufruf an alert() Funktion zum Beispiel, es einwandfrei Woks.

+0

Was ist der eigentliche Code nicht arbeiten? Versuchen Sie, auf eine von der Seite festgelegte Variable zuzugreifen? Außerdem kann die Site ihren Inhalt dynamisch hinzufügen, sodass Sie möglicherweise einen MutationObserver oder setTimeout benötigen. – wOxxOm

+0

@wOxxOm: Bearbeitete den Post und fügte den Code hinzu. Der Code hat einen zusätzlichen Teil, der sicherstellen soll, dass der Code ausgeführt wird, nachdem DOM bereit ist. – cipher

+0

Was ist 'document.addEventListener ('interaktiv')'? –

Antwort

0

Dank @Xan und unsere Diskussion über das Thema, wurde das Problem durch die Verwendung der Kombination von setInterval und clearInterval mit dem code Attribute wie folgt gelöst:

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

Das Problem war, dass die jeweilige Seite war ich versuchen, dieses Javascript injizieren hatte die Elemente erstellt, die ich dynamisch manipuliert werden wollte, und document_end nur garantiert, dass alle statischen DOM geladen wurde, musste ich diese Problemumgehung zu tun.

Eine andere Möglichkeit könnte sein, Mutationsbibliotheken in Javascript oder roher MutationObserver API zu verwenden.