Jquery成功函数不使用JSONP触发

San*_*tam 28 javascript jquery jsonp

正在做一些使用jQuery调用我在不同域上的服务.成功调用服务(我的调试点被触发),并返回正确的响应(我嗅探流量).

我的问题主要是成功和失败的回调不会被解雇.我已经在SO上阅读了一些其他帖子,表明在使用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....');
  }
}); 
Run Code Online (Sandbox Code Playgroud)

San*_*tam 19

好的.如果将来有人需要知道......事后看来,解决方案可能应该比以前更加明显,但您需要将Web响应直接写入响应.简单地返回一串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}] )");
}
Run Code Online (Sandbox Code Playgroud)

只是为了明确,这是客户端代码.

function localDemo(){
  $.getJSON("http://someOtherDomain.com/Service1.svc/DoWork?callback=?",
    function(data){
      $.each(data, function(i,item){            
        alert(item.x);
      });
  });
}
Run Code Online (Sandbox Code Playgroud)

如果有更好的方法,我会全力以赴.对于其他所有人,我知道在WCF 4.0中对JSONP有一些原生支持的概念.此外,您可能需要为安全目的进行一些检查 - 尽管我没有进行太多调查.


Guf*_*ffa 14

success当服务器响应回调方法被调用.该$.ajax方法设置一个函数,通过调用success回调方法来处理响应.

success不调用该方法的最可能原因是来自服务器的响应不正确.该$.ajax方法在callback查询字符串中发送一个值,服务器应将该值用作JSONP响应中的函数名.如果服务器使用其他名称,$.ajax则永远不会调用该方法设置的功能.

如果服务器无法使用callback查询字符串中的值来设置响应中的函数名称,则可以指定$.ajax方法应从服务器获取的函数名称.将该属性添加jsonpCallback到选项对象,并将值设置为服务器在响应中使用的函数的名称.

例如,如果$.ajax方法是使用URL http://service.mydomain.com/getdata?callback=jsonp12345向服务器发送请求,则服务器应该响应以下内容:

jsonp12345({...});
Run Code Online (Sandbox Code Playgroud)

如果服务器忽略callback查询字符串,而是响应类似于:

mycallback({...});
Run Code Online (Sandbox Code Playgroud)

然后,您必须通过向options对象添加属性来覆盖函数名称:

$.ajax({
  url: urlOnDiffDomain,
  dataType: 'jsonp',
  data: {},
  success: function(data, textStatus) {
    alert('success...');
  },
  jsonpCallback: 'mycallback'
});
Run Code Online (Sandbox Code Playgroud)