这个跨域请求如何工作?

时间:2010-05-04 13:25:57

标签: javascript jquery cross-domain jsonp

$.ajax(
{
    url : "http://search.twitter.com/search.json?q=google&lang=en&rpp=10&since_id=&callback=?",
    dataType : 'json',
    success : function(data)
    {
        alert(data.results.length);
    }
});

这究竟是如何工作的?我指的是跨域请求。

3 个答案:

答案 0 :(得分:6)

jQuery检测到您网址的callback=?部分,并自动将dataType从'json'切换为'jsonp'

JSONP是一个JSON查询,它不是使用XMLHttpRequest创建的,而是通过向页面添加脚本标记。调用程序处理回调到您的脚本,并在脚本加载时提供要执行的JavaScript函数的名称。这就是跨域工作的原因。

jQuery将在$ .ajax请求中透明地处理JSONP。手册(以及我更干净)的方法是定义'jsonp' dataType并使用占位符?作为URL中的回调名称。 jQuery会自动用适当的值替换?以触发成功回调。

$.ajax(
{
    url : "http://api.twitter.com/1/users/show/google.json&jsoncallback=?",
    dataType : 'jsonp',
    success : function(data)
    {
        alert(data.results.length);
    }
});

答案 1 :(得分:2)

jQuery在全局范围内定义您的回调函数,然后用callback=?替换URL中的callback=nameItGaveTheFunction

然后它作为普通的JSONP请求运行;使用脚本标记,并将响应包装在回调函数中。

答案 2 :(得分:1)

我相信jQuery意识到它是跨域的,因此使用适当的src属性(而不是触发ajax请求)向页眉添加一个脚本标记。这会加载JSON,然后触发回调。