Самый легкий способ получить перекрестный браузер XmlHttpRequest

Каков самый легкий и самый безопасный способ получить объект XmlHttpRequest что работы через все браузеры? Без любых дополнительных библиотек. Существует ли фрагмент кода, который Вы часто используете?

P.S. Я знаю, что существуют тонны примеров в сети, но это - точно причина, которую я спрашиваю: существует слишком много различных примеров, и я просто хочу, чтобы что-то простое и доказанное работало.

jQuery и другие библиотеки НЕ являются опцией. Почему jQuery пропускает память так плохо?

41
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Хотя я бы порекомендовал использовать полную библиотеку, чтобы упростить использование, создание запросов AJAX может быть довольно простым в современных браузерах:

var req = new XMLHttpRequest();
req.onreadystatechange = function(){
    if(this.readyState == 4){
        alert('Status code: ' + this.status);
        // The response content is in this.responseText
    }
}
req.open('GET', '/some-url', true);
req.send();

Следующий фрагмент представляет собой более сложный фрагмент, основанный на фрагменте из quirksmode.org и даже поддерживает очень старые браузеры (старше Internet Explorer 7):

function sendRequest(url,callback,postData) {
    var req = createXMLHTTPObject();
    if (!req) return;
    var method = (postData) ? "POST" : "GET";
    req.open(method,url,true);
    // Setting the user agent is not allowed in most modern browsers It was
    // a requirement for some Internet Explorer versions a long time ago.
    // There is no need for this header if you use Internet Explorer 7 or
    // above (or any other browser)
    // req.setRequestHeader('User-Agent','XMLHTTP/1.0');
    if (postData)
        req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    req.onreadystatechange = function () {
        if (req.readyState != 4) return;
        if (req.status != 200 && req.status != 304) {
//          alert('HTTP error ' + req.status);
            return;
        }
        callback(req);
    }
    if (req.readyState == 4) return;
    req.send(postData);
}

var XMLHttpFactories = [
    function () {return new XMLHttpRequest()},
    function () {return new ActiveXObject("Msxml3.XMLHTTP")},
    function () {return new ActiveXObject("Msxml2.XMLHTTP.6.0")},
    function () {return new ActiveXObject("Msxml2.XMLHTTP.3.0")},
    function () {return new ActiveXObject("Msxml2.XMLHTTP")},
    function () {return new ActiveXObject("Microsoft.XMLHTTP")}
];

function createXMLHTTPObject() {
    var xmlhttp = false;
    for (var i=0;i<XMLHttpFactories.length;i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
        }
        catch (e) {
            continue;
        }
        break;
    }
    return xmlhttp;
}
65
ответ дан 27 November 2019 в 00:31
поделиться

не уверен на 100% в вашем вопросе - но если вы просите функцию для возврата кроссбраузерного экземпляра XMLHTTP - мы использовали это в нашей родной библиотеке ajax в течение многих лет - и никогда не было проблем в любом браузере

function getXMLHTTP() {
    var alerted;
    var xmlhttp;
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
    // JScript gives us Conditional compilation, we can cope with old IE versions.
    try {
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
    } catch (e) {
    try {
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
    } catch (E) {
        alert("You must have Microsofts XML parsers available")
    }
    }
    @else
        alert("You must have JScript version 5 or above.")
        xmlhttp=false
        alerted=true
    @end @*/
    if (!xmlhttp && !alerted) {
        // Non ECMAScript Ed. 3 will error here (IE<5 ok), nothing I can
        // realistically do about it, blame the w3c or ECMA for not
        // having a working versioning capability in  <SCRIPT> or
        // ECMAScript.
        try {
            xmlhttp = new XMLHttpRequest();
        } catch (e) {
            alert("You need a browser which supports an XMLHttpRequest Object")
      }
    }
    return xmlhttp
}
4
ответ дан 27 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: