2013-02-08 7 views
6

Próbuję uzyskać http: // javascript za pośrednictwem xhr, ale mam uruchomiony błąd wspomniany powyżej.XMLHttpRequest nie można załadować Origin nie jest dozwolona przez Access-Control-Allow-Origin

Oto mój kod:

function getXHR() { 
    var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; 

    if (is_chrome) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", "http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true", true); 
    xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     var s = document.createElement('script'); 
     s.textContent = xhr.responseText; 
     (document.head||document.documentElement).appendChild(s); 
     s.parentNode.removeChild(s); 
     } 
    } 
    xhr.send(); 
    } 
} 

To jest tylko dla Chrome, ponieważ chciałbym użyć skryptu w https: // ale Chrome automatycznie blokuje coś od http: //. Serwer, z którego uzyskuję skrypt, nie działa w trybie https: // i POTRZEBUJĘ skryptu/mam wiele skryptów, których nie chciałbym kopiować do pliku danych.

Błąd biegnę do:

XMLHttpRequest cannot load http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true. Origin https://mysite.com is not allowed by Access-Control-Allow-Origin. 
+0

[Polityka tego samego pochodzenia] (https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript) – epascarello

Odpowiedz

4

Wystarczy włożyć <script> tag bezpośrednio zamiast tego XHR opakowanie a następnie wstawienie treści do <script> tagu.

function getScript() { 
    var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; 

    if (is_chrome) { 
     // generate script element and set its source 
     var s = document.createElement('script'); 
     s.src = "http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true"; 
     // remove the script element after loading 
     s.addEventListener('load', function(){ s.parentNode.removeChild(s); }); 
     (document.head||document.documentElement).appendChild(s); 
    } 
} 

Poza tym, nie wiem, dlaczego próbujesz usunąć element skryptu po załadowaniu. To nie wpłynie na żaden z obiektów/metod/zmiennych utworzonych w tym kodzie.

+1

Zgadza się. Nie możesz tego zrobić poprzez XHR, jeśli domeny są różne. Przeczytaj: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control – marekful

+0

Ta opcja nie rozwiązuje problemu z http: // i https: //, który mam . (tj. [zablokowane] Strona pod adresem https://mysite.com wyświetlała niezabezpieczoną treść z http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true) – user11235

+0

Nie jestem całkowicie pewny, ale nie sądzę, że problem ma coś wspólnego z protokołem http i https, jest to kwestia zasobów międzydomenowych, które będą blokowane, niezależnie od tego, czy resource jest http czy https. – speakingcode

1

Blokowanie przez przeglądarkę żądań XHR na serwerze, który różni się serwerem strony wysyłającej żądanie, ze względów bezpieczeństwa związanych ze skryptami cross-site.

Jeśli to tylko scenariusz chcesz załadować, użyj

<script src="..."></script> 

Ogólne XHR, można użyć obejście jsonp, jeżeli API zapewnia go, albo poprosić operatorów API, aby umożliwić CORS (współdzielenie zasobów cross-pochodzenie)

http://developer.chrome.com/extensions/xhr.html https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS http://www.w3.org/TR/cors/ http://en.wikipedia.org/wiki/JSONP

3

Zmieniłem do fu ll ścieżka pliku serwera do krótkiej ścieżki w następujący sposób.

$.post('http://example.com/pages/loadRandomImages.php',{'type':'loadRandomImages','loadingReq':'True'},function(data){ 

------------ 
---------- 
}); 

Zmieniono go,

$.post('/pages/loadRandomImages.php',{'type':'loadRandomImages','loadingReq':'True'},function(data){ 

------------ 
---------- 
}); 

Następnie pracował dobrze w chromie.

+0

Chciałam tylko podziękować za tę odpowiedź !! Miałem instrukcję XMLHttpRequest.open(), która nie działała z powodu powyższego błędu cross-domain i zamiast tego używała względnej ścieżki, więc sprawiłem, że Chrome działa idealnie. Wielkie dzięki. – AlexScript

+0

Nie ma za co i dziękuję za komentarz! –

Powiązane problemy