Что я пропускаю в XMLHttpRequest?

Я абсолютно плохо знаком с JavaScript и ajax миром, но пытающийся учиться.

Прямо сейчас я тестирую XMLHttpRequest, и я не могу сделать работу даже самым простым примером. Это - код, который я пытаюсь выполнить

    <script type="text/javascript">
        function test() {
            xhr = new XMLHttpRequest();

            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200){
                    var container = document.getElementById('line');
                    container.innerHTML = xhr.responseText;
                } else {
                    alert(xhr.status);
                }
            }  

            xhr.open('GET', 'http://www.google.com', true);                  
            xhr.send(null); 
        }
    </script>

И я всегда получаю предупреждение с состоянием 0. Я считал тонны сетей об этом, и я не знаю то, что является мной пропавшие без вести. Я буду ценить любую справку, Спасибо!

7
задан skaffman 20 March 2010 в 12:10
поделиться

3 ответа

Вы используете одну и ту же политику происхождения .

Если ваш код действительно не выполняется на www.google.com (что маловероятно), это приведет к ошибке.

Кроме того, хотя на данный момент это не вызывает у вас проблем, это плохая практика и может привести к условиям гонки, вы используете глобальные переменные повсюду.

Сделайте переменную xhr локальной для функции

var xhr = new XMLHttpRequest();

и обратитесь к ней с помощью this внутри метода onreadstatechange .

if (this.readyState == 4 && this.status == 200){
// etc etc
13
ответ дан 6 December 2019 в 07:50
поделиться

Следуя из Ответ Дэвида :

Вы должны использовать относительный путь придерживаться той же политики происхождения. В противном случае большинство браузеров просто вернут пустой responseText и status == 0 .

В качестве одного из возможных обходных путей вы можете настроить очень простой обратный прокси mod_proxy , если вы используете Apache). Это позволит вам использовать относительные пути в вашем запросе AJAX, в то время как HTTP-сервер будет действовать как прокси для любого «удаленного» местоположения.

Основная конфигурационная директива для установки обратного прокси в mod_proxy - это ProxyPass . Обычно вы используете его следующим образом:

ProxyPass     /ajax/     http://google.com/

В этом случае браузер будет запрашивать / ajax / search? Q = stack + overflow , но сервер будет обслуживать это, выступая в качестве прокси для ] http://google.com/search?q=stack+overflow .

8
ответ дан 6 December 2019 в 07:50
поделиться

В дополнение к той же проблеме политики происхождения, ваш alert находится в нелогичном месте. Когда вы используете XMLHttpRequest, функция, назначенная xhr.onreadystatechange, будет вызываться всякий раз, когда readyState изменится. readyState должно изменяться (теоретически) от 0 (инициализировано) до 1 (отправлено) до 2 (загрузка) до 3 (интерактивно) до 4 (завершено).

Что делает ваш код, так это проверяет readyState и смотрит, завершен ли запрос (if (xhr.readyState == 4)), и если нет, предупреждает о коде статуса HTTP. Поскольку запрос еще не отправлен (или только что отправлен), HTTP-статуса быть не должно.

В идеале, вы должны переместить alert внутрь блока if, чтобы он давал вам знать о завершении.

2
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: