Analisar e manipular atributos de respostaxml
Se você usar o XMLHTTPREQUEST para obter o conteúdo de um documento XML remoto, a propriedade ResponseXML será um objeto DOM analisado no documento XML, que é difícil de manipular e analisar. Aqui estão cinco maneiras principais de analisar os documentos XML:
1. Use XPath para localizar a parte da formulação do documento.
2. Use o JXON para convertê -lo em uma árvore de objeto JavaScript.
3. Exiba manualmente e serialize XML em cordas ou objetos.
4. Use XMLSerializer para serializar a árvore Dom em uma string ou arquivo.
5. Se você conhece o conteúdo do documento XML com antecedência, poderá usar o Regexp. Se você for afetado por linhas de novo ao digitalizar com o Regexp, convém excluir todas as linhas de novo. No entanto, essa abordagem é uma "última mão", porque se o código XML mudar ligeiramente, a abordagem poderá falhar.
Paresas e manipula a propriedade Respotetext contendo documentos HTML
NOTA: O HTML pode ser analisado através do atributo xmlHttPreQuest.Responsexml na especificação W3C XMlhttPrequest. Para mais detalhes, leia o HTML no xmlHttPrequest.
Se você usar o XMLHTTPREQUEST para obter uma página HTML da extremidade remota, todas as tags HTML serão armazenadas na propriedade Respotetext como uma string, dificultando a manipulação e a análise dessas tags. Existem três maneiras principais de analisar essas tags HTML:
1. Use a propriedade xmlHttPrequest.Responsexml.
2. Injete o conteúdo em um fragmento de documento através do fragmento.body.innerhtml e itera através de fragmentos no DOM.
3. Se você conhece o conteúdo do documento HTML com antecedência, poderá usar o Regexp. Se você for afetado por linhas de novo ao digitalizar com o Regexp, convém excluir todas as linhas de novo. No entanto, essa abordagem é uma "última mão", porque se o código HTML mudar ligeiramente, a abordagem poderá falhar.
Manuseio de dados binários
Embora o xmlHttPrequest seja geralmente usado para enviar e receber dados de texto, ele pode realmente enviar e aceitar conteúdo binário. Existem muitas maneiras bem testadas de forçar dados binários a serem enviados usando o XMLHTTPREQUEST. O método .Overridemimetype () do xmlHttPrequest é uma solução, embora não seja um método padrão.
var oreq = new xmlHttPrequest (); oreq.open ("get", url, true); // Recupera os dados não processados como um racmante binário stringoreq.overridemimetype ("text/planing; charset = x-user-definido");/ * ... */A propriedade ResponseType foi adicionada à especificação XMLHTTPREQUEST Nível 2, facilitando o envio e o recebimento de dados binários.
var oreq = new xmlHttPrequest (); oreq.onload = function (e) {var ArrayBuffer = xhr.Response; // não responseText/ * ... */} oreq.open ("get", url, true); oreq.responseType = "ArrayBuffer"; oreq.send ();Aceite dados binários usando o JavaScript Type Array
Você pode alterar o tipo de dados de uma resposta retornado do servidor, configurando a propriedade Responsetype de um objeto XMLHTTPREQUEST. Os valores de atributo disponíveis são strings vazios (padrão), "ArrayBuffer", "Blob", "Document" e "Text". Os valores do atributo de resposta variam dependendo do valor da propriedade ResponseType, que pode ser um ArrayBuffer, Blob, Document, String ou NULL (se a solicitação não for concluída ou falhou)
O exemplo a seguir lê um arquivo de imagem binário e uma matriz de números inteiros não assinados de 8 bits é criada a partir dos bytes nativos binários do arquivo.
var oreq = novo xmlHttPrequest (); oreq.open ("get", "/myfile.png", true); oreq.ResponseType = "ArrayBuffer"; oreq.onload = function (oEvent) {var ArrayBuffer = oreq.Respensonsensonse; // Nota: não Oreq.ResponseText if (ArrayBuffer) {var byteArray = new Uint8Array (ArrayBuffer); for (var i = 0; i <bytearray.byTeLength; i ++) {// operação para cada byte na matriz}}}; oreq.send (null);Além do método acima, você também pode usar a API do Blobbuilder para adicionar diretamente dados do ArrayBuffer a um objeto BLOB. Como a API ainda está em estágio experimental, um prefixo específico precisa ser adicionado:
var blobbuilder = window.mozblobbuilder || window.webkitblobbuilder || window.msblobbuilder || window.blobbuilder; var oreq = novo xmlHttPrequest (); oreq.open ("get", "/myfile.png", true); oreq.ResponseType = "ArrayBuffer"; oreq.onLload = function (oevent) {var blobbuilder = newbbB = newringer; blobbuilder.append (Oreq.Response); var blob = blobbuilder.getblob ("imagem/png"); // ...}; oreq.send ();Aceite dados binários em navegadores antigos
O seguinte método load_binary_resource () pode carregar dados binários do URL especificado e retornar os dados ao chamador.
função load_binary_resource (url) {var req = novo xmlHttPrequest (); req.open (/'get/', url, false); // XHR CHARSET BINARY OPT DE MARCUS GRANADO 2006 [http://mgran.blogspot.com] req.overridemimetype (/'text/planing; charset = x-user-Defined/'); req.send (nulo); if (req.status! = 200) return /' /'; Retornar req.ResponsEtext;}A operação mais maravilhosa está na quinta linha, que reescreve o tipo MIME padrão, forçando o navegador a tratar a resposta como um arquivo de texto sem formatação, usando um conjunto de caracteres definido pelo usuário. Isso diz ao navegador para não analisar os dados e retornar diretamente o bytecode não processado.
var filestream = load_binary_resource (url); var abyte = filestream.charcodeat (x) e 0xff; // jogado fora byte de alto bit (f7)
O exemplo acima obtém os bytes em x dos dados binários retornados pela solicitação. O intervalo de deslocamento válido é 0 para FileStream.Length-1.
Confira o arquivo de download usando xmlhttprequest para obter detalhes e visualize o arquivo de download.
Envie dados binários
O método de envio do objeto XMLHTTPREQUEST foi aprimorado e os dados binários podem ser enviados simplesmente passando um objeto ArrayBuffer, Blob ou Arquivo.
O exemplo a seguir cria um arquivo de texto e envia o arquivo para o servidor usando o método de postagem. Você também pode usar outros tipos de dados binários que não sejam o arquivo de texto.
var oreq = new xmlHttPrequest (); oreq.open ("post", url, true); oreq.onload = function (oevent) {// após o upload é concluído.}; var bb = new Blobbuilder (); // é necessário um prefixo adequado: window.mozblobbuilder ou window.webkitblobbuilderbb.append (/'abc123/'); oreq.send (bb.getblob (/'text/planing/'));Envie uma variedade de tipos como dados binários
Você pode enviar matrizes do tipo JavaScript como dados binários.
var myarray = new ArrayBuffer (512); var longInt8View = new UINT8Array (myArray); para (var i = 0; i <longInt8View.length; i ++) {longInt8View [i] = i % 255;} var xhr = new XmlHttTrequest; falso); xhr.send (MyArray);O exemplo acima cria uma matriz inteira de 512 bytes de 8 bits e a envia. Obviamente, você também pode enviar dados binários.
Monitore o progresso
O Monitoramento de Eventos de Progresso que suporta DOM é para a transmissão XMLHTTPREQUEST e segue a especificação do evento de progresso da API da Web: Esses eventos implementam a interface ProgressEvent.
var req = novo xmlhttPrequest (); // upload Ouça req.addeventListener ("Progress", UpdateProgress, false); req.addeventListener ("load", transferclete, false); req.addeventListener ("error", transferida, falsete, falsen; false); req.open (...); ... // Progresso em transferências do servidor para o cliente (downloads) Função UpdateProgress (EVT) {if (evt.lengthComputable) {var %Complete = evt.loaded/ evt.total; ...} else {// Não é possível calcular informações de progresso, pois o tamanho total é desconhecido}}NOTA: Você precisa adicionar a escuta de eventos antes de solicitar a chamada aberta (). Caso contrário, o evento de progresso não será acionado.
No exemplo anterior, o evento de progresso é especificado para ser processado pela função UpdateProgress () e recebe número total de bytes transmitidos no total e já transmitidos carregados, que é o comprimento geral (bytes) dos dados transmitidos do cabeçalho "conteúdo de comprimento de conteúdo". No entanto, se o valor da propriedade Computável é falsa, o número total de bytes é desconhecido e o valor total será 0. Se o comprimento for conhecido, a propriedade Computable é verdadeira
O evento de progresso existe nas transmissões de download e upload. O evento relacionado ao download é acionado no objeto xmlHttPrequest, assim como o exemplo acima. Eventos relacionados ao upload são acionados no objeto xmlhttprequest.Upload, como este:
var req = new xmlhttPrequest (); // download do ouvinte req.upload.addeventListener ("Progress", UpdateProgress); req.upload.addeventListener ("Load", transferComplete); req.upload.addeventListener ("Error",,,,,, ", transferclete); req.upload.addeventListener (" Error ",,,,", transferclete); req.upload.addeventListener ("Error",,,, ", transferclete); req.upload.addeventListener transferfailed); req.upload.addeventListener ("abort", transferCancEled); req.open ();Nota: O evento de progresso é inválido ao usar o arquivo: protocolo.
Use o evento Loadend para detectar todas as três condições finais de carga (abortar, carga, erro):
req.AddeventListener ("loadend", loadend, false);
Deve -se notar que não há como saber exatamente em que condição as informações recebidas pelo evento Loadend são causadas pelo término da operação; No entanto, você pode usar este evento para lidar com ele no final de todas as transmissões.
O objeto xmlHttPrequest desencadeia diferentes tipos de eventos em diferentes estágios da solicitação, para que não precise verificar a propriedade ReadyState.
Quando o envio () é chamado, um único evento do LoadStart é acionado. Quando a resposta do servidor está carregando, o objeto XMLHTTPREQUEST experimentará um evento de progresso, geralmente a cada 50 milissegundos, para que esses eventos possam ser usados para dar aos usuários feedback sobre o progresso da solicitação.
Se a solicitação concluir rapidamente, ele nunca pode acionar o evento de progresso. Quando o evento terminar, o evento de carga será acionado.
Existem 3 casos em que as solicitações HTTP não podem ser concluídas, correspondendo a 3 eventos. Se o tempo limite da solicitação, o evento de tempo limite será acionado. Se a solicitação abortar, o evento de aborto será acionado. Erros de rede, como muitos redirecionamentos, impedem que a solicitação seja concluída, mas quando isso acontece, um evento de erro é acionado.
Para qualquer solicitação específica, o navegador acionará apenas um dos eventos de carga, aborto, tempo limite e erro, bem como o evento de progresso.
if (/'onProgress/' in (novo xmlHttPrequest ())) {// detecção se os eventos de progresso são suportados var request = new xmlHttPrequest (); request.onProgress = function (e) {if (e.LengthComputable) {Progress.innerhtml = Math.Round (100* E.Loaded/E.Total) +/'%/'; }}}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.