Obejście Chrome Access-control-allow-origin w lokalnym systemie plików?

Czytałem inne te same tematy polityki origin tutaj na SO, ale nie widziałem żadnych rozwiązań związanych z lokalnym systemem plików.

Mam aplikację internetową (w luźnym tego słowa znaczeniu), która musi być obsługiwana lokalnie. Próbuję załadować dużą ilość danych po załadowaniu strony przez użytkownika, w zależności od tego,co robi na stronie. W Firefoksie 3.5 i IE8 jestem w stanie użyć metod AJAX() i GetScript() jQuery, ale w Chrome to nie działa z powodu tego samego pochodzenia Polityka.

XMLHttpRequest nie można załadować file://test/testdir/test.js. Pochodzenie {[4] } jest niedozwolone by Access-Control-Allow-Origin.

To się dzieje, gdy robię coś prostego jak

$.getScript("test.js");

To działa doskonale w IE i Firefoksie.

Po przeczytaniu kilku o tym, postanowiłem spróbować napisać bezpośrednio do głowicy dokumentu. W konsoli w Chrome wpisałem:

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);

To działa dobrze po wklejeniu w konsoli-element <script...test.js</script> jest dodawany do głowy, oceniany i zawartość załadowana do DOM.

Myślałem, że to się udało, dopóki nie umieściłem tego kodu w wywołaniu funkcji. Ten sam kod, wywołany z funkcji, dodaje element do pliku JavaScript, ale nie ocenia go. Nie wiem dlaczego. Jeśli używam konsoli Chrome, aby zatrzymać wykonywanie w metodzie, że jest dodanie elementu do i uruchomić powyższy kod, to nie ocenia go. Jeśli jednak wycofam wykonanie i uruchomię dokładnie ten sam kod (wklejając go w okno konsoli) działa. Nie mogę tego wyjaśnić. Czy ktoś już się tym zajmował?

Przeczytałem następujące posty SO, ale nie opisują problemu, który mam:

Sposoby obchodzenia Polityki tego samego pochodzenia
XMLHttpRequest Origin null nie jest dozwolone Access-Control-Allow-Origin dla pliku: / / / do pliku: / / / (Serverless)
Cross-site XMLHttpRequest

Ponownie, moją ostatnią deską ratunku jest załadowanie wszystkich danych na ładowanie strony internetowej - może to spowodować do 10 sekund opóźnienia w ładowaniu strony internetowej, które jest niepotrzebne dla 90% użytkowników aplikacji.

Dzięki za wszelkie sugestie / alternatywy!!!

Author: Community, 2011-01-20

3 answers

Imyślę już to rozgryzłem.

Wszystko, co naprawdę musiałem zrobić, to dodać callback do mojego znacznika <script>. Kod końcowy:

Mam element o nazwie next... Tak więc w funkcji $("#next").click() Mam następujący kod. Zostanie to wykonane tylko po kliknięciu "Dalej".

//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.  
}  

To wydaje się działać i pozwala Chrome dynamicznie ładować .Pliki js w lokalnym systemie plików podczas obchodzenia Zasady access-control-allow-origin, na którą wpadłem podczas próby użycia jQuery funkcje.

 4
Author: user210099,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 15:14:37

Ok, dużo się bawiłem i zmarnowałem dużo czasu. Ale zrozumiałem. Rozwiązanie w mojej ostatniej odpowiedzi działa dobrze dla Chrome, i dla Mozilli. Ale to nie działa na IE, ponieważ IE nie odpali zdarzenia onload: myśli, że poradził sobie ze wszystkimi onloadami w tym pliku i nie można go zmusić do zrobienia kolejnego. Jednak IE jest całkiem szczęśliwy, aby załadować plik za pomocą funkcji getScript jQuery (na co Chrome nie zezwoli ze względu na politykę ccess-control-allow-origin) -- do tego potrzebne będą biblioteki JQuery. Więc oto, z czym skończyłem:

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);
}

W tym wszystkim, mylocaltext.js definiuje cały mój html jako zawartość zmiennej, mytext. Brzydka, ale działa. jQuery.wsparcie.scriptEval jest prawdą dla inteligentnych przeglądarek, które uruchamiają zdarzenia onload, jeśli DOM się zmieni. IE nie, więc wysyła go do .getScript; Chrome i inne tak robią, więc wysyła je w drugą stronę. W każdym razie działa to na plikach lokalnych.

 2
Author: peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 14:58:07

Ciekawe, ale jak mogę użyć tej samej techniki do załadowania całego pliku HTML? Podobny problem do twojego -- mam setki plików HTML, które chcę umieścić na stronie internetowej, w zależności od tego, co użytkownik chce zobaczyć. Wygląda na to, że mogę użyć tej techniki, aby załadować całą stronę HTML, coś w stylu:

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

Ie, tell it load in HTML. Widzę z konsoli, że ładuje go do strony, i dostaję komunikat " zasób zinterpretowany jako skrypt, ale przeniesiony z MIME wpisz tekst / html". Ale nie mogę wymyślić żadnego sposobu, aby dostać się do HTML załadowanego i trzymanego w skrypcie

 1
Author: peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 15:15:46