为什么这不起作用?任何人:
在我的代码中,我有:
$.getJSON("http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=?",
function(data){
//This never gets executed
alert('here');
});
文本文件可以在这里查看:
http://isp123.co.uk/cw/NorthWales/Test.txt
这不是JSONP响应:
({"name" : "hello world"});
如果您有一个正确的JSONP响应,那么您的代码应该可以工作。
在发出请求之前,jQuery更改了URL"callback=?"部分的问号,您的JSONP服务器需要能够动态创建JSONP"函数"以响应唯一的jQuery请求。如果不能动态创建JSONP,也许可以使用YQL/Yahoo管道将其转换为JSONP?
这个管道应该完成任务,看看它是否有效,在getJSON函数中使用这个URL:http://pipes.yahoo.com/pipes/pipe.run?u=http%3A%2F%2Fisp123.co.uk%2Fcw%2FNorthWales%2FTest.txt&_id=332d9216d8910ba39e6c2577fd321a6a&_render=json&_callback=?
我刚试过这个,它奏效了:
$.getJSON("http://pipes.yahoo.com/pipes/pipe.run?u=http%3A%2F%2Fisp123.co.uk%2Fcw%2FNorthWales%2FTest.txt&_id=332d9216d8910ba39e6c2577fd321a6a&_render=json&_callback=?", function(data){
//This always gets executed!!!
alert('here');
});
我不知道你是否对JSONP足够了解,但这不是JSONP
?({"name" : "hello world"});
真的应该是这样的http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=foo
foo({"name" : "hello world"});
从jQuery.getJson手册页面:
重要提示:从jQuery 1.4开始,如果JSON文件包含语法错误,请求通常会以静默方式失败。因此,避免频繁手动编辑JSON数据。JSON是一种数据交换格式,其语法规则比JavaScript的对象文字表示法更严格。例如,JSON中表示的所有字符串,无论是属性还是值,都必须用双引号括起来。有关JSON格式的详细信息,请参阅http://json.org/.
根据,您的JSON无效http://jsonlint.com/
这里明确提到
从jQuery 1.5开始,设置jsonp选项为false可防止jQuery将"?callback"字符串添加到URL或尝试使用"=?"转型在这种情况下还应显式设置jsonCallback设置
并读取jsonCallback部分
jsonCallback,
指定的回调函数名称JSONP请求。此值将为使用而不是随机名称由jQuery自动生成。它最好让jQuery生成唯一的名称,因为它将使管理请求并提供回调和错误处理。你可以希望在希望启用更好的浏览器缓存的GET请求。从jQuery 1.5开始,您也可以为此使用函数设置,在这种情况下jsonpCallback设置为返回函数的值
可能值得使用jQuery.ajax()
-http://api.jquery.com/jQuery.ajax/
您可以将dataType
作为"jsonp"
传入,然后jQuery负责所有回调业务,但更重要的是,您可以指定一个函数在出现错误时运行,这可能会对您有所帮助:
$.ajax({
dataType: "jsonp",
success: function(d) {console.log(d);},
error: function() { console.log("error") } //do your debugging in here
//add other parameters such as URL, etc
});
您定义的error
函数可以传递3个变量,请在jQuery文档的ajax()
页面上阅读(链接在我文章的开头(,以了解更多信息以及如何使用它们。
您的问题在于服务器如何输出信息。在您提供的链接中,假设放置在?jsonpcallback
中的任何名称都会导致将JSONP代码封装在具有相同名称的函数中。然而,事实并非如此。
因此,下一个选项是:在服务器文件中使用静态函数名并包装代码。(例如,使用foo(<jsonp>)
并坚持使用它(然后,您必须明确地告诉jQuery,我们将使用一个特定的函数名称(让jQuery假设它提供(并因此接收(该名称,而实际上您只是在服务器端提供并填充空白(。
一旦你设置好了文件,就可以使用以下方法:
$.ajax({
// setup the request
url: 'http://isp123.co.uk/cw/NorthWales/Test.txt',
crossDomain: true,
dataType: 'jsonp',
jsonp: false,
jsonpCallback: 'foo', // "supply" the jsonp function (pseudo-defined)
// function to call when completed
complete: function(data){
alert(data);
}
// just in case, catch the error
error: function(j,t,e){
alert('AJAX Error');
}
});
因此,现在当jQuery进行调用,并且它认为它提供了回调时,它实际上只是得到了服务器定义的回调作为回报。因此,为了使以上内容发挥作用,您的文本文件应该如下所示:
foo({name:"Hello, World!"});
此外,如果可以的话,将标题更改为application/javascript
,尽管这是可选的。