Обход Chrome Access-control-allow-origin в локальной файловой системе?

Я читал другие те же темы политики origin здесь на SO, но я не видел никаких решений, связанных с локальной файловой системой.

у меня есть веб-приложение (в широком смысле этого слова), которое должно быть локальным. Я пытаюсь загрузить большой объем данных в после того, как пользователь загрузит страницу, в зависимости от того, что они делают на сайте. В Firefox 3.5 и IE8 я могу использовать методы AJAX() и GetScript () jQuery для этого, но в Chrome это не удается из-за того же Политика Происхождения.

XMLHttpRequest не удалось загрузить file://test/testdir/test.js. Происхождение null не допускается by Access-Control-Allow-Origin.

это происходит, когда я делаю что-то просто как

$.getScript("test.js");

это прекрасно работает в IE и Firefox.

прочитав кучу об этом, я решил попробовать написать прямо в голову документа. В консоли в Chrome я набрал следующее:

var head = document.getElementsByTagName("head")[0];  
var script =document.createElement('script');   
script.id = 'uploadScript';  
script.type = 'text/javascript';  
script.src = "upload.js";   
head.appendChild(script);

это отлично работает при вставке в консоли -<script...test.js</script> элемент добавляется в головку, оценивается и содержимое загружается в DOM.

Я думал, что это было успешно, пока я не введу этот код в функцию вызова. Тот же самый точный код при вызове из функции добавляет элемент в файл JavaScript, но не оценивает его. Не могу понять почему. Если я использую консоль Chrome для остановки выполнения в методе, который добавляет элемент В и запускает приведенный выше код, он не оценивает его. Однако, если я отключите выполнение и запустите тот же самый код (вставив его в окно консоли), он работает. Я не могу это объяснить. Кто-нибудь сталкивался с этим раньше?

Я прочитал следующие сообщения SO, но они не описывают проблему, которую я имею:

способы обойти того же происхождения политики
XMLHttpRequest Origin null не разрешено управление доступом-разрешить-Origin для файла: / / / to file:/// (Без сервера)
Кросс-сайт XMLHttpRequest

опять же, мое последнее средство-загрузить все данные при загрузке веб-страницы - это может привести к 10-секундной задержке загрузки веб-страницы, которая не нужна для 90% пользователей приложения.

Спасибо за любые предложения/альтернативы!!!

3 ответов


Я думаю я понял это.

все, что мне действительно нужно было сделать, это добавить обратный вызов в мой <script> тег. Окончательный код:

у меня есть элемент с именем next... Итак, в


хорошо, много возился и потратил много времени. Но я все понял. Решение в моем последнем ответе отлично работает для Chrome и Mozilla. Но это не работает для благословенного IE, потому что IE не будет запускать событие onload: он думает, что он справился со всеми нагрузками в этом файле, и вы не можете заставить его сделать еще один. Однако IE с удовольствием загружает файл с помощью функции jQuery getScript (которую Chrome не разрешает из-за политики csess-control-allow-origin) -- для этого вам понадобятся библиотеки JQuery. Итак, вот что я закончил:

function getMyText(){
    var url='mylocalfile.js';
    if (jQuery.support.scriptEval) { 
        var old = document.getElementById('uploadScript');  
        if (old != null) {  
             old.parentNode.removeChild(old);  
             delete old;  
            } 
        var head = document.getElementsByTagName("head")[0]; 
        var script = document.createElement('script');
        script.id = 'uploadScript';
        script.type = 'text/javascript';
        script.onload = refresh_page; 
        script.src = url; 
        head.appendChild(script);  
    } else {
       $.getScript(url,function(){
            refresh_page();
      });
     }
}

function refresh_page() {
    alert(mytext);
}

во всем этом, mylocaltext.js определяет весь мой html как содержимое переменной mytext. Уродливо, но работает. на jQuery.поддержка.scriptEval верен для интеллектуальных браузеров, которые запускают события onload, если DOM изменяется. IE не делает, так что отправляет его .getScript; Chrome и другие делают, так что отправляет их в другую сторону. В любом случае, это работает с локальными файлами.


интересно, но как я могу использовать ту же технику для загрузки всего HTML-файла? Аналогичная проблема с Вашей - у меня есть сотни HTML-файлов, которые я хочу включить в веб-страницу, в зависимости от того, что пользователь хочет видеть. Кажется, я могу использовать эту технику для загрузки всей HTML-страницы, что-то вроде:

script.id = 'uploadScript';
script.type = 'text/html';
script.src = url; 
script.onload = refresh_page; 
head.appendChild(script);  

ie, скажите ему загрузить в HTML. Я вижу из консоли, что он загружает его на страницу, и я получаю сообщение " ресурс интерпретируется как скрипт, но передается с помощью MIME введите text / html'. Но я не могу понять, как добраться до HTML, загруженного и удерживаемого в скрипте