javascript - Wie kann ich eine HTML-Zeichenfolge in ein DOM-Objekt in einer Firefox-Erweiterung verwandeln?

Translate

Ich lade eine Webseite (Tag-Suppe-HTML) mit XMLHttpRequest herunter und möchte die Ausgabe in ein DOM-Objekt umwandeln, auf dem ich dann XPATH-Abfragen ausführen kann. Wie konvertiere ich von einer Zeichenfolge in ein DOM-Objekt?

Es scheint, dass die allgemeine Lösung darin besteht, einen versteckten Iframe zu erstellen und den Inhalt der Zeichenfolge in diesen zu werfen. Da warsich unterhaltender AktualisierungDOMParserUm Text / HTML zu unterstützen, erhalten Sie ab Firefox 3.0.1 immer noch eineNS_ERROR_NOT_IMPLEMENTEDwenn du es versuchst.

Gibt es eine andere Option als den versteckten Iframe-Trick? Und wenn nicht, wie kann der Iframe-Trick am besten ausgeführt werden, damit Ihr Code außerhalb des Kontexts derzeit geöffneter Registerkarten funktioniert (damit das Schließen von Registerkarten den Code nicht vermasselt usw.)?

Dieseist ein Beispiel dafür, warum ich nach einer anderen Lösung als dem iframe-Hack suche, wenn ich schreiben mussallediesen Code, um eine robuste Lösung zu haben, dann würde ich lieber weiter nach etwas anderem suchen.

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ajaxian hatte tatsächlich eineBeitrag zum Einfügen / Abrufen von HTML aus einem Iframeheute. Sie können wahrscheinlich das dort veröffentlichte js-Snippet verwenden.

Zum Schließen eines Browsers / einer Registerkarte können Sie eine Verknüpfung zum onbeforeunload (http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx) Ereignis und tun, was Sie tun müssen.

Quelle
Translate

Versuche dies:

var request = new XMLHttpRequest();

request.overrideMimeType( 'text/xml' );
request.onreadystatechange = process;
request.open ( 'GET', url );
request.send( null );

function process() { 
    if ( request.readyState == 4 && request.status == 200 ) {
        var xml = request.responseXML;
    }
}

Beachten Sie dieoverrideMimeTypeundresponseXML.
DasreadyState == 4abgeschlossen'.

Quelle
Translate

Versuchen Sie, ein Div zu erstellen

document.createElement( 'div' );

Und dann setzen Sie das Tag-Suppen-HTML auf das innerHTML des div. Der Browser sollte das in XML verarbeiten, das Sie dann analysieren können.

Die innerHTML-Eigenschaft verwendet eine Zeichenfolge, die eine gültige Kombination aus Text und Elementen angibt. Wenn die innerHTML-Eigenschaft festgelegt ist, ersetzt die angegebene Zeichenfolge den vorhandenen Inhalt des Objekts vollständig. Wenn die Zeichenfolge HTML-Tags enthält, wird die Zeichenfolge beim Einfügen in das Dokument analysiert und formatiert.

Quelle
Translate

Sie möchten also eine Webseite als XML-Objekt mit Javascript herunterladen, aber keine Webseite verwenden? Da Sie keine Kontrolle darüber haben, was der Benutzer tun wird (Tabs oder Fenster schließen oder so weiter), müssten Sie dies wie in einem OSX Dashboard-Widget oder einer separaten Anwendung tun. Eine Firefox-Erweiterung würde auch funktionieren, es sei denn, Sie müssen sich Sorgen machen, dass der Benutzer den Browser schließt.

Quelle
Translate

Gibt es eine andere Option als den versteckten Iframe-Trick?

Leider nein, jetzt nicht. Andernfalls würde der Mikrosummary-Code, auf den Sie zeigen, ihn stattdessen verwenden.

Und wenn nicht, wie kann der Iframe-Trick am besten ausgeführt werden, damit Ihr Code außerhalb des Kontexts der derzeit geöffneten Registerkarten funktioniert (damit das Schließen von Registerkarten den Code usw. nicht vermasselt)?

Der von Ihnen angegebene Code verwendet das aktuelle Browserfenster, sodass das Schließen von Registerkarten die Analyse nicht beeinflusst. Wenn Sie dieses Browserfenster schließen, wird Ihre Last abgebrochen, aber Sie können damit umgehen (erkennen Sie, dass die Last abgebrochen wurde, und starten Sie sie beispielsweise in einem anderen Fenster neu), und dies kommt nicht sehr oft vor.

Sie benötigen ein DOM-Fenster, damit der Iframe ordnungsgemäß funktioniert. Daher gibt es derzeit keine saubere Lösung (wenn Sie den Mozilla-Parser verwenden möchten).

Quelle