2017-07-02 6 views
0

In der Konsole kann ich document.getElementById ('...') eingeben und einen Wert zurückbekommen. Oder sogar .textContent und bekomme die gewünschte Zeichenfolge.Chrome-Erweiterung - Document.GetelementbyId (...) Auswertung auf Null?

Sobald ich dies in meine Chrome-Erweiterung pop und es ausführen, wertet es document.getElementById ('...') als null. Was geht?

manifest.json:

{ 
    "name": "CSUF RMP", 
    "version": "0.1", 
    "manifest_version" : 2, 
    "description": "Displays professor ratings on icon click", 
    "background" : { 
    "scripts" : ["background.js"] 

    }, 
    "browser_action": { 
    "default_icon": "icon16.png" 
    }, 

    "content_scripts": [ 
     { 
      "matches": ["https://mycsuf.fullerton.edu/*"], 
      "js": ["script.js"] 

     } 
    ], 

    "permissions": ["<all_urls>", "*://*/*", "http://*/*", "https://*/*"] 
} 

Background.js:

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.executeScript(null, {file: "script.js"}); 
}); 

Mein script.js ist buchstäblich, was ich oben geschrieben. Das Skript soll Zugriff auf das DOM der Webseite haben (also brauche ich ein Inhaltsskript) und führe es mit einem Klick auf das Icon aus (daher die background.js)

Ich kann die Seite zum laufen bringen und eine Warnung anzeigen oder etwas, aber diese Zeile bewertet das dom der Seite nicht, nur null.

+0

'document.getElementById ('...')' - wirklich? Ich hätte nicht gedacht, dass eine ID "..." als Wert haben könnte –

Antwort

0

Ich glaube, ich weiß, was das Problem hier ist,

Sie ausführen script.js wie ein normales Skript, und ein normales Skript kann nicht mit der Seite DOM interagieren, kann man darüber nachdenkt, wie gerade Ausführen eines Skripts aus einer Datei - es verfügt nicht über die Berechtigungen des Inhaltsskripts.

Sie können eine neue Registerkarte (mit der URL des Inhaltsskripts) öffnen und dann an das Inhaltsskript auf der neuen Registerkarte eine Nachricht senden, die ihn anweist, eine bestimmte Funktion dort auszuführen.

Sie können es testen, ohne Nachricht, indem der onload des Content-Skript, um etwas zu senden verwenden wie: onload=alert(document.getElementById('...')); und als eine neue Registerkarte öffnen aus dem Hintergrund Seite: chrome.tabs.create({"url":"https://mycsuf.fullerton.edu"});

mir sagen, wie es geht :)

Bearbeiten: vergessen zu erwähnen, dass Sie die 'Tabs' Berechtigung in Ihrer Manifest-Datei benötigen, um neue Tabs zu öffnen und das Ding zu testen.

+0

Wäre das nicht eine neue ausgewachsene Registerkarte? Ich sehe, was Sie sagen, wegen des Execscript-Codes in background.js, es wird nicht als Inhaltsskript ausgeführt (also kein DOM-Zugriff). Also müsste ich background.js eine Nachricht senden, wenn das Symbol geklickt wird (gerade führt es das Skript aus). Dann wird die Nachricht von meinem Inhaltsskript script.js mit einem Ereignis-Listener aufgenommen. Dann ist es jetzt ein "echtes" Inhaltsskript. Recht? – Kevin

+0

Genau. Das Senden von Nachrichten kann etwas nervig sein, daher dachte ich, dass du es vielleicht vorziehen würdest, dies schneller zu überprüfen, indem du einfach einen neuen Tab öffnest und das Inhaltsskript darauf laufen lässt. – HUCK45

+0

Können Sie erklären, was ein neuer Tab bedeutet? Ich verstehe, dass es so aussieht, als würde sich ein wörtlicher Tab in meinem Browser öffnen. --- Mein Ziel ist es, auf der mycsuf.fullerton.edu * .... Seite zu haben, kann ich auf das Erweiterungssymbol klicken (vielleicht erscheint es), und dann auf dieser Seite kann ich das DOM bearbeiten. Ich möchte, dass es auf 1 Seite enthalten ist. Auf meinem Telefon oder ich würde dies alles kodieren, aber das würde bedeuten, ich kann einfach senden msg (not executscript) und es sollte als ein Inhaltsskript arbeiten und in der Lage sein, auf die Dom zugreifen, nicht als nur eine background.js Skript (kein Dom Zugang) wie es war? – Kevin

Verwandte Themen