Analysieren und bearbeiten Sie ResponsexML -Attribute
Wenn Sie XMLHTTPrequest verwenden, um den Inhalt eines Remote -XML -Dokuments zu erhalten, ist die ResponsexML -Eigenschaft ein DOM -Objekt aus dem XML -Dokument, das schwer zu manipulieren und zu analysieren ist. Hier sind fünf Hauptmöglichkeiten zur Analyse von XML -Dokumenten:
1. Verwenden Sie XPath, um den Formulierungsteil des Dokuments zu lokalisieren.
2. Verwenden Sie Jxon, um es in einen JavaScript -Objektbaum umzuwandeln.
3. Die XML manuell analysieren und in Saiten oder Objekte serialisieren.
4. Verwenden Sie XMLSerializer, um den DOM -Baum in eine Zeichenfolge oder Datei zu serialisieren.
5. Wenn Sie den Inhalt des XML -Dokuments im Voraus kennen, können Sie Regexp verwenden. Wenn Sie beim Scannen mit Regexp von Newlines betroffen sind, möchten Sie möglicherweise alle Newlines löschen. Dieser Ansatz ist jedoch eine "Letzte", da sich der Ansatz möglicherweise fehlschlägt, wenn sich der XML-Code geringfügig ändert.
Parsen und manipuliert die Responsext -Eigenschaft, die HTML -Dokumente enthält
HINWEIS: HTML darf durch das Attribut "XMLHTTPREquest.ResponsexML in der W3C XMLHTTPREquest" -Thexml analysiert werden. Weitere Informationen finden Sie in xmlHttprequest.
Wenn Sie XMLHTTPrequest verwenden, um eine HTML -Seite vom Remote -Ende zu erhalten, werden alle HTML -Tags in der ResponText -Eigenschaft als Zeichenfolge gespeichert, sodass es schwierig ist, diese Tags zu manipulieren und zu analysieren. Es gibt drei Hauptmethoden, um diese HTML -Tags zu analysieren:
1. Verwenden Sie die xmlHttprequest.responsexml -Eigenschaft.
2. Inhalt in ein Dokumentfragment durch Fragment.Body.innernhtml und durch Fragmente im DOM iterieren.
3. Wenn Sie den Inhalt des HTML -Dokuments im Voraus kennen, können Sie Regexp verwenden. Wenn Sie beim Scannen mit Regexp von Newlines betroffen sind, möchten Sie möglicherweise alle Newlines löschen. Dieser Ansatz ist jedoch ein "Letzter Hand", denn wenn sich der HTML-Code geringfügig ändert, kann der Ansatz möglicherweise fehlschlagen.
Binärdaten umgehen
Obwohl XMLHTTPrequest im Allgemeinen zum Senden und Empfangen von Textdaten verwendet wird, kann es tatsächlich binäre Inhalte senden und akzeptieren. Es gibt viele gut getestete Möglichkeiten, binäre Daten mit XMLHTTPrequest zu erzwingen. Die .overridemimetype () -Methode von XMLHTTPrequest ist eine Lösung, obwohl es sich nicht um eine Standardmethode handelt.
var oreq = new Xmlhttprequest (); oreq.open ("get", url, true); // Daten, die als binäre Stringoreq.overridemetype nicht verarbeitet werden, abrufenDie ResponseType -Eigenschaft wurde in die XMLHTTPrequest Level 2 -Spezifikation hinzugefügt, wodurch Binärdaten einfacher gesendet und empfangen werden können.
var oreq = new xmlhttpRequest (); oreq.onload = Funktion (e) {var arrayBuffer = xhr.response; // nicht reagieren/ * ... */} oreq.open ("get", url, true); oreq.responsetype = "arrayBuffer"; Oreq.Send ();Akzeptieren Sie Binärdaten mithilfe von JavaScript -Array
Sie können den vom Server zurückgegebenen Datentyp einer Antwort ändern, indem Sie die ResponType -Eigenschaft eines XMLHTTPrequest -Objekts festlegen. Die verfügbaren Attributwerte sind leere Zeichenfolgen (Standard), "ArrayBuffer", "Blob", "Dokument" und "Text". Die Werte des Antwortattributs variieren abhängig vom Wert der ResponType -Eigenschaft.
Das folgende Beispiel liest eine binäre Bilddatei, und ein Array von nicht signierten Ganzzahlen mit 8-Bit-Zahlen wird aus den binären nativen Bytes der Datei erstellt.
var oreq = new xmlHttpRequest (); oreq.open ("get", "/myFile.png", true); oreq.responSetype = "arrayBuffer"; oreq.onload = function (oEvent) {var arrayBuffer = oreq.Responus; // Hinweis: nicht oreq.responsetext if (arrayBuffer) {var bytearray = new Uint8array (ArrayBuffer); für (var i = 0; i <bytearray.ByTelength; i ++) {// Betrieb für jedes Byte im Array}}}; oreq.send (null);Zusätzlich zur obigen Methode können Sie die Blobbuilder -API auch verwenden, um einem Blob -Objekt direkt ArrayBuffer -Daten hinzuzufügen. Da sich die API noch in der Versuchsstufe befindet, muss ein bestimmtes Präfix hinzugefügt werden:
var blobbuilder = window.mozblobbuilder || window.webkitblobbuilder || window.msblobbuilder || window.blobbuilder; var oreq = new Xmlhttprequest (); oreq.open ("get", "/myFile.png", true); oreq.responSetype = "ArrayBuffer"; oreq.onload = Funktion (Oevent) {var bloBbuilder = new bloBbuwer (); Blobbuilder.Append (oreq.response); var blob = blobbuilder.getBlob ("Bild/png"); // ...}; oreq.send ();Akzeptieren Sie Binärdaten in alten Browsern
Die folgende Methode load_binary_resource () kann Binärdaten aus der angegebenen URL laden und die Daten an den Anrufer zurückgeben.
Funktion load_bary_resource (url) {var req = new Xmlhttprequest (); req.open (/'get/', url, falsch); // XHR Binary Charset opt von marcus granado 2006 [http://mgran.blogspot.com] req.overridemetype (/'text/plain; charset = x-user-definiert/'); req.send (null); if (req.status! = 200) return /' /'; return req.responsetext;}Der schönste Betrieb ist in der fünften Zeile, die den Standard-MIME-Typ umschreibt und den Browser dazu zwingt, die Antwort als einfache Textdatei mit einem benutzerdefinierten Zeichensatz zu behandeln. Dies sagt dem Browser, die Daten nicht zu analysieren und den unverarbeiteten Bytecode direkt zurückzugeben.
var fileStream = load_binary_resource (url); var abyte = fileStream.charCodeat (x) & 0xff; // Byte mit hohem Bit weggeworfen (F7)
Das obige Beispiel erhält die Bytes bei x aus den von der Anforderung zurückgegebenen Binärdaten. Der gültige Offset-Bereich beträgt 0 bis fileStream.length-1.
Weitere Informationen finden Sie in der Download -Datei mit XMLHTTPrequest und sehen Sie sich die Download -Datei an.
Senden Sie Binärdaten
Die Send -Methode des XMLHTTPrequest -Objekts wurde verbessert, und binäre Daten können einfach gesendet werden, indem ein ArrayBuffer-, Blob- oder Dateiobjekt übergeben wird.
Das folgende Beispiel erstellt eine Textdatei und sendet die Datei mit der Post -Methode an den Server. Sie können auch andere binäre Datentypen als die Textdatei verwenden.
var oreq = new xmlhttpRequest (); oreq.open ("post", url, true); oreq.onload = Funktion (oEvent) {// nach dem Hochladen ist abgeschlossen.}; var bb = new Blobbuilder (); // Ein geeignetes Präfix ist erforderlich: window.mozblobbuilder oder window.webkitblobBuilderbb.Append (/'ABC123/'); Oreq.Send (bb.getblob (/'text/plain/');Senden Sie Array von Typen als Binärdaten
Sie können JavaScript -Arrays als Binärdaten senden.
var myarray = new ArrayBuffer (512); var longInt8View = new Uint8Array (myarray); für (var i = 0; i <longInt8View.length; i ++) {longInt8View [i] = i % 255;} var xhr = new xmlhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr.open ("post", ulhttpRequest; xhr. falsch); xhr.send (myarray);Das obige Beispiel erstellt ein 8-Bit-Integer-Array von 512-Byte und sendet es. Natürlich können Sie auch Binärdaten senden.
Fortschritt überwachen
Die Überwachung des Fortschrittsereignisses, die DOM unterstützt, ist für die XMLHTTPREquest -Übertragung und folgt der Web -API -Fortschrittsereignisspezifikation: Diese Ereignisse implementieren die ProgressEvent -Schnittstelle.
var req = new xmlhttprequest (); // load lous hören req.addeventListener ("progress", updateProgress, false); req.addeventListener ("last", TransferComplete, false); req.addevent ristener ("fehltlich", TransferFailed, false, false, false, false); req.AndDeDeNlisten ("abgeschaltet", räure, false, false, false, false, false-, false, "req.AndDeventListen", "abgeschaltet", rescla., resq.Anddedeener ("abgeschaltet", rescel, false); req.Anddevent "," abgeschaltet ", resokled, falsch); req.Anddedener (" abgeschaltet ", assacel, false); false); req.open (...); ... // Fortschritte bei Übertragungen vom Server zum Client (Downloads) Funktion updateProgress (evt) {if (evt.lengthComputable) {var prozentComplete = evt.loaded/ evt.total; ...} else {// können Fortschrittsinformationen nicht berechnen, da die Gesamtgröße unbekannt ist}}Hinweis: Sie müssen Ereignishörungen hinzufügen, bevor Sie auffordern, Open () anzurufen. Andernfalls wird das Fortschrittsereignis nicht ausgelöst.
Im vorherigen Beispiel wird das Fortschrittsereignis so angegeben, dass die Funktion updateProgress () verarbeitet wird und die Gesamtzahl der übertragenen Bytes insgesamt erhält und bereits übertragen wurde, was die Gesamtlänge (Bytes) der von der "Inhaltslänge" übertragenen Daten ist. Wenn jedoch der Wert der Länge, die kompensierbare Eigenschaft falsch ist, ist die Gesamtzahl der Bytes unbekannt und der Gesamtwert 0. Wenn die Länge bekannt ist, ist die Länge, die miteinander verbunden werden kann. Eigenschaft ist wahr
Das Fortschrittsereignis ist sowohl in Download- als auch im Upload -Übertragungen vorhanden. Das Download-bezogene Ereignis wird auf dem XMLHTTPrequest-Objekt ausgelöst, genau wie das obige Beispiel. Upload -verwandte Ereignisse werden auf dem XMLHTTPREQUEST.Upload -Objekt wie folgt ausgelöst:
var req = new XMLHttpRequest();//Download listener req.upload.addEventListener("progress", updateProgress);req.upload.addEventListener("load", transferComplete);req.upload.addEventListener("error", transferFailed);req.upload.addEventListener("abort", TransferCanceled); req.open ();Hinweis: Das Fortschrittsereignis ist ungültig, wenn die Datei verwendet wird: Protokoll.
Verwenden Sie das Loadend -Ereignis, um alle drei Lastendbedingungen zu erfassen (abbrechen, laden, fehler):
Req.AdDeVentListener ("Loadend", Loadend, False);
Es ist zu beachten, dass es keine Möglichkeit gibt, genau zu wissen, in welcher Bedingung die vom Lastend -Ereignis erhaltenen Informationen durch die Operationsterminierung verursacht werden. Sie können dieses Ereignis jedoch am Ende aller Übertragungen verwenden.
Das XMLHTTPrequest -Objekt löst verschiedene Arten von Ereignissen in verschiedenen Phasen der Anfrage aus, sodass es nicht die ReadyState -Eigenschaft überprüfen muss.
Wenn send () aufgerufen wird, wird ein einzelnes Laststart -Ereignis ausgelöst. Wenn die Antwort des Servers geladen wird, erlebt das XMLHTTPrequest -Objekt ein Fortschrittsereignis, normalerweise alle 50 Millisekunden, sodass diese Ereignisse verwendet werden können, um Benutzern Feedback zum Fortschritt der Anfrage zu geben.
Wenn die Anfrage schnell abgeschlossen ist, kann sie das Fortschrittsereignis möglicherweise nie auslösen. Nach Abschluss des Ereignisses wird das Lastereignis ausgelöst.
Es gibt 3 Fälle, in denen HTTP -Anfragen nicht abgeschlossen werden können, was 3 Ereignissen entspricht. Wenn das Zeitüberschreitungszeitlimit ausgelöst wird, wird das Timeout -Ereignis ausgelöst. Wenn die Anfrage abgebrochen wird, wird das ABORT -Ereignis ausgelöst. Netzwerkfehler wie zu viele Weiterleitungen verhindern, dass die Anforderung abgeschlossen ist. Wenn diese jedoch auftreten, wird jedoch ein Fehlerereignis ausgelöst.
Für eine bestimmte Anfrage löst der Browser nur eine der Last-, Abbruch-, Zeitüberschreitungs- und Fehlerereignisse sowie das Fortschrittsereignis aus.
if (/'onProgress/' in (neuer xmlhttpRequest ())) {// Erkennung, ob Fortschrittsereignisse unterstützt werden var request = new Xmlhttprequest (); request.onprogress = function (e) {if (e.LengthComputable) {progress.innerhtml = math.round (100* e.Loaded/e.total) +/'%/'; }}}Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.