Анализировать и манипулировать атрибутами ответа.
Если вы используете xmlhttprequest для получения содержимого удаленного XML -документа, свойство Recsomexml будет объектом DOM, анализируемым из документа XML, который трудно манипулировать и проанализировать. Вот пять основных способов анализа документов XML:
1. Используйте XPath, чтобы найти формулирующую часть документа.
2. Используйте Jxon, чтобы преобразовать его в дерево объектов JavaScript.
3.
4. Используйте XmlSerializer для сериализации дерева DOM в строку или файл.
5. Если вы знаете содержимое документа XML заранее, вы можете использовать Regexp. Если при сканировании с помощью REGEXP вы затронуты новые линии, вы можете удалить все новички. Однако этот подход является «последним руком», потому что, если код XML немного изменяется, подход может потерпеть неудачу.
Диаграммы и манипулируют свойством ответа, содержащих HTML -документы
Примечание. HTML разрешено проанализировать через атрибут xmlhttprequest.responsexml в спецификации w3c xmlhttprequest. Для получения более подробной информации, пожалуйста, прочитайте HTML в Xmlhttprequest.
Если вы используете xmlhttprequest, чтобы получить HTML -страницу с удаленного конца, все теги HTML хранятся в свойстве ответа в качестве строки, что затрудняет манипулирование и анализ этих тегов. Есть три основных способа проанализировать эти теги HTML:
1. Используйте свойство xmlhttprequest.responsexml.
2. Введите содержание в фрагмент документа через фрагмент. Body.innerhtml и итерация через фрагменты в DOM.
3. Если вы знаете содержимое документа HTML заранее, вы можете использовать Regexp. Если при сканировании с помощью REGEXP вы затронуты новые линии, вы можете удалить все новички. Однако этот подход является «последним руком», потому что, если код HTML немного изменяется, подход может потерпеть неудачу.
Обработка бинарных данных
Хотя Xmlhttprequest обычно используется для отправки и получения текстовых данных, он может фактически отправлять и принимать двоичный контент. Существует много хорошо проверенных способов принуждения двоичных данных с использованием xmlhttprequest. Метод. OverridemimeType () Xmlhttprequest является решением, хотя он не является стандартным методом.
var oreq = new xmlhttprequest (); oreq.open ("get", url, true); // извлечение данных, необработанных как двоичный строкорек.overridemimeType ("text/plain; charset = x-user defined");/ * ...////Свойство ResponseType было добавлено в спецификацию уровня 2 Xmlhttprequest, что облегчает отправку и получение двоичных данных.
var oreq = new xmlhttprequest (); oreq.onload = function (e) {var arraybuffer = xhr.response; // не responsetext/ * ... */} oreq.open ("get", url, true); oreq.responsetype = "arraybuffer"; oreq.send ();Принять бинарные данные, используя массив типа JavaScript
Вы можете изменить тип данных ответа, возвращаемого с сервера, установив свойство ответа на объект xmlhttprequest. Доступными значениями атрибутов являются пустые строки (по умолчанию), «Arraybuffer», «Blob», «Document» и «Text». Значения атрибута ответа будут варьироваться в зависимости от значения свойства ответа, которое может быть арестователем, каплей, документом, строкой или нулевым (если запрос не заполнен или не удас.
В следующем примере считывается файл двоичного изображения, и массив 8-битных не знаковых целых чисел создается из двоичных местных байтов файла.
var oreq = new xmlhttprequest (); oreq.open ("get", "/myfile.png", true); oreq.responsetype = "arraybuffer"; oreq.onload = function (oevent) {var raybuffer = oreq.response; // Примечание: не oreq.responsetext if (arraybuffer) {var bytearray = new uint8array (arraybuffer); for (var i = 0; i <bytearray.bytelength; i ++) {// операция для каждого байта в массиве}}}; oreq.send (null);В дополнение к вышеуказанному методу, вы также можете использовать API Blobbuilder для непосредственного добавления данных ArrayBuffer в объект Blob. Поскольку API все еще находится на экспериментальной стадии, необходимо добавить конкретный префикс:
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 blobuilder (); blobbuilder.append (oreq.response); var blob = blobbuilder.getblob ("image/png"); // ...}; oreq.send ();Принять бинарные данные в старых браузерах
Следующий метод load_binary_resource () может загружать двоичные данные из указанного URL и возвращать данные в абонента.
function load_binary_resource (url) {var req = new xmlhttprequest (); req.open (/'get/', url, false); // xhr Binary Charset Opt от Marcus Granado 2006 [http://mgran.blogspot.com] req.overridemimeType (/'text/plain; charset = x-user defined/'); req.send (null); if (req.status! = 200) return /' /'; return req.responsetext;}Самая замечательная операция-в пятой строке, которая переписывает тип MIME по умолчанию, заставляя браузер рассматривать ответ как простой текстовый файл, используя пользовательский набор символов. Это говорит браузеру не проанализировать данные и напрямую возвращать необработанный байт -код.
var fileStream = load_binary_resource (url); var abyte = fileStream.CharcoDeat (x) & 0xff; // выбрасывал высокий байт (F7)
Приведенный выше пример получает байты в x из двоичных данных, возвращаемых запросом. Действительный диапазон смещения составляет 0 до fileStream.Length-1.
Проверьте файл загрузки, используя для получения подробной информации xmlhttprequest и просмотреть файл загрузки.
Отправить бинарные данные
Метод отправки объекта xmlhttprequest был улучшен, и двоичные данные могут быть отправлены, просто передав Arraybuffer, Blob или файл.
Следующий пример создает текстовый файл и отправляет файл на сервер, используя метод POST. Вы также можете использовать другие двоичные типы данных, кроме текстового файла.
var oreq = new xmlhttprequest (); oreq.open ("post", url, true); oreq.onload = function (oevent) {// после завершения загрузки.}; var bb = new Blobbuilder (); // требуется подходящий префикс: window.mozblobbuilder или window.webkitblobbuilderbb.append (/'abc123/'); oreq.send (bb.getblob (/'text/'));Отправить массив типов в качестве двоичных данных
Вы можете отправить массивы типов JavaScript в виде двоичных данных.
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 xmlhtprequest; xhr.open (", url recr = new xmlhtprequest; false); xhr.send (myarray);Приведенный выше пример создает 512-байтовый 8-битный целочисленный массив и отправляет его. Конечно, вы также можете отправить любые бинарные данные.
Контролировать прогресс
Мониторинг событий прогресса, который поддерживает DOM для передачи XMLHTTPRequest и следует за спецификацией события Progress Web API: эти события реализуют интерфейс ProgressEvent.
var req = new XMLHttpRequest();//Upload listen req.addEventListener("progress", updateProgress, false);req.addEventListener("load", transferComplete, false);req.addEventListener("error", transferFailed, false);req.addEventListener("abort", transferCanceled, false); req.open (...); ... // Прогресс при переводе с сервера в клиенту (загрузки) функция UpdateProgress (evt) {if (evt.lengthcompable) {var protentcomplete = evt.laded/ evt.total; ...} else {// Невозможно вычислять информацию о прогрессе, поскольку общий размер неизвестен}}Примечание. Вам нужно добавить прослушивание событий, прежде чем запросить вызов Open (). В противном случае событие прогресса не будет вызвано.
В предыдущем примере указано, что событие прогресса обрабатывается функцией UpdateProgress () и получает общее количество передаваемых байтов и уже передаваемых нагруженных и уже передаваемых, что является общей длиной (байтами) данных, передаваемых из заголовка «длины контента». Однако, если значение неверного свойства длиной является ложным, то общее количество байтов неизвестно, а общее значение равно 0. Если длина известна, то свойство Dely Comployble - True
Событие Progress существует как при загрузке, так и в загрузке передачи. Связанное с загрузкой событие запускается на объекте xmlhttprequest, как приведенный выше пример. Связанные с загрузкой события запускаются на объекте xmlhttprequest.upload, например:
var req = new xmlhttprequest (); // Скачать слушатель req.upload.addeventlistener («Прогресс», UpdateProgress); req.upload.AddeventListener («нагрузка», TransferComplete); req.upload.AddeventListener («Ошибка», TransferFailed); Transfercancell); req.open ();
Примечание. Событие прогресса недействительно при использовании файла: протокол.
Используйте событие Loadend, чтобы обнаружить все три условия конечных условий (прерван, загрузка, ошибка):
req.addeventListener ("LoadEnd", LoadEnd, false);
Следует отметить, что нет никакого способа узнать точно, в каком условии информация, полученная событием Loadend, вызвана завершением операции; Тем не менее, вы можете использовать это событие, чтобы справиться с ним в конце всех трансмиссий.
Объект xmlhttprequest запускает различные типы событий на разных этапах запроса, поэтому ему не нужно проверять свойство готового штата.
При вызове Send () запускается одно событие LoadStart. Когда ответ сервера загружается, объект xmlhttprequest будет испытывать событие прогресса, обычно каждые 50 миллисекунд, поэтому эти события могут использоваться, чтобы дать пользователям обратную связь о ходе запроса.
Если запрос завершается быстро, он может никогда не вызвать событие прогресса. Когда событие будет завершено, событие загрузки будет запускается.
Есть 3 случая, когда HTTP -запросы не могут быть выполнены, соответствующие 3 событиям. Если время ожидания запроса, событие тайм -аута будет вызвано. Если запрос прерван, событие Abort будет вызвано. Сетевые ошибки, такие как слишком много перенаправлений, предотвращают завершение запроса, но когда это произойдет, событие ошибки запускается.
Для любого конкретного запроса браузер только запустит одно из событий нагрузки, прерывания, тайм -аута и ошибок, а также события прогресса.
if (/'Onprogress/' in (new xmlhttprequest ())) {// Обнаружение того, поддерживаются ли события прогресса var request = new xmlhttprequest (); request.onprogress = function (e) {if (e.lengthcompable) {progress.innerhtml = math.round (100* e.loaded/e.total) +/'%/'; }}}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.