Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跨域ajax请求自动使用jsonp_Javascript_Jquery - Fatal编程技术网

Javascript 跨域ajax请求自动使用jsonp

Javascript 跨域ajax请求自动使用jsonp,javascript,jquery,Javascript,Jquery,我如何告诉jQuery在跨域ajax请求中自动使用“jsonp”,而在相同的域请求中继续使用“json”?我想用javascript编写一个客户端库,它只在必要时使用jsonp。让我们以这个小片段为例: jQuery.ajax(url, { dataType: "jsonp" }); 当数据类型为“jsonp”时,jquery总是使用jsonp,但已经自动检测它是否可以发送正常的Ajax请求(对于相同的域请求)或者是否必须使用javascript注入(对于跨域请求) 因此,jQuery

我如何告诉jQuery在跨域ajax请求中自动使用“jsonp”,而在相同的域请求中继续使用“json”?我想用javascript编写一个客户端库,它只在必要时使用jsonp。让我们以这个小片段为例:

jQuery.ajax(url, {
    dataType: "jsonp"
});
当数据类型为“jsonp”时,jquery总是使用jsonp,但已经自动检测它是否可以发送正常的Ajax请求(对于相同的域请求)或者是否必须使用javascript注入(对于跨域请求)

因此,jQuery似乎已经能够自动检测到这一点,并决定使用哪种技术。但是,当标准的Ajax请求是可能的时,没有必要使用jsonp,所以我只想对跨域请求使用“jsonp”。我该怎么做


或者可以询问jQuery url是否跨域?然后我可以自己检查,并使用不同的数据类型调用jQuery.ajax。

您可以使用类似的方法,然后检查scheme/hostname是否匹配。解析url的一个简单方法是创建
元素,并让浏览器为您提供url部分

function sameOrigin(url){
    var link = document.createElement("a");
    link.href = url;

    return ((link.protocol + link.host) === window.location.protocol + window.location.host);
}


    var url = "http://stackoverflow.com/questions/6227584/jquery-automatic-usage-of-jsonp-for-cross-domain-ajax-requests";
    if (sameOrigin(url)){
     // use json
    }else{
     // use jsonp
    }

如果您打算编写代码来处理JSONP,那么它有什么区别呢?通过jQuery,它或多或少是透明的;你的回调会被这样或那样调用。比如说,我喜欢只在必要时使用“hacks”。在所有主流浏览器都支持CORS之前,JSONP是一种必要的攻击。如果您打算在JavaScript库中使用标准方法,则需要进行一次轻微的攻击。您可以检查当前url和目标url。不理想,但相当简单。