Я недавно использовал множество методов Ajax в одном из моих проектов, так как при каждом вызове $ .ajax вам приходится писать много одинаковых кодов, например:
{
type:'POST', // Default value is 'GET'
beforeSend: function(xhr){
// Usually do some Page Loading Animation stuff here
},
error:function(){
// Handling the Exceptions here
}
}
Итак, я инкапсулировал вызов Ajax в класс, называемый JAjax, например:
(function ($) {
// More details, see: http://api.jquery.com/jquery.ajax/
var defaults = {
data: {},
url: '',
type: 'POST',
dataType: 'JSON',
isOverlay: true,
async: true,
cache: true,
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
processData: true,
overlayTarget: $(document.body),
dealyClean: 500,
f_before: function () {},
f_done: function () { },
f_always: function () { },
f_fail: function (xhr) {
if (xhr.status !== 200) {
// Handling the Exceptions
}
}
};
function JAjax(_options) {
this.options = $.extend({}, defaults, _options);
this.execute();
}
function createOverLayer(options) {
// Create a page loading animation layer
}
JAjax.prototype = {
execute: function () {
var parent = this;
var response = $.ajax({
data: parent.options.data,
url: parent.options.url,
type: parent.options.type,
dataType: parent.options.dataType,
contentType: parent.options.contentType,
async: parent.options.async,
cache: parent.options.cache,
processData: parent.options.processData,
beforeSend: function (xhr) {
parent.options.f_before();
if (parent.options.isOverlay) {
createOverLayer(parent.options);
}
}
});
response.done(parent.options.f_done);
response.always(parent.options.f_always);
response.fail(parent.options.f_fail);
}
};
jQuery.extend({
jajax: function (_options) {
_options = _options || {};
if (typeof _options === 'object') {
return new JAjax(_options);
}
}
});
})(jQuery);
Для большинства запросов Ajax (GET, POST) он работает нормально. Но когда я использую его для загрузки некоторых файлов, файл успешно загружается на сервер и возвращает мне имя файла (строку) в качестве результата выполнения. Но почему-то она не запускает функцию f_done, ниже показано, как я использую ее для загрузки файлов:
var url = '/ajax_common_file_upload';
var file_data = new FormData();
for (var i = 0; i < _files.length; i++) {
var file = _files[i];
file_data.append('input_files[]', file);
}
$.jajax({
url: url,
data: file_data,
cache: false,
contentType: false,
processData: false,
f_done: function (result) {
// Never to be executed :-(
alert('show me something, please!');
}
});
Я потратил несколько дней, чтобы попытаться выяснить, почему это не «ПОКАЖИТЕ ЧТО-ТО», а все провалилось, и я буду очень признателен за то, что кто-то может мне помочь и объяснить, почему метод f_done () не может быть запущен, когда я использую это для загрузки файлов.
Обновление:
Я сделал несколько скриншотов для JAjax и оригинального $ .ajax по заголовкам запросов и объединил их, как показано ниже:
Я использовал одни и те же параметры, чтобы сделать запрос для JAjax и $ .ajax, но я не знаю, почему у них другое значение Accept!
КАЖДЫЙ