为什么这不起作用?任何人:
在我的代码中,我有:
$.getJSON("http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=?",
function(data){
//This never gets executed
alert('here');
});
可在此处查看文本文件:
答案 0 :(得分:2)
这不是JSONP响应:
({"name" : "hello world"});
如果您有正确的JSONP响应,那么您的代码应该可以正常工作。
“callback =?”中的问号在发出请求之前,jQuery会更改URL的一部分,您的JSONP服务器需要能够动态创建JSONP“函数”以响应唯一的jQuery请求。如果您无法动态创建JSONP,也许您可以使用YQL / Yahoo管道将其转换为JSONP?
This pipe应该诀窍,看它是否有效,在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');
});
答案 1 :(得分:0)
我不知道你是否对JSONP有足够的了解,但这不是JSONP
?({"name" : "hello world"});
它应该是这样的http://isp123.co.uk/cw/NorthWales/Test.txt?jsoncallback=foo
foo({"name" : "hello world"});
答案 2 :(得分:0)
从jQuery.getJson手册页:
,您的JSON无效重要提示:从jQuery 1.4开始,如果JSON文件包含语法错误,则请求通常会以静默方式失败。出于这个原因,避免频繁手动编辑JSON数据。 JSON是一种数据交换格式,其语法规则比JavaScript的对象文字符号更严格。例如,JSON中表示的所有字符串,无论它们是属性还是值,都必须用双引号括起来。有关JSON格式的详细信息,请参阅http://json.org/。
答案 3 :(得分:0)
Here明确提到
从jQuery 1.5开始,设置jsonp 选项为false可防止jQuery 将“?callback”字符串添加到 网址或尝试使用“=?”对于 转型。在这种情况下,你 还应该明确设置 jsonpCallback设置
并阅读jsonpCallback部分
jsonpCallback,
指定回调函数名称 一个JSONP请求。这个值将是 用来代替随机名称 由jQuery自动生成。它 最好让jQuery生成一个 独特的名称,因为它会使它更容易 管理请求并提供 回调和错误处理。你可以 想要在你指定回调时 想要启用更好的浏览器缓存 GET请求。从jQuery 1.5开始,你 也可以使用一个函数 设置,在这种情况下的值 jsonpCallback设置为return 该函数的值
答案 4 :(得分:0)
可能值得使用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()
页面上读取(在我的帖子开头链接),以了解有关它的更多信息如何使用它们。
答案 5 :(得分:0)
您的问题在于您的服务器如何输出信息。在您提供的链接中,假设?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
,尽管这是可选的。