0

我正在使用 qtip2,他们似乎使用 jQuery ajax。

在 IE8 中我没有问题。我得到了错误和完整的

在 Fx 6+ 中,我从未收到错误消息。

重现:

  1. 转到http://plungjan.name/eclatooltip/
  2. 打开 firebug Net 或其他 http 嗅探器
  3. 将鼠标悬停在第二个结果中的第二个 IPC 上 - B65D30/08

结果:

  • IE:消息:“没有找到”
  • Fx:从不返回,从不执行错误或完成

我看过这个https://gist.github.com/82181

但看不到如何在我的代码中使用它。


使用的代码 (eclatt.js)

    ajax: {
      dataType: 'jsonp',
      url: url,
      once: false,
      complete: function(jqXHR, textStatus) { // works perfectly in IE
        // alert("complete:"+jqXHR+":"+ textStatus)
      },
      error: function() { // works perfectly in IE8
        alert('Error')
        this.set('content.text', "Nothing found");
      },
      success: function(oData, sTextStatus, oJqXhr) {
        /* Construct list */

        ... 

        this.set('content.text', sHtml);
      }
    },
4

1 回答 1

1

显然问题是,JSONP 调用是通过将 <script> 标记附加到 DOM 来处理的,并且与网络相关的错误(如 404)不会触发处理程序(至少它不应该,我猜 IE 试图成为比实际更聪明)。

引用jQuery.ajax错误处理程序描述:

注意:跨域脚本和 JSONP 请求不调用此处理程序。

为了克服这个问题,有像jquery-jsonp这样的插件,只要附加的脚本标签的源已经加载,就会检查,如果没有,就会触发适当的回调。

更新

这是 qtip2 的 ajax 插件的来源https://github.com/Craga89/qTip2/blob/master/src/ajax/ajax.js。你可以很可能可以更换

// Error handler
function errorHandler(xh, status, error){ api.set('content.text', status + ': ' + error); }
// Setup $.ajax option object and process the request
$.ajax( $.extend({ success: successHandler, error: errorHandler, context: api }, opts, { url: url, complete: after }) );

有了这个:

if (opts.dataType && opts.dataType.toLowerCase() == 'jsonp') {
    // Error handler
    function jsonpErrorHandler(xOptions, status) {api.set('content.text', 'error: ' + status);}
    // Setup using jsonp
    $.jsonp( $.extend({ success: successHandler, error: jsonpErrorHandler, context: api }, opts, { url: url, complete: after }) );
} else {
    // Error handler
    function errorHandler(xh, status, error){ api.set('content.text', status + ': ' + error); }
    // Setup $.ajax option object and process the request
    $.ajax( $.extend({ success: successHandler, error: errorHandler, context: api }, opts, { url: url, complete: after }) );
}

如果您嵌入了 jquery-jsonp 插件,它应该可以工作。

于 2011-09-12T10:11:12.827 回答