2014-04-01 34 views
23

我要發送的請求參數到其他域JavaScript的XMLHttpRequest的JSONP

我已經知道了跨腳本需要JSONP和我已經使用JSONP使用jQuery阿賈克斯

,但我不知道如何做跨作爲腳本使用XMLHttpRequest的

下面的代碼我的基本的XMLHttpRequest代碼。

我想我需要恰克xhr.setRequestHeader(),我必須添加解析代碼

請給我任何的想法

var xhr; 
function createXMLHttpRequest(){  
    if(window.AtiveXObject){ 
     xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
    }else{ 
     xhr = new XMLHttpRequest(); 
    } 
    var url = "http://www.helloword.com"; 
} 

function openRequest(){ 
    createXMLHttpRequest(); 
    xhr.onreadystatechange = getdata; 
    xhr.open("POST",url,true); 
    xhr.setRequestHeader("Content-Type",'application/x-www-form-urlencoded'); 
    xhr.send(data); 
} 

function getdata(){ 
    if(xhr.readyState==4){ 
     if(xhr.status==200){ 
      var txt = xhr.responseText; 
      alert(txt); 
     } 
    } 
} 
+0

的可能重複[途徑來規避同源策略(http://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy) – Quentin

+0

你可以用」使用JSONP進行POST請求。 JSONP不是唯一的製作跨域請求的方法。如果您需要製作交叉源POST請求,請使用JSONP以外的技術。 – Quentin

+0

你的意思是如果我取得reqeusts,這是可能的? – happenask

回答

57

JSONP不使用XMLHttpRequest的。

用於JSONP的原因是爲了克服XHR時的跨來源的限制。

而是通過腳本檢索數據。

function jsonp(url, callback) { 
    var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random()); 
    window[callbackName] = function(data) { 
     delete window[callbackName]; 
     document.body.removeChild(script); 
     callback(data); 
    }; 

    var script = document.createElement('script'); 
    script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName; 
    document.body.appendChild(script); 
} 

jsonp('http://www.helloword.com', function(data) { 
    alert(data); 
}); 

爲了簡單起見,如果請求失敗,這不包括錯誤處理。如果您需要,請使用script.onerror

+0

@ Paul Draper:我的回調沒有受到打擊。請看我的代碼:function pingUrlUsingJSONP(url,callback,onLoad,onError)var tempCallback ='jsonp_callback_'+ Math.round(100000 * Math.random()); window [tempCallback] = function(data){ delete window [tempCallback]; document.body.removeChild(腳本);回調(數據); }; var script = document.createElement('script'); script.type ='text/html'; script.onerror = onError; script.onload = onLoad; script.async = true; script.src = url +(url.indexOf('?')> = 0?'&':'?')+'callback ='+ tempCallback; document.body.appendChild(script); } – Anantha

+0

@Paul Drapper你可以幫我在這裏,http://stackoverflow.com/questions/36302891/convert-jquery-ajax-to-pure-javascript-ajax如果沒問題,謝謝 – mmativ

-4

你無法使用能夠XMLHttpRequest.If要跨域使用了Jquery的,你必須創建一個新的腳本節點並設置它的src屬性做跨腳本。

+3

「你無法做到交叉使用XMLHttpRequest腳本「 - 不正確。 「如果你想通過Jquery跨域的話 - 」jQuery是無關緊要的,它是一個庫,它不會做任何你不能做的事情。 「你必須創建一個新的腳本節點並設置它的src屬性」 - 不是的,還有其他方法可以製作跨源請求。此外,這只是您製作JSONP請求的最後三分之一,您尚未解決定義函數或設置回調參數的問題。 – Quentin

+0

您是否知道jQuery如何實現跨域請求?如何通過XMLHttpRequest進行跨域請求?Jsonp與XMLHttpRequest沒有任何關係 – limengjun

+1

jQuery至少有三種不同的方式來完成跨源請求。使用XHR進行跨源請求的方式在我將其標記爲重複的問題中進行了描述。 – Quentin

0

我知道你已經有答案了,但如果任何人在這裏想用一個承諾的例子這裏有一個。

function jsonp(url) { 
    return new Promise(function(resolve, reject) { 
     let script = document.createElement('script') 
     const name = "_jsonp_" + Math.round(100000 * Math.random()); 
     //url formatting 
     if (url.match(/\?/)) url += "&callback="+name 
     else url += "?callback="+name 
     script.src = url; 

     window[name] = function(data) { 
      resolve(data); 
      document.body.removeChild(script); 
      delete window[name]; 
     } 
     document.body.appendChild(script); 
    }); 
} 
var data = jsonp("https://www.google.com"); 
data.then((res) => { 
    console.log(res); 
});