2017-05-01 2 views
0

Es gibt zahlreiche Versionen dieser Frage, und ich habe sie überprüft und viele Dinge ausprobiert, ohne Erfolg. Ich bin neu in Chrom-Erweiterungen, und ich könnte viele Dinge vermissen, aber ich weiß nicht was.Chrome Erweiterung sendResponse funktioniert nicht

Zunächst möchte ich darauf hinweisen, dass ich mehrere beanspruchte Arbeitsbeispiele aus verschiedenen Antworten kopiert habe, und keine von ihnen funktioniert für mich. Ich verwende Chrome Version 58.0.3029.81 unter Windows 7 Professional.

Ob es sich um meinen Code oder um Beispiele handelt, die ich kopiert habe, der Code im Inhaltsskript wird ausgeführt, und sendResponse wird mit der richtigen Antwort aufgerufen. Darüber hinaus nichts - die angegebene Callback-Funktion wird nie ausgeführt.

Hier ist meine aktuellen Code:

manifest.json

{ 
 
    "manifest_version": 2, 
 

 
    "name": "TestExtension", 
 
    "description": "...", 
 
    "version": "1.0", 
 

 
    "content_scripts": [ 
 
    { 
 
     "matches": [ 
 
     "http://*/*", 
 
     "https://*/*" 
 
     ], 
 
     "js": [ "content.js" ] 
 
    } 
 
    ], 
 

 
    "browser_action": { 
 
    "default_icon": "icon.png", 
 
    "default_popup": "popup.html", 
 
    "default_title": "Send a checkpoint request" 
 
    }, 
 

 
    "permissions": [ 
 
    "activeTab", 
 
    "tabs", 
 
    "http://*/*", // allow any host 
 
    "https://*/*" // allow any secure host 
 
    ] 
 
}

popup.js

document.addEventListener('DOMContentLoaded', function() 
 
{ 
 

 
    document.getElementById('extension_form').onsubmit = function() 
 
    { 
 
     var elementName = "DataAccessURL"; 
 

 
     chrome.tabs.query(
 
     { 
 
      active: true, 
 
      currentWindow: true 
 
     }, 
 
     function (tabs) 
 
     { 
 
      chrome.tabs.sendMessage(
 
       tabs[0].id, 
 
       { Method: "GetElement", data: elementName }, 
 
       function (response) 
 
       { 
 
        debugger; 
 
        console.log("response:Element = " + response.Element); 
 
        alert(response.Element); 
 
       }); 
 
     }); 
 

 

 

 
    }; 
 
});

content.js

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) 
 
{ 
 
    console.log("In Listener"); 
 

 
    if (request.Method && request.Method == "GetElement") 
 
    { 
 
     var result = ""; 
 

 
     var element = request.data; 
 

 
     console.log(element); 
 

 
     var e = document.getElementById(element); 
 

 
     if (e) result = e.innerHTML; 
 

 
     console.log(result); 
 

 
     sendResponse({ Element: result }); 
 

 
     return true; // <-- the presence or absence of this line makes no difference 
 
    } 
 

 
});

irgendwelche Hinweise würden geschätzt. Ich verstehe einfach nicht, warum mein Rückruf nicht angerufen wird.

+0

Das Popup ist ein separates Fenster mit einer eigenen Konsole und Devtools: Klicken Sie mit der rechten Maustaste auf das Popup und wählen Sie Inspizieren, um den Code zu debuggen. Stellen Sie außerdem sicher, dass das Inhaltsskript tatsächlich eingefügt wird. – wOxxOm

+0

@wOxxOm: Danke - die sendMessage in popup.js wird geladen und ausgeführt. Der Listener-Code in content.js wird aufgerufen und ausgeführt. Es erhält die richtigen Daten und ruft sendResponse mit dem Ergebnis auf. Aber wieder wird der Rückruf, der als dritter Parameter für sendMessage angegeben ist, nie aufgerufen. Es hat derzeit eine Debugger-Anweisung, die nie getroffen wird, auch wenn der Code im separaten Devtools-Fenster angezeigt wird, wie Sie es vorschlagen. – MisterAcoustic

+0

Klingt wie das Popup geschlossen wird, bevor es die Antwort erhalten kann. Wenn das Popup geschlossen ist, ist seine Umgebung (Code/DOM) nicht mehr vorhanden. – wOxxOm

Antwort

0

Benutzer wOxxOm lieferte diese Antwort in seinen Kommentaren.

Im Beispiel von popup.js füge ich dem Ereignis 'onsubmit' des Formulars an, um meinen Code auszulösen.

Ich hatte zuvor gelesen, dass, wenn das Popup geschlossen wird, Code dort nicht mehr ausgeführt werden würde. Ich konnte in meinem Fall nicht visuell sagen, dass, wie wOxxOm darauf hinwies, dass das Submit-Ereignis das Popup neu lädt. Das war mein Code zu trennen.

Um zu verhindern, dass das Popup erneut geladen wird, musste ich die Standardaktion für das Submit-Ereignis verhindern. Ich fügte einen "evt" -Parameter hinzu, um das Ereignisargument für das Senden zu akzeptieren, und nannte preventDefault, wie unten gezeigt.

document.getElementById('extension_form').onsubmit = function (evt) 
{ 
    evt.preventDefault(); 
    ... 

Dadurch konnte die Probe wie erwartet funktionieren.

Danke wOxxOm!

Verwandte Themen