Проблемы с jQuery getJSON при использовании локальных файлов в Chrome

У меня есть очень простая тестовая страница, которая использует запросы XHR с помощью методов jQuery $.getJSON и $.ajax. Одна и та же страница работает в одних ситуациях, а не в других. В частности, он не работает в Chrome на Ubuntu.

Я тестирую Ubuntu 9.10 с Chrome 5.0.342.7 beta и Mac OSX 10.6.2 с Chrome 5.0.307.9 beta.

  • Он работает правильно, когда файлы установлены на веб-сервере из Ubuntu/Chrome и Mac/Chrome ( попробуйте здесь).
  • Он работает правильно, когда файлы установлены на локальный жесткий диск в Mac/Chrome (доступ с помощью файла:///...).
  • Сбой, когда файлы установлены на локальный жесткий диск в Ubuntu/Chrome (доступ с помощью файла:///...).

Небольшой набор из 3 файлов можно скачать в файле tar/gzip здесь: http://issues.tauren.com/testjson/testjson.tgz

Когда это работает, консоль Chrome скажет:

XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:16Using getJSON
index.html:21
Object
result: "success"
__proto__: Object
index.html:22success
XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:29Using ajax with json dataType
index.html:34
Object
result: "success"
__proto__: Object
index.html:35success
XHR finished loading: "http://issues.tauren.com/testjson/data.json".
index.html:46Using ajax with text dataType
index.html:51{"result":"success"}
index.html:52undefined

Когда это не работает, консоль Chrome покажет это:

index.html:16Using getJSON
index.html:21null
index.html:22Uncaught TypeError: Cannot read property 'result' of null
index.html:29Using ajax with json dataType
index.html:34null
index.html:35Uncaught TypeError: Cannot read property 'result' of null
index.html:46Using ajax with text dataType
index.html:51
index.html:52undefined

Обратите внимание, что он даже не показывает XHR-запросы, хотя обработчик успеха запущен. Клянусь, это работало ранее в Ubuntu/Chrome, и я обеспокоен тем, что что-то испортилось. Я уже удалил и переустановил Chrome, но это не помогло.

Может ли кто-нибудь попробовать это локально в вашей системе Ubuntu и сказать, есть ли у вас проблемы? Обратите внимание, что в Firefox он работает нормально.

7 ответов

Решение

Это известная проблема с Chrome.

Вот ссылка в трекере ошибок:

Проблема 40787: локальные файлы не загружаются с Ajax

Другой способ сделать это - запустить локальный HTTP-сервер в вашем каталоге. В Ubuntu и MacO с установленным Python это одна строка.

Перейдите в каталог, содержащий ваши веб-файлы, и:

python -m SimpleHTTPServer

Затем подключитесь к http://localhost:8000/index.html с помощью любого веб-браузера, чтобы проверить свою страницу.

В Windows Chrome может быть установлен в вашей папке AppData:

"C: \ Users \\ AppData \ Local \ Google \ Chrome \ Application"

Перед выполнением команды убедитесь, что все окна Chrome закрыты и не работают в противном случае. Или параметр командной строки не будет эффективным.

chrome.exe --allow-file-access-from-files

Вы можете поместить свой json в js файл и сохранить его в глобальной переменной. Это не асинхронный, но это может помочь.

Дополнительный способ обойти эту проблему - использовать локальную изолированную программную среду безопасности Flash Player и методы ExternalInterface. С помощью JavaScript можно запросить приложение Flash, опубликованное с использованием изолированной программной среды безопасности "Только локальное", чтобы загрузить файл с жесткого диска, и Flash может передать данные обратно в JavaScript с помощью класса ExternalInterface. Я проверил это в Chrome, FF и IE9, и он работает хорошо. Я был бы рад поделиться кодом, если кому-то интересно.

РЕДАКТИРОВАТЬ: я начал проект Google Code (ирония?) Для реализации: http://code.google.com/p/flash-loader/

Этот код прекрасно работал с sheet.jsonlocally с синхронизацией браузера в качестве локального сервера. -Но когда на моем удаленном сервере я получил 404 для файла sheet.json, используя Chrome. Это хорошо работало в Safari и Firefox. -Изменил имя листа.json на лист.JSON. Тогда это работало на удаленном сервере. У кого-нибудь еще есть такой опыт?

getthejason = function(){
var dataurl = 'data/sheet.JSON';
var xhr = new XMLHttpRequest();
xhr.open('GET', dataurl, true);
xhr.responseType = 'text';
xhr.send();
console.log('getthejason!');

xhr.onload = function() {
.....
}

@Mike На Mac, введите это в Терминале:

open -b com.google.chrome --args --disable-web-security
Другие вопросы по тегам