Как AJAX может противостоять, если XMLHttpRequestObject удален и / или не содержит значения, так как для него также установлено значение null? - PullRequest
7 голосов
/ 24 февраля 2010

Итак, я читаю книгу об AJAX, и они говорят об использовании внутренней функции как способа обработки нескольких запросов. Я понимаю это, но в этом фрагменте кода, который они использовали, я не понимаю, как переменная XMLHttpRequestObject все еще может использоваться:

if(XMLHttpRequestObject) 
{
    XMLHttpRequestObject.open(“GET”, dataSource);

    XMLHttpRequestObject.onreadystatechange = function()
    {
        if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
        {
            document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText;
            delete XMLHttpRequestObject;
            XMLHttpRequestObject = null;
        }
    }

    XMLHttpRequestObject.send(null);
}

Моя первая проблема - когда они удаляют XMLHttpRequestObject, а затем, после того, как он предположительно удален, они устанавливают его равным нулю. Затем после того, как он якобы удален и установлен в ноль, они используют XMLHttpRequestObject.send(null); Но как он что-то делает, когда XMLHttpRequestObject удаляется и / или не содержит значения, поскольку он также имеет значение ноль?

Ответы [ 3 ]

2 голосов
/ 24 февраля 2010

Функция onreadystatechange не выполняется сразу после создания. Как следует из названия, оно вызывается при изменении состояния.

В этом случае объект XMLHttpRequestObject удаляется только после XMLHttpRequestObject.readyState == 4 и XMLHttpRequestObject.status == 200, т. Е. После успешного получения страницы.

1 голос
/ 24 февраля 2010

Моя первая проблема - когда они удаляют XMLHttpRequestObject, а затем, после его предположительного удаления, они устанавливают его равным нулю.

Не знаю, почему они это делают. Установка null мне кажется достаточной, но, возможно, это решает некоторую неясную причуду браузера.

Затем после того, как он предположительно удален и установлен в нуль, они используют XMLHttpRequestObject.send (null);

нет. удаление происходит внутри обработчика событий - эта функция обработчика событий не вызывается до тех пор, пока не будет выполнен запрос, и состояние объекта xhr не изменится, например, из-за того, что сервер отправил ответ, или произошла ошибка при обмене данными.

По сути, вызывающая последовательность отличается от последовательности объявления . Последовательность вызова:

XMLHttpRequestObject.open(“GET”, dataSource);
... //assign event handler so it can be called later on
XMLHttpRequestObject.send(null); 
... //request send, program continues


//separate context here, goes off when the readystate of the xhr changes
//due to server response or error:
function()
{
    if (XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200) 
    {
        document.getElementById(“targetDiv”).innerHTML = XMLHttpRequestObject.responseText;
        delete XMLHttpRequestObject;
        XMLHttpRequestObject = null;
    }
}
0 голосов
/ 24 февраля 2010

Устанавливает функцию, которая вызывается при изменении состояния. Это не вызывается сразу, поэтому он не использует объект сразу.

Тот факт, что вы можете использовать XmlHttpRequestedObject внутри, - это, по сути, хитрая хитрость компилятора, где он пишет некрасивый код для переноса функции и содержимого переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...