正在做一些使用jQuery调用我在不同域上的服务。成功调用服务(我的调试点被触发),并返回正确的响应(我嗅探流量)。
我的问题主要是成功和失败的回调不会被解雇。我在SO上读了一些other posts,表明在使用JSONP时没有触发错误事件。这是成功事件的情况(也许是因为我假设我提供自己的回调函数),或者有没有办法解雇我的成功回调。提前谢谢。
$.ajax({
type: "GET",
url: urlOnDiffDomain,
async: false,
cache: false,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
error: function(xhr, ajaxOptions, thrownError) {
alert('failed....');
}
});
答案 0 :(得分:19)
好的。如果将来有人需要知道......事后看来,解决方案可能应该比以前更加明显,但您需要将Web响应直接写入响应 stream 。简单地返回一串JSON不会这样做,你需要有人构造它并将其流回。如果您确实这样做,我原始帖子中的代码将正常工作。
服务代码示例:
public void DoWork()
{
//it will work without this, but just to be safe
HttpContext.Current.Response.ContentType = "application/json";
string qs = HttpContext.Current.Request.QueryString["callback"];
HttpContext.Current.Response.Write(qs + "( [{ \"x\": 10, \"y\": 15}] )");
}
只是为了明确,这是客户端代码。
function localDemo(){
$.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
function(data){
$.each(data, function(i,item){
alert(item.x);
});
});
}
如果有更好的方法,我会全力以赴。对于其他所有人,我知道在WCF 4.0中对JSONP有一些原生支持的概念。此外,出于安全考虑,您可能需要做一点checking - 尽管我没有进行太多调查。
答案 1 :(得分:13)
服务器响应时调用success
回调方法。 $.ajax
方法通过调用success
回调方法设置一个处理响应的函数。
未调用success
方法的最可能原因是来自服务器的响应不正确。 $.ajax
方法在callback
查询字符串中发送一个值,服务器应将其用作JSONP响应中的函数名。如果服务器使用不同的名称,则永远不会调用$.ajax
方法设置的函数。
如果服务器无法使用callback
查询字符串中的值来设置响应中的函数名称,则可以指定$.ajax
方法应从服务器获取的函数名称。将属性jsonpCallback
添加到选项对象,并将值设置为服务器在响应中使用的函数的名称。
例如,如果$.ajax
方法正在使用URL http://service.mydomain.com/getdata?callback=jsonp12345
向服务器发送请求,则服务器应该响应如下内容:
jsonp12345({...});
如果服务器忽略callback
查询字符串,而是使用以下内容进行响应:
mycallback({...});
然后,您必须通过向options对象添加属性来覆盖函数名称:
$.ajax({
url: urlOnDiffDomain,
dataType: 'jsonp',
data: {},
success: function(data, textStatus) {
alert('success...');
},
jsonpCallback: 'mycallback'
});
答案 2 :(得分:0)
尝试
$.getJSON(urlOnDiffDomain, function(data, textStatus){
alert('success...');
});
通常适合我。你需要添加& callback =?到urlOnDiffDomain,jQuery自动替换JSONP中使用的回调。
不会触发错误回调,但您可以使用全局$ .ajaxError,就像这样
$('.somenode').ajaxError(function(e, xhr, settings, exception) {
alert('failed');
});
答案 3 :(得分:0)
这不是你问题的完整答案,但我认为路过的人想知道这个:
当您处理JSONP from WCF REST时尝试使用:
[JavascriptCallbackBehavior(UrlParameterName = "$callback")]
为您的服务实施;这应该可以为您提供开箱即用的JSONP。
答案 4 :(得分:0)
$.ajax({
url:' <?php echo URL::site('ajax/editing?action=artistSeracher') ?>',
dataType: "json",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
artist: request.term
},
success: function( data ) {
response( $.map( data, function( item ) {
return {
label: item.artist,
value: item.artist,
id: item.id
}
}));
},
error: function (xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});