Использование ajax для доступа к веб-сайту из локального файла

Я немного новичок в JQuery и ajax, поэтому извиняюсь, если это вопрос новичков.

Я пытаюсь использовать ajax из локального файла для доступа к сети (например, получение текстового файла).
Я не использую IIS или что-то еще, простой файл с моего жесткого диска (и мне нужно, чтобы он оставался таким образом).
Проверено как на IE8, так и на Chrome (версия 11.0.696.60).

Вот несколько javascript для иллюстрации:

// use ajax to load from the web
$("#webText").click(function(){
    $.get("http://www.w3schools.com/jquery/demo_ajax_load.txt", function(result){
        alert(result);
});

Этот код пытается загрузить текстовый файл из Интернета - операция не работает как на IE, так и на хром (не дойдет до функции успеха).
Chrome уведомляет в консоли об ошибке "XmlHttpRequest не может загрузить _http://www.w3schools.com/jquery/demo_ajax_load.txt: Происхождение null не разрешено Access-Control-Allow-Origin"

// use ajax to load from a local file
$("#localText").click(function(){
    $.get("demo_ajax_load.txt", function(result){
        alert(result);
});

Этот код пытается загрузить из локального текстового файла.
IE: операция успешно завершена.
Chrome: не работает с той же ошибкой, что и выше.

В этот момент я думал, что невозможно связаться с сетью из локального файла, но затем я столкнулся с похожим вопросом: Ошибка XmlHttpRequest: Происхождение null не разрешено Access -контроль-Allow-Origin

Используя приведенные здесь примеры, я попытался:

// use ajax to load json object from the web
$("#webJSON").click(function(){
    var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150';
    $.get(url, function(json) {
        alert(json.photos[1].photoUrl);
    }, "jsonp");
});

И этот код отлично работает на обоих браузерах. Таким образом, очевидно, что можно установить связь с веб-службой из локального файла.

Любые идеи?

BTW - меня больше интересует аспект IE этого, Chrome и другие браузеры - проблема.

Спасибо.

Ответ 1

Проблема заключается в том, что вы работаете в Same Origin Policy, которая применяется ко всем "реальным" вызовам ajax (фактически на самом деле используется XMLHttpRequest).

Причина IE работает, но Firefox и Chrome не просты: IE не применяет SOP, когда источник является локальным файлом, а ресурс, который вы пытаетесь получить, находится в Интернете. Chrome и Firefox, с другой стороны, примените стандарт Cross-Origin Resource Sharing от W3C и включите соответствующий "это мое происхождение, ты позволишь мне поговорить с тобой? Заголовки — и w3schools говорит:" Нет, я не буду с тобой разговаривать ". (" null "- это значение" origin" для локальной машины.) Радость выбора браузеров заключается в том, что они могут принимать различные проектные решения по таким вещам.

Код, который вы нашли, что работает, не выполняет реального вызова ajax, он делает JSON-P, который не использует XMLHttpRequest вообще, и поэтому обходит SOP, но только для операций GET (не POST), и только если другой конец поддерживает его. (Функция jQuery GET может выполнять как реальные аякс-вызовы, так и JSON-P, ключом к тому, что он делает, является параметр dataType, который в примере, который вы показали, является "jsonp".)

Вы можете найти эту статью. Он описывает использование YQL (служба очистки CSS из Yahoo) в качестве междоменного прокси, поскольку YQL поддерживает JSON-P.