2013-02-08 30 views
6

Tôi đang cố gắng tải tệp http: // javascript qua xhr nhưng tôi đang gặp lỗi được đề cập ở trên.XMLHttpRequest không thể tải Xuất xứ không được phép bởi Access-Control-Allow-Origin

Dưới đây là mã của tôi:

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

này chỉ dành cho Chrome vì tôi muốn sử dụng kịch bản trong https: // nhưng Chrome tự động chặn bất cứ điều gì từ http: //. Các máy chủ mà từ đó tôi nhận được kịch bản không chạy https: // và tôi CẦN kịch bản/có nhiều kịch bản tôi không muốn tất cả sao chép vào một tập tin dữ liệu.

Các lỗi tôi chạy vào:

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

[Chính sách gốc tương tự] (https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript) – epascarello

Trả lời

4

Chỉ cần chèn thẻ <script> trực tiếp thay vì wrapper XHR này và sau đó chèn nội dung vào một thẻ <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); 
    } 
} 

Ngoài ra, tôi không biết, tại sao bạn cố xóa phần tử tập lệnh sau khi tải. Điều này sẽ không ảnh hưởng đến bất kỳ đối tượng/phương thức/biến nào được tạo trong mã đó.

+1

Đúng vậy. Bạn không thể làm điều này thông qua XHR nếu các miền khác nhau. Đọc: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control – marekful

+0

Tùy chọn này không giải quyết được vấn đề http: // và https: // tôi có . (tức là [bị chặn] Trang tại https://mysite.com chạy nội dung không an toàn từ http://api.widgets.org/widget/1.1.2/widget_api.js?autoCreate=false&log=true) – user11235

+0

Tôi không hoàn toàn chắc chắn nhưng tôi không nghĩ rằng vấn đề này có liên quan đến http vs https, đó là vấn đề của các tài nguyên đa miền sẽ bị chặn xem liệu việc bán lại là http hay https. – speakingcode

1

Yêu cầu XHR chặn của trình duyệt được thực hiện cho máy chủ khác với máy chủ của trang đưa ra yêu cầu, vì mục đích bảo mật liên quan đến việc tạo mã cross-site.

Nếu nó chỉ là một kịch bản mà bạn muốn tải, sử dụng

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

Đối XHR Nói chung, bạn có thể sử dụng workaround jsonp, nếu api cung cấp nó, hoặc yêu cầu các nhà khai thác của API cho phép CORS (chia sẻ tài nguyên giữa các nguồn gốc)

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

tôi đã thay đổi để fu Đường dẫn của tệp máy chủ đến đường dẫn ngắn như sau.

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

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

thay đổi nó để,

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

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

Sau đó làm việc tốt trong chrome.

+0

Chỉ muốn cảm ơn câu trả lời này !! Tôi đã có một tuyên bố XMLHttpRequest.open() mà không hoạt động vì lỗi miền chéo ở trên và bằng cách sử dụng một đường dẫn tương đối thay vào đó, tôi nhận Chrome hoạt động hoàn hảo. Cảm ơn nhiều. – AlexScript

+0

Bạn được chào đón và cảm ơn nhận xét! –

Các vấn đề liên quan