1

Ich muss einfach auf ein Objekt zugreifen, das eine Variable auf der Seite ist, auf der ich mein Inhaltsskript über meine Chrome-Erweiterung ausführe.Zugriff auf ein Seitenobjekt mit einer Chrome-Erweiterung

Ich weiß über die Umgebungen und ihre isolierten Welten, in denen die Inhaltsskripte und injizierten Skripts ausgeführt werden, und dass es möglich ist, einige Variablen mithilfe der injizierten Skripts zu erhalten und sie dann zurück zu senden.

Ich habe nach anderen Antworten zu dieser Frage gesucht und die meisten arbeiten für andere Arten von Variablen und sind die grundlegende Art, dies zu tun, aber keine derzeit für den Zugriff auf Objekte arbeiten.

Alle aktuellen Lösungen oder Workarounds?

EDIT: Die Lösung, die ich verwendet:

Inhalt Skript:

//Sends an object from the page to the background page as a string 
window.addEventListener("message", function(message) { 
    if (message.data.from == "myCS") { 
     chrome.runtime.sendMessage({ 
      siteObject: message.data.prop 
     }); 
    } 
}); 
var myScript = document.createElement("script"); 
myScript.innerHTML = 'window.postMessage({from: "myCS", prop: JSON.stringify(OBJECT)},"*");'; 
document.body.appendChild(myScript); 

Background.js:

//Info receiver 
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 

    //When the content script sends the sites object to extract the needed data 
    if (message.siteObject !== undefined) { 
     console.log(message.siteObject); 
     //Process the data 
    } 

}); 

Antwort

1

Sie können versuchen, ein script Tag in die Seite zu injizieren, um auf das Objekt zuzugreifen. Bei Bedarf können Sie Messaging verwenden, um mit Ihrer Nebenstelle zu kommunizieren.

content1.js

//this code will add a new property to the page's object 
var myOwnData = "createdFromContentScript"; 
var myScript = document.createElement("script"); 
myScript.innerHTML = "pageObject.myOwnData = " + myOwnData; 
document.body.appendChild(myScript); 

content2.js

//this code will read a property from the existing object and send it to background page 

window.addEventListener("message", function(message) { 
    if (message.data.from == "myCS") { 
     chrome.runtime.sendMessage({theProperty: message.data.prop}); 
    } 
}); 

var myScript = document.createElement("script"); 
myScript.innerHTML = 'window.postMessage({from: "myCS", prop: pageObject.existingProperty},"*");'; 
document.body.appendChild(myScript); 
+0

Ich hatte auch diesen Ansatz versucht: Zum Beispiel Angenommen, das Objekt, das Sie auf Ihrer Seite zugreifen möchten, pageObject genannt und es hat nicht funktioniert, trotzdem kopierte ich diesen genauen Code und ersetzte nur mein Objekt, und ich habe immer noch das gleiche Problem, "Uncaught ReferenceError: myObject.property ist nicht definiert". –

+0

Ich habe gerade den Code von 'content2.js' bearbeitet. Versuchen Sie auf diese Weise, pageObject.existingProperty durch das tatsächliche Objekt und die Eigenschaft zu ersetzen, die Sie suchen. –

+0

'Uncaught TypeError: Fehler beim Ausführen von 'postMessage' auf 'Window': 2 Argumente erforderlich, aber nur 1 vorhanden. ' –

0

Nein, es gibt keinen Weg. Es hat keinen Sinn, die isolierten Welten für die Sicherheit zu haben, und dann gibt es einen Workaround, bei dem eine Erweiterung das Inhaltsskript und die Variablen hacken kann, wenn es wirklich nötig ist.

Vermutlich interagiert das Objekt auf der Seite mit der Seite oder wirkt sich auf die Seite aus, oder etwas auf der Seite beeinflusst den Status der Variablen. Sie können Aktionen auf der Seite (über das DOM) auslösen, die den Status dieser Variablen ändern könnten. Sie sollten jedoch aufhören, nach Möglichkeiten zum direkten Zugriff auf Variablen zu suchen.

Natürlich, wenn der Autor der Seite kooperativ ist, dann ist es ein anderes Ballspiel - ein Mechanismus könnte im Skript des Autors, ein Getter und Setter-Mechanismus zur Verfügung gestellt werden. Aber irgendwie bezweifle ich, dass du danach suchst.

Verwandte Themen