Показать сообщение отдельно
  #1 (permalink)  
Старый 11.04.2015, 12:45
Аспирант
Отправить личное сообщение для 1lider Посмотреть профиль Найти все сообщения от 1lider
 
Регистрация: 12.04.2013
Сообщений: 86

Поправить XMLHttpRequest
Привет. Решил отказаться от 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(); // отменяем запрос
Ответить с цитированием