2013-02-08 12 views
6

Sto cercando di ottenere un http: // file javascript via xhr ma sto correndo nell'errore menzionato sopra.XMLHttpRequest non può caricare Origine non consentita da Access-Control-Allow-Origin

Ecco il mio codice:

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

questo è solo per Chrome, perché vorrei utilizzare lo script in https: // ma Chrome blocca automaticamente qualsiasi cosa, da http: //. Il server da cui ottengo lo script non esegue https: // e ho bisogno dello script/ho più script che preferisco non copiare tutti in un file di dati.

L'errore che sto funzionando in:

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

[Stessa politica di origine] (https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript) – epascarello

risposta

4

Basta inserire il tag <script> direttamente invece di questo XHR involucro e poi inserire il contenuto di un tag <script>.

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

Inoltre, non so, perché si tenta di rimuovere l'elemento di script dopo il caricamento. Questo non influenzerà nessuno degli oggetti/metodi/variabili creati all'interno di quel codice.

+1

Questo è corretto. Non puoi farlo tramite XHR se i domini sono diversi. Leggi: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control – marekful

+0

Questa opzione non risolve il problema http: // e https: // che ho . (Vale a dire [bloccato] La pagina all'indirizzo https://mysite.com corse contenuti non protetti da http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true) – user11235

+0

io non sono completamente sicuro, ma non credo che il problema abbia nulla a che fare con http vs https, si tratta di un problema di risorse tra domini che verranno bloccate indipendentemente dal fatto che il resourse sia http o https. – speakingcode

1

Blocco del browser Richieste XHR effettuate su un server diverso dal server della pagina che effettua la richiesta, per motivi di sicurezza relativi allo scripting cross-site.

Se è solo uno script che si desidera caricare, utilizzare

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

Per XHR generale, è possibile utilizzare la soluzione jsonp, se l'API fornisce, o chiedere agli operatori del API per consentire CORS (la condivisione delle risorse cross-origine)

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

ho cambiato fu ll percorso del file server sul breve percorso come segue.

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

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

cambiato in,

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

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

poi ha lavorato bene in cromo.

+0

Volevo solo dire grazie per questa risposta !! Ho avuto un'istruzione XMLHttpRequest.open() che non funzionava a causa dell'errore di dominio incrociato sopra e utilizzando invece un percorso relativo, ho fatto funzionare perfettamente Chrome. Molte grazie – AlexScript

+0

Prego e grazie per il commento! –

Problemi correlati