Jquery成功函数不使用JSONP触发

时间:2010-03-04 15:43:27

标签: javascript jquery jsonp

正在做一些使用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....');
  }
}); 

5 个答案:

答案 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);
                  }
            });