2014-03-03 3 views
0

Следующая функция javascript отлично работает для IE, Safari и Firefox. Но это не удается в Chrome (33.0.) И Opera (16.0.1196). При загрузке отображается пустая страница HTML.XMLHttpRequest(). Send() не работает в chrome и opera

function readTestXMLFile() { 

    if (window.ActiveXObject) { 
     var xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); 
     xmlDoc.async = 'false'; 
     xmlDoc.load('test.xml'); 
    } 
    else {  
     var requ = new XMLHttpRequest(); 
     alert("a"); 

     requ.open("GET", "test.xml", false); 
     alert("b"); 

     requ.send(null); //This line is not working in chrome and opera 
     alert("c"); 

     var xmlDoc = requ.responseXML; 
     alert(xmlDoc); 
     alert("d"); 
    } 

    return xmlDoc; 
} 

Печатаются только буквы 'a' и 'b'. После этого он не продолжается. Тот же результат наблюдается, если я использую requ.send() или requ.send ("") вместо request.send (null).

Если я удалю инструкцию requ.send (null), то для xmlDoc будет напечатано значение «null». Все еще пустые загрузки HTML.

Пожалуйста, дайте мне знать, как правильно работать в Chrome и Opera.

Thanks

SRB.

+0

Если вы посмотрите в консоли браузера Chrome, какое сообщение вы получите? Единственная ошибка, которую я получаю, заключается в том, что test.xml не существует, что ожидается. – Mathias

+0

Я получаю «Запросы на кросс-начало поддерживаются только для HTTP». сообщение об ошибке в консоли. Пожалуйста, дайте мне знать, что я должен сделать, чтобы уйти от этого? Примечание: У меня есть только этот вызов функции в java-скрипте. Никаких других вызовов функций. С возвращаемым значением из этой функции я ничего не делаю в настоящее время (для цели отладки).HTML загружается успешно, если я удалю вызов этой функции. Спасибо – srb

ответ

0

вызов метода XMLHttpRequest.send является асинхронным, поэтому вам нужно немного изменить вызов. Измененный код ниже будет печатать содержание ответа, когда ответ успешно возвращается:

requ.addEventListener("load", function(e) { 
      alert(req.responseText); 
     }, false) 

requ.send(null); 

Update: Я не заметил, что вы сделали синхронные отправить запрос вызова.

Edit Вы должны запустить хром с этим параметром, чтобы иметь возможность получить доступ к локальным файлам

--allow-доступ к файлам, из-файлов

например: C: \ Browser \ chrome.exe --allow-file-access-from-files

+1

Вызов, который выполняет OP, на самом деле синхронен, поскольку он имеет «ложь» в качестве третьего параметра в 'open' – Mathias

+0

@Mathias, хороший улов! – Rami

+0

Спасибо за ответ. Я уже пробовал это решение, но ничего не менял. Ничего не печатается. Экземпляр responseText не печатается в Chrome и Opera. Но responseText успешно печатается в Firefox и Safari. – srb

0

Я думаю, что проблема в том, что вы передаете null методу send(). Вы делаете запрос GET, поэтому вы должны позвонить send без параметров. Из-за этого хром выдает исключение. Просто удалите нуль

+0

Тот же результат наблюдается, если я использую requ.send() или requ.send ("") вместо request.send (null). Это не решило проблему. - Спасибо – srb

1

Ваше сообщение об ошибке предположить, что вы пытаетесь получить доступ к локальному файлу, который рассматривается как «запрос Креста происхождения» если вы попытаетесь запустить локальный сервер, он должен работать.

Взгляните на этот ранее заданный вопрос с той же проблемой: Cross origin requests are only supported for HTTP but it's not cross-domain

Тогда вы бы получить доступ к http://localhost/.../test.xml вместо c:/localhost/.../test.xml

Вы также можете установить флаг для Chrome, чтобы локальные файлы запросить локальные файлы: -allow-file-access-from-files

+0

Да. Я обращаюсь к локальному файлу test.xml, который хранится вместе с другими html-файлами. Когда я открываю html-файл в браузере, он должен читать файл test.xml и отображать некоторое содержимое. Я не использую сервер для этого. Оба файла html и xml устанавливаются в системе конечного пользователя. Таким образом, пользователь устанавливает эти файлы и открывает html-файл, который inturn считывает XML-файл и отображает некоторое содержимое. Для этой цели конечный пользователь не должен иметь никакого сетевого подключения. Все должно работать на местном уровне. Так есть ли способ решить эту проблему? Пожалуйста, дайте мне знать. Спасибо – srb

+0

Я просто думаю, почему он терпит неудачу только в хроме и опере. И работает в других браузерах? - Спасибо – srb

+1

Это зависит от того, как различные браузеры обрабатывают запрос локальным файлам. Если вы посмотрите на вопрос, который я связал с ним, они рекомендуют несколько других решений, таких как установка флагов в Chrome, -allow-file-access-from-files. – Mathias

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