2013-02-08 71 views
6

द्वारा अनुमति नहीं है मैं xhr के माध्यम से http: // जावास्क्रिप्ट फ़ाइल प्राप्त करने का प्रयास कर रहा हूं लेकिन मैं ऊपर वर्णित त्रुटि में चल रहा हूं।XMLHttpRequest लोड नहीं हो सकता है उत्पत्ति को एक्सेस-कंट्रोल-अनुमति-उत्पत्ति

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

यह केवल Chrome के लिए है, क्योंकि मैं https में स्क्रिप्ट का उपयोग करना चाहते हैं:

यहाँ मेरी कोड है // लेकिन क्रोम को अपने आप अवरूद्ध http से कुछ भी: //। जिस सर्वर से मैं स्क्रिप्ट प्राप्त कर रहा हूं वह https: // नहीं चलाता है और मुझे स्क्रिप्ट की आवश्यकता होती है/कई स्क्रिप्ट होती हैं, इसलिए मैं सभी डेटा फ़ाइल में कॉपी नहीं करता हूं।

त्रुटि मैं में चल रहा हूँ:

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

[वही मूल नीति] (https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript) – epascarello

उत्तर

4

बस <script> टैग के बजाय सीधे इस एक्सएचआर आवरण डालने और फिर एक <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); 
    } 
} 

इसके अलावा, मुझे नहीं पता, लोड करने के बाद आप स्क्रिप्ट तत्व को हटाने का प्रयास क्यों करते हैं। यह उस कोड के भीतर बनाए गए किसी भी ऑब्जेक्ट/विधियों/चर को प्रभावित नहीं करेगा।

+1

यह सही है। यदि डोमेन अलग हैं तो आप एक्सएचआर के माध्यम से ऐसा नहीं कर सकते हैं। पढ़ें: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control – marekful

+0

यह विकल्प http: // और https: // समस्या को हल नहीं करता है । (यानी [अवरुद्ध] https://mysite.com पर पृष्ठ http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true) – user11235

+0

से असुरक्षित सामग्री चला गया पूरी तरह से यकीन है, लेकिन मुझे नहीं लगता कि इस मुद्दे को http बनाम https के साथ कुछ भी करना है, यह क्रॉस-डोमेन संसाधनों का एक मुद्दा है जो अवरुद्ध हो जाएगा कि संसाधन http या https है या नहीं। – speakingcode

1

क्रॉस-साइट स्क्रिप्टिंग से संबंधित सुरक्षा उद्देश्यों के लिए, अनुरोध करने वाले पृष्ठ के सर्वर से अलग सर्वर के लिए ब्राउज़र के ब्लॉक XHR अनुरोध किए गए हैं।

यदि यह महज एक स्क्रिप्ट आप लोड करना चाहते है, का उपयोग

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

सामान्य एक्सएचआर के लिए, आप jsonp तरीके का उपयोग करता है, तो एपीआई प्रदान करता है सकते हैं, या (CORS सक्षम करने के लिए एपीआई के ऑपरेटरों पूछना पार ओरिजिन रिसोर्स शेयरिंग)

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

मैं फू के लिए बदल दिया निम्नानुसार सर्वर पथ का पथ कम पथ पर होगा।

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

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

करने के लिए इसे बदल दिया है,

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

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

तो क्रोम में ठीक काम किया।

+0

बस इस जवाब के लिए धन्यवाद कहना चाहता था !! मेरे पास एक XMLHttpRequest.open() कथन था जो उपरोक्त क्रॉस डोमेन त्रुटि और इसके बजाय एक सापेक्ष पथ का उपयोग करके काम नहीं कर रहा था, मुझे क्रोम पूरी तरह से काम कर रहा था। बहुत बहुत धन्यवाद। – AlexScript

+0

आपका स्वागत है और टिप्पणी के लिए धन्यवाद! –