Jquery成功函数不使用JSONP触发
正在做一些使用jQuery调用我在不同域上的服务。 成功调用服务(我的调试点被触发),并返回正确的响应(我嗅探流量)。
我的问题主要是成功和失败的回调不会被解雇。 我已经在SO上阅读了一些其他post ,表明在使用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....'); } });
好的。 如果将来有人需要知道……事后看来,解决方案可能应该比以前更加明显,但您需要将Web响应直接写入响应流 。 简单地返回一串JSON不会这样做,你需要有人构造它并将其流回。 如果您确实这样做,我原始post中的代码将正常工作。
服务代码示例:
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有一些本机支持的概念。 此外,您可能需要为安全目的进行一些检查 – 尽管我没有进行过多次调查。
服务器响应时调用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' });
尝试
$.getJSON(urlOnDiffDomain, function(data, textStatus){ alert('success...'); });
通常对我有用。 你需要添加&callback =? 到urlOnDiffDomain,jQuery自动替换JSONP中使用的回调。
不会触发错误回调,但您可以使用全局$ .ajaxError,就像这样
$('.somenode').ajaxError(function(e, xhr, settings, exception) { alert('failed'); });
这不是你问题的完整答案,但我认为经过的人想知道这个:
当您从WCF REST处理JSONP时尝试使用:
[JavascriptCallbackBehavior(UrlParameterName = "$callback")]
为您的服务实施; 这应该给你JSONP开箱即用。
$.ajax({ url:' ', 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); } });