JSONP回调函数

时间:2013-04-19 05:26:11

标签: javascript ajax jsonp

我正在研究JSONP回调函数的概念。我阅读了一些有关这方面的文章,并希望能够很好地掌握JSONP的概念。

因此,我将一个json文件上传到服务器 - json file

这是我编写的用于检索数据的js代码。电话是从localhost到abhishekprakash.com。

var xhr;
var dataList;
xhr = new XMLHttpRequest();

xhr.open('GET', 'http://abhishekprakash.com/script/example.json?callback=func_callbk',  true);
xhr.send();

func_callback = function(data){
    alert(data.data.people[0].id);
}

xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
            console.log(dataList);
    }
};

这是我在控制台中得到的回应:

snap shot of console

调用回调函数但它不包含Json数据。 我错过了什么?

感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:15)

该示例服务返回JSON,而不是JSONP。

JSONP的重点是,由于Same Origin Policy安全限制,域A的Javascript无法向域B上的资源发出GET请求;换句话说,脚本无法跨域检索数据。

JSONP通过使域B在跨域数据共享中明确合作来解决这个问题。域A中的脚本指定回调函数的名称,并将域B的URL嵌入文档中,就像它包含常规外部Javascript文件一样。域B然后输出如下数据:

callbackFuncName({ data : foo, ... });

这意味着域B显式输出 Javascript片段,它使用数据调用指定的回调函数。

因此,除非域B明确地与此合作,否则您不能简单地从中获取JSONP响应。

答案 1 :(得分:7)

XHR受跨域规则的约束;要使用JSONP,您需要添加一个脚本元素:

function func_callbk()
{
    console.log(arguments);
}

var s = document.createElement('script');
s.type = 'text/javascript';
s.src = 'http://abhishekprakash.com/script/example.json?callback=func_callbk';
var h = document.getElementsByTagName('script')[0];
h.parentNode.insertBefore(s, h);

正如Ian在评论中指出的那样,服务器的正确响应应该是这样的:

func_callbk('hello world')

<强>更新

如果您希望在没有JSONP的情况下完成此工作(例如,如果响应应始终为JSON),则需要按照this answer中的说明查看CORS。