Может ли jQuery ajax быть установленным для передачи на 404 в Fx? - PullRequest
0 голосов
/ 12 сентября 2011

Я использую qtip2, и они, кажется, используют jQuery ajax.

В IE8 у меня нет проблем.Я получаю ошибку и полное

В Fx 6+ я никогда не получаю ошибку.

Для воспроизведения:

  1. перейдите к http://plungjan.name/eclatooltip/
  2. включить Firebug Net или другой http sniffer
  3. Наведите указатель мыши на 2-й IPC во втором результате - B65D30 / 08

Результат:

  • IE: message: "Ничего не найдено"
  • 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);
      }
    },

1 Ответ

1 голос
/ 12 сентября 2011

Очевидно, проблема в том, что вызовы JSONP обрабатываются путем добавления тега в DOM, а ошибки, связанные с сетью (например, 404), не вызывают обработчики (по крайней мере, не должны, я думаю, IEпытаюсь быть умнее, чем есть на самом деле).

Цитата из описания обработчика ошибок jQuery.ajax :

Примечание: этот обработчик не вызывается для кросс-domain скрипт и запросы JSONP.

Для решения этой проблемы существуют плагины, подобные этому jquery-jsonp , которые проверяют всякий раз, когда источник тега добавленного скрипта имеетзагружены и запускают соответствующие обратные вызовы, если нет.

Обновление

Вот источник для плагина ajax для qtip2 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.

...