Подтвердить что ты не робот

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

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

У меня есть веб-приложение (в свободном смысле слова), которое должно быть местным. Я пытаюсь загрузить большой объем данных после того, как пользователь загрузил страницу, в зависимости от того, что они делают на веб-странице. В Firefox 3.5 и IE8 я могу использовать jQuery AJAX() и GetScript() для этого, но в 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 Происхождение null не разрешено Access-Control-Allow-Origin для файла:///для файла:///(без сервера)
Межсайтовый XMLHttpRequest

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

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

4b9b3361

Ответ 1

Думаю, я это понял.

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

У меня есть элемент с именем next... Итак, в функции $("#next").click() у меня есть следующий код. Это выполняется только в том случае, если они нажимают "Далее".

//remove old dynamically written script tag-    
       var old = document.getElementById('uploadScript');  
   if (old != null) {  
     old.parentNode.removeChild(old);  
     delete old;  
   } 

   var head = document.getElementsByTagName("head")[0];  
   script = document.createElement('script');  
   script.id = 'uploadScript';  
   script.type = 'text/javascript';  
   script.src = 'test/' + scope_dir + '/js/list.js';  
   script.onload = refresh_page;    
   head.appendChild(script);  


function refresh_page(){  
   //perform action with data loaded from the .js file.  
}  

Кажется, что это работает и позволяет Chrome динамически загружать файлы .js в локальную файловую систему, обойдя политику контроля доступа-разрешения-источника, с которой я столкнулся, пытаясь использовать функции jQuery.

Ответ 2

Хорошо, сделал много возиться и потратил много времени. Но я понял это. Решение в моем последнем ответе отлично подходит для Chrome и для Mozilla. Но это не работает для благословенного IE, потому что IE не запускает событие onload: он думает, что он имеет дело со всеми загрузками в этом файле, и вы не можете заставить его сделать еще один. Тем не менее, IE очень рад загрузить файл с помощью функции jQuery getScript (которую Chrome не разрешит из-за политики ccess-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.support.scriptEval верен для интеллектуальных браузеров, которые запускают события onload при изменении DOM. IE не делает этого, поэтому отправляет его на .getScript; Chrome и другие, так что отправляет их другим способом. В любом случае это работает с локальными файлами.

Ответ 3

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

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

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