Вызов Ajax сделан функцией jQuery .load - PullRequest
1 голос
/ 28 сентября 2010

Проблема в том, как браузеры реализуют простые вызовы.Проблема возникает при использовании расширения colorbox (вариант facebox).Содержимое загружается в colorbox с помощью функции jquery load ().

Когда вызов выполняется Chrome, заголовок Accept устанавливается на:

Accept: text/html, */*, text/javascript

В случае FireFox заголовок выглядит следующим образом:

Accept: text/javascript

Я попытался форсировать заголовок Accept, установив его с помощью:

jQuery.ajaxSetup({  
  'beforeSend': function (xhr) {xhr.setRequestHeader("Accept", "text/javascript")}  
}); 

Он хорошо работает при использовании вызовов $ .ajax, но, похоже, не влияет.функция загрузки.Есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 28 сентября 2010

Несмотря на то, что, очевидно, лучше избегать этой проблемы с помощью прямого вызова $.ajax, вы можете создать прокси-метод для метода $.ajax. Это помогает, поскольку $.load в свою очередь вызывает $.ajax с набором параметров по умолчанию. Поэтому мы можем перехватить $.load s вызов $.ajax.

var org = $.ajax;
$.ajax = function(settings){
    settings['accepts'] = null;
    settings['beforeSend'] = function(xhr) {
        xhr.setRequestHeader("Accept", "text/javascript");
    }
    org(settings);
}

 $("#foo").load("http://fiddle.jshell.net/FpCBJ/show/light/");

Попробуйте

Очевидно, что это повлияет на ВСЕ вызовы $.ajax, поэтому вы можете добавить еще один параметр в метод прокси, который можно установить и проверить в прокси, чтобы избежать установки requestheader при непосредственном вызове. Или в настройках даже.

Полагаю, вы также можете добавлять / удалять прокси-сервер для каждого вызова, но это увеличивает накладные расходы и может привести к условиям гонки (?) (Не думаю, что если вы удалите прокси сразу после запроса, не ждите для обратного вызова), поэтому вам понадобится какой-нибудь замок.

EDIT: добавлено settings['accepts'] = null;, чтобы $.ajax не добавлял заголовки до обратного вызова, поскольку setRequestHeader() только добавляет, но не заменяет. Мальчик это грязно.

РЕДАКТИРОВАТЬ 2: На самом деле, возможно, более понятным вариантом было бы настроить свои собственные приемы и сослаться на них, чтобы позволить $.ajax выполнять свою работу по отображению типов данных и самостоятельно настраивать XHR:

var org = $.ajax;
$.ajax = function(settings){
    settings['accepts'] = {"myDataType" : "text/javascript"};
    settings['dataType'] = "myDataType";
    org(settings);
}

 $("#foo").load("http://fiddle.jshell.net/FpCBJ/show/light/");
...