Analizar y manipular los atributos de respuestaxml
Si usa XMLHTTPRequest para obtener el contenido de un documento XML remoto, la propiedad Respuestaxml será un objeto DOM analizado del documento XML, que es difícil de manipular y analizar. Aquí hay cinco formas principales de analizar documentos XML:
1. Use XPATH para localizar la parte de formulación del documento.
2. Use Jxon para convertirlo en un árbol de objetos JavaScript.
3. Analice manualmente y sea serialice XML en cadenas u objetos.
4. Use XMLSerializer para serializar el árbol DOM en una cadena o archivo.
5. Si conoce el contenido del documento XML por adelantado, puede usar REGEXP. Si se ve afectado por las nuevas líneas al escanear con Regexp, es posible que desee eliminar todas las líneas nuevas. Sin embargo, este enfoque es una "última mano" porque si el código XML cambia ligeramente, el enfoque puede fallar.
Analiza y manipula la propiedad ResponseText que contiene documentos HTML
Nota: Se permite que HTML se analice a través de la atributo XMLHTTPREQUEST.RESPONSEXML en la especificación W3C XMLHTTPREQUEST. Para obtener más detalles, lea HTML en XMLHTTPREQUEST.
Si usa XMLHTTPRequest para obtener una página HTML desde el extremo remoto, todas las etiquetas HTML se almacenan en la propiedad ResponseText como una cadena, lo que dificulta la manipulación y analiza estas etiquetas. Hay tres formas principales de analizar estas etiquetas HTML:
1. Use la propiedad XMLHTTPREQUEST.RESPONSEXML.
2. Inyectar contenido en un fragmento de documento a través de fragment.body.innerhtml e iterar a través de fragmentos en el DOM.
3. Si conoce el contenido del documento HTML por adelantado, puede usar regexp. Si se ve afectado por las nuevas líneas al escanear con Regexp, es posible que desee eliminar todas las líneas nuevas. Sin embargo, este enfoque es una "última mano" porque si el código HTML cambia ligeramente, el enfoque puede fallar.
Manejo de datos binarios
Aunque XMLHTTPRequest generalmente se usa para enviar y recibir datos de texto, en realidad puede enviar y aceptar contenido binario. Hay muchas formas bien probadas de forzar los datos binarios que se enviarán utilizando xmlhttprequest. El método .overridEMeType () de xmlhttprequest es una solución, aunque no es un método estándar.
var oreq = new xmlhttprequest (); Oreq.open ("get", url, true); // Recuperar datos sin procesar como un stringoreq.overridemeMeType ("Text/Plain; Charset = X-User-Defined");/ * ... */La propiedad ResponseType se ha agregado a la especificación XMLHTTPRequest Nivel 2, lo que facilita el envío y recibe datos binarios.
var oreq = new xmlhttprequest (); Oreq.onload = function (e) {var arrayBuffer = xhr. yponse; // no ResponseText/ * ... */} Oreq.open ("get", url, true); Oreq.responseSetype = "ArrayBuffer"; Oreq.send ();Acepte datos binarios utilizando la matriz de tipo JavaScript
Puede cambiar el tipo de datos de una respuesta devuelta desde el servidor configurando la propiedad ResponseType de un objeto xmlhttprequest. Los valores de atributos disponibles son cadenas vacías (predeterminadas), "ArrayBuffer", "blob", "documento" y "texto". Los valores del atributo de respuesta variarán según el valor de la propiedad ResponseType, que puede ser un ArrayBuffer, Blob, Document, String o Null (si la solicitud no se completa o falló)
El siguiente ejemplo lee un archivo de imagen binario, y se crea una matriz de enteros sin firmar de 8 bits a partir de los bytes nativos binarios del archivo.
var oreq = new xmlhttprequest (); Oreq.open ("get", "/myfile.png", true); Oreq.ResponseSetype = "ArrayBuffer"; Oreq.onload = function (Oevent) {var arrayBuffer = oreq.Responson; // NOTA: no Oreq.Responsetext if (ArrayBuffer) {var byteArray = new Uint8Array (ArrayBuffer); for (var i = 0; i <bytearray.bytelength; i ++) {// operación para cada byte en la matriz}}}; oreq.send (nulo);Además del método anterior, también puede usar la API BlobBuilder para agregar directamente los datos de ArrayBuffer a un objeto Blob. Dado que la API todavía está en la etapa experimental, se debe agregar un prefijo específico:
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 = function (oEvent) {var blobbuilder = new BlobBuilder (); blobBuilder.append (Oreq.Response); var blob = blobBuilder.getBlOB ("Image/png"); // ...}; Oreq.send ();Aceptar datos binarios en navegadores antiguos
El siguiente método load_binary_resource () puede cargar datos binarios de la URL especificada y devolver los datos a la persona que llama.
función load_binary_resource (url) {var req = new xmlhttprequest (); req.open (/'get/', url, falso); // xhr Charset binary opt por Marcus Granado 2006 [http://mgran.blogspot.com] req.overridemimeType (/'text/sencillo; charset = x-user-desfined/'); req.send (nulo); if (req.status! = 200) return /' /'; return req.ResponSetext;}La operación más maravillosa está en la quinta línea, que reescribe el tipo MIME predeterminado, lo que obliga al navegador a tratar la respuesta como un archivo de texto sin formato, utilizando un conjunto de caracteres definido por el usuario. Esto le dice al navegador que no analice los datos y devuelva directamente el bytecode sin procesar.
var fileStream = load_binary_resource (url); var abyte = fileStream.charCodeat (x) y 0xff; // Byte de alto bits (F7)
El ejemplo anterior obtiene los bytes en X de los datos binarios devueltos por la solicitud. El rango de compensación válido es 0 a FileStream.length-1.
Consulte el archivo de descarga utilizando XMLHTTPREQUEST para obtener más detalles y vea el archivo de descarga.
Enviar datos binarios
Se ha mejorado el método de envío del objeto XMLHTTPREQUEST, y los datos binarios se pueden enviar simplemente pasando un objeto ArrayBuffer, Blob o Archivo.
El siguiente ejemplo crea un archivo de texto y envía el archivo al servidor utilizando el método de publicación. También puede usar otros tipos de datos binarios que no sean el archivo de texto.
var oreq = new xmlhttprequest (); Oreq.open ("post", url, true); oreq.onload = function (oevent) {// después de la carga se completa.}; var bb = new blobBuilder (); // se requiere un prefijo adecuado: window.mozblobBuilder o window.webkitblobBuilderbb.append (/'ABC123/'); Oreq.send (bb.getBlob (/'text/simple/'));Enviar la matriz de tipos como datos binarios
Puede enviar matrices de tipo JavaScript como datos binarios.
var myArray = new ArrayBuffer(512);var longInt8View = new Uint8Array(myArray);for (var i=0; i< longInt8View.length; i++) { longInt8View[i] = i % 255;}var xhr = new XMLHttpRequest;xhr.open("POST", url, falso); xhr.send (myArray);El ejemplo anterior crea una matriz entera de 8 bits de 512 bytes y la envía. Por supuesto, también puede enviar cualquier datos binarios.
El progreso del monitor
El monitoreo de eventos de progreso que admite DOM es para la transmisión XMLHTTPREQUEST y sigue la especificación del evento de progreso de la API web: estos eventos implementan la interfaz ProgressEvent.
var req = new xmlhttprequest (); // cargar escear req.adDeventListener ("progreso", updateProgress, false); req.addeventListener ("load", transfercomplete, false); req.addeventListener ("error", transferido, falso); req.addeventListener ("abort", ", transferir,", transferir, ", transferir, transferir, transferir, transferir,", ",", "abort", ",", "abort", "," abort ",", "," abort ",", "abort", "abort", "," abort "," abort "," abort "," abort "," abort "," abort "," abort "," abort "," abort "," abort "," abort "," Abort "," abort "," Abort "," Abort "," Abort "," Abort "," Abort ". falso); req.open (...); ... // Progress en transferencias del servidor a la función Client (descarga) UpdateProgress (EVT) {if (evt.lengthComputable) {var porcentomplete = evt.loaded/ evt.total; ...} else {// No se puede calcular la información de progreso ya que el tamaño total es desconocido}}Nota: Debe agregar la escucha del evento antes de solicitar llamar a la apertura (). De lo contrario, el evento de progreso no se activará.
En el ejemplo anterior, el evento de progreso se especifica para ser procesado mediante la función UpdateProgress () y recibe un número total de bytes transmitidos en total y ya transmitido cargado, que es la longitud total (bytes) de los datos transmitidos desde el encabezado de "contenido-longitud". Sin embargo, si el valor de la propiedad de Computable de longitud es falso, entonces se desconoce el número total de bytes y el valor total es 0.
El evento de progreso existe en transmisiones de descarga y carga. El evento relacionado con la descarga se activa en el objeto xmlhttprequest, al igual que el ejemplo anterior. Los eventos relacionados con la carga se activan en el objeto xmlhttprequest.upload, así:
var req = new xmlhttprequest (); // Descargar el oyente req.upload.addeventListener ("progreso", updateProgress); req.upload.addeventListener ("load", transfercomplete); req.upload.addeventListener ("error", ",", ",",, ",,,", ",,,",, ",,,",, ",,,",, ",,,",, ",,", ",,", ". transferfailed); req.upload.addeventListener ("abort", transferido); req.open ();Nota: El evento de progreso no es válido cuando se usa el archivo: Protocolo.
Use el evento Loadend para detectar las tres condiciones de extremo de carga (abortar, carga, error):
req.addeventListener ("Loadend", Loadend, falso);
Cabe señalar que no hay forma de saber exactamente qué condición recibió la información por el evento Loadend causada por la terminación de la operación; Sin embargo, puede usar este evento para manejarlo al final de todas las transmisiones.
El objeto xmlhttprequest desencadena diferentes tipos de eventos en diferentes etapas de la solicitud, por lo que no necesita verificar la propiedad ReadyState.
Cuando se llama a Send (), se activa un solo evento de carga de carga. Cuando se carga la respuesta del servidor, el objeto xmlhttprequest experimentará un evento de progreso, generalmente cada 50 milisegundos, por lo que estos eventos pueden usarse para dar comentarios a los usuarios sobre el progreso de la solicitud.
Si la solicitud se completa rápidamente, es posible que nunca active el evento de progreso. Cuando se complete el evento, el evento de carga se activará.
Hay 3 casos en los que no se pueden completar las solicitudes HTTP, correspondientes a 3 eventos. Si el tiempo de espera de la solicitud, el evento de tiempo de espera se activará. Si la solicitud aborta, el evento de abortes se activará. Los errores de red como demasiadas redireccionamientos evitan que la solicitud se complete, pero cuando esto sucede, se activa un evento de error.
Para cualquier solicitud específica, el navegador solo activará uno de los eventos de carga, aborto, tiempo de espera y error, así como el evento de progreso.
if (/'onProgress/' in (new XMLHTTPRequest ())) {// Detección de si los eventos de progreso son compatibles con solicitud = new XMLHTTPREQUEST (); request.onProgress = function (e) {if (e.lengthComputable) {progress.innerhtml = math.round (100* e.loaded/e.total) +/'%/'; }}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.