Я абсолютно плохо знаком с 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. Я считал тонны сетей об этом, и я не знаю то, что является мной пропавшие без вести. Я буду ценить любую справку, Спасибо!
Вы используете одну и ту же политику происхождения .
Если ваш код действительно не выполняется на www.google.com (что маловероятно), это приведет к ошибке.
Кроме того, хотя на данный момент это не вызывает у вас проблем, это плохая практика и может привести к условиям гонки, вы используете глобальные переменные повсюду.
Сделайте переменную xhr локальной для функции
var xhr = new XMLHttpRequest();
и обратитесь к ней с помощью this
внутри метода onreadstatechange
.
if (this.readyState == 4 && this.status == 200){
// etc etc
Следуя из Ответ Дэвида :
Вы должны использовать относительный путь придерживаться той же политики происхождения. В противном случае большинство браузеров просто вернут пустой 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
.
В дополнение к той же проблеме политики происхождения, ваш alert
находится в нелогичном месте. Когда вы используете XMLHttpRequest, функция, назначенная xhr.onreadystatechange
, будет вызываться всякий раз, когда readyState
изменится. readyState
должно изменяться (теоретически) от 0 (инициализировано) до 1 (отправлено) до 2 (загрузка) до 3 (интерактивно) до 4 (завершено).
Что делает ваш код, так это проверяет readyState
и смотрит, завершен ли запрос (if (xhr.readyState == 4)
), и если нет, предупреждает
о коде статуса HTTP. Поскольку запрос еще не отправлен (или только что отправлен), HTTP-статуса быть не должно.
В идеале, вы должны переместить alert
внутрь блока if
, чтобы он давал вам знать о завершении.