Привет. Решил отказаться от jquery.ajax() и начеркать что-нибудь своё. Вот что получилось:
var _Request = function(options) {
options = {
type: options.type.toUpperCase() || 'POST',
url: options.url || '',
dataType: options.dataType.toUpperCase() || 'HTML',
param: options.param || '',
success: options.success || function(){},
error: options.error || function(){}
}
var xhr;
var rand = Math.floor(Math.random( )*(9999999+1));
if(window.XMLHttpRequest) {
try { xhr = new XMLHttpRequest(); }
catch (e){}
} else if (window.ActiveXObject) {
try { xhr = new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
catch(e) {}
try { xhr = new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
catch(e) {}
try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {}
try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e) {}
}
if(options.type == "GET") {
xhr.open(options.type, options.url+'?'+options.param+'&rnd='+rand, true);
} else if(options.type == "POST") {
xhr.open(options.type, options.url, true);
} else { return; }
if(options.dataType == 'HTML') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
} else if(options.dataType == 'JSON') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
} else { return; }
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
if(options.dataType == 'HTML') {
return options.success(xhr.responseText);
} else if(options.dataType == 'JSON') {
var data = JSON.parse(xhr.responseText);
if(data != '' && data.length > 0) {
return options.success(data);
} else {
return options.error('error');
}
}
} else {
return options.error('error');
}
} else {
return options.error('error');
}
}
if(options.type == "GET") {
xhr.send(null);
} else if(options.type == "POST") {
xhr.send(options.param+'&rnd='+rand);
} else { return; }
}
ИСПОЛЬЗОВАНИЕ:
_Request({
type: 'GET',
dataType: 'JSON',
url: '/script.php',
param: 'user=stashappy',
success: function(data) {
alert(data.result);
}, error: function(data) {
alert('ERROR');
}
});
В принципе всё работает отлично, за исключением одного момента. Не хватает более правильной обработки ошибок, в случаях, когда php-файл-обработчик отсутствует на сервере или когда обработчик возвращает пустой результат. Запрос к следующему файлу, вызовет синтаксическую ошибку в JS коде:
script.php
<?php
exit;
?>
Прошу вашей помощи по решению данной задачи. Также хотелось бы узнать, могу ли я использовать в данном варианте событие abort(), для отмены запроса. Если нет, то как можно доработать данный JS код? Пример:
// примерно таким образом
var query = _Request({
// бла бла бла
});
query.abort(); // отменяем запрос