2012-03-09 3 views
0

Я играл с Javascript, и теперь я пришел в Аякс. Я пытаюсь написать очень простой скрипт, который получит содержимое файла - напечатайте содержимое файла txt в div с помощью id=test. Это сценарий:Почему мой основной сценарий Ajax не работает?

function loadXMLDoc(url) 
{ 
    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
    } 
    else 
    {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 

    xmlhttp.open("GET" , url ,false); 
    xmlhttp.send(null); 
    document.getElementById('test').innerHTML = xmlhttp.responseText; 
} 

когда я использую его на этом сайте:

<div id="test" name="test"> HELLo </div> 
<button type="button" onclick="loadXMLDoc('test1.txt')">ClickMe1</button> 

С помощью этого скрипта HELLo заменяется ничем - сценарий опорожняет контейнер.

Возможно, мне не хватает чего-то тривиального, но мне нужен PHP? Я так не думаю, но ... Я не уверен, что здесь происходит. Когда я отлаживаю, xmlhttp пуст все время. Зачем ?

+4

Я бы предложил использовать фреймворк, такой как JQuery для ajax, он автоматически обрабатывает множество несоответствий между разными браузерами и даже тем же браузером, но разными версиями. – alykhalid

+0

какая ошибка у вас? –

+0

@ ClydeLobo Как я обнаружил сейчас, мой «xmlhttp.status» - это все время «0». Почему так? Я должен получить '200' – Patryk

ответ

1

Для других IE браузеров

активный объект в IE X, похоже, не слишком заботится о состоянии готовности, другие браузеры не могут иметь текст загружается достаточно быстро в то время вы запускаете свою функцию (следовательно, почему вы получаете пустоту вместо содержимого файла). Активный X IE, похоже, обрабатывает это автоматически и игнорирует состояние готовности, поэтому вам придется разбить код по-другому, как показано ниже. Обычно вы проверяете status запроса, чтобы убедиться, что он был полностью прочитан или нет до доступа к responseText.

Добавить onreadystatechange вы не проверить атрибут status, так как нет никаких HTTP запросов не делается на файловой системы запроса. (Статус всегда будет 0 для запроса не производится через HTTP) Лучшее, что я могу предложить это:

function loadXMLDoc(url) 
{ 
    if (window.XMLHttpRequest) 
    {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = function() { 
     document.getElementById('test').innerHTML = xmlhttp.responseText; 
     } 
     xmlhttp.open("GET", url); 
     xmlhttp.send(null); 

    } 
    else 
    {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 

     xmlhttp.open("GET", url); 
     xmlhttp.send(null); 
     document.getElementById('test').innerHTML = xmlhttp.responseText; 
    } 

} 

Для ХРОМ

Если вы используете ХРОМ вы должны начать хром с переключатель --allow-file-access-from-files. В противном случае он откажется от файловой системы ajax-запросов. (Вам придется установить это, даже если вы используете так называемую «более легкую» библиотеку, такую ​​как jQuery).

Запуск AJAX приложений на файловой системе в целом

Не всегда хорошая идея, много предостережений к этому маршруту. Обычно локальная разработка выполняется с помощью веб-сервера, установленного на localhost на вашей машине разработки.

+0

Очень хороший anwer, но он не работает таким образом. – Patryk

+0

Если вы скажете мне, какую ОС и браузер (и версию) вы используете, я могу попытаться помочь вам получить рабочую версию. – user17753

+0

Я использую Windows 7 (64 бит) и Opera 11.61. – Patryk

-1

Попробуйте jQuery. Скачать последнюю версию here и написать этот фрагмент кода:

function loadXMLDoc(url) { 
    $("#test").load(url); 
} 

Это намного проще и менее подвержены ошибкам

1

Вам нужно проверить readyState и статус ответа HTTP перед заменой текста;

if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
    document.getElementById("test").innerHTML=xmlhttp.responseText; 
    } 

пример на http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

Пожалуйста, дайте мне знать, если это работает.

+0

Я пробовал это и: во время отладки я обнаружил, что мой« xmlhttp.status »- это все время« 0 ». Что тут не так? – Patryk

+0

Вы пытаетесь сделать любой запрос перекрестного домена ... вы, кажется, не получаете ответ назад для запроса u make. – testndtv

+0

Я делаю все на локальной машине - как указано ранее, без какого-либо веб-сервера. – Patryk

-1

Вам нужен сервер для прослушивания запросов. Ваша обычная файловая система не сможет отвечать на запросы AJAX.

Вам не нужен PHP, однако вам понадобится apache или похожий веб-сервер.

+0

Я думаю, что мне не нужен сервер, но если я ошибаюсь пожалуйста, исправьте меня. – Patryk

0

Во-первых, вам нужно сражаться с Same Origin Policy.

Простой рабочий код для синхронного запроса следующее:

var req = new XMLHttpRequest(); 
req.onreadystatechange = function() { 

if (req.status == 200 && req.readyState == 4) { 
    ... 
} 

req.open('GET', url, true); 
req.send(null); 

Примечание это работает для Firefox/Opera/Chrome.Если IE, используйте:

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
+0

Я также пробовал это - асинхронный запрос - он тоже не работал. – Patryk

Смежные вопросы