Как сделать AJAX-вызов без jQuery?


789

Как сделать AJAX-вызов с использованием JavaScript, без использования jQuery?


20
Обратите внимание, что, хотя многие ответы здесь предлагают прослушивать readystatechange , современные браузеры теперь поддерживают события загрузки , прерывания , прогресса и ошибок для XMLHttpRequest ( хотя, вероятно, вы будете заботиться только о загрузке ).
Пол С.

2
@ImadoddinIbnAlauddin, например, когда его основная функциональность (обход DOM) не нужна.
SET

8
youmightnotneedjquery.com много чистых js-примеров, в т.ч. ajax для ie8 +, ie9 + и ie10 +
Sanya_Zol

1
У w3schools есть хорошее пошаговое введение в ajax без jquery: w3schools.com/js/js_ajax_intro.asp
eli

Вы также можете использовать EHTML: github.com/Guseyn/EHTML Используйте элемент e-json для извлечения json и сопоставления его с элементом html
Гусейн Исмайлов

Ответы:


591

С «ванильным» JavaScript:

<script type="text/javascript">
function loadXMLDoc() {
    var xmlhttp = new XMLHttpRequest();

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == XMLHttpRequest.DONE) {   // XMLHttpRequest.DONE == 4
           if (xmlhttp.status == 200) {
               document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
           }
           else if (xmlhttp.status == 400) {
              alert('There was an error 400');
           }
           else {
               alert('something else other than 200 was returned');
           }
        }
    };

    xmlhttp.open("GET", "ajax_info.txt", true);
    xmlhttp.send();
}
</script>

С помощью jQuery:

$.ajax({
    url: "test.html",
    context: document.body,
    success: function(){
      $(this).addClass("done");
    }
});

1
@Fractaliste Если вы просто вызываете обратные вызовы после блоков if, относящихся к xmlhttp.status, то просто вызывайте их там, и все готово.
Джей

5
@ Wade Я думаю, что Gokigooooks говорит, что когда он читал «ванильный» JavaScript, он думал, что это библиотека JavaScript, которую ему нужно было скачать. Он также может ссылаться на Vanilla JS .
Трипед

221

Используя следующий фрагмент, вы можете довольно легко сделать похожие вещи, например:

ajax.get('/test.php', {foo: 'bar'}, function() {});

Вот фрагмент:

var ajax = {};
ajax.x = function () {
    if (typeof XMLHttpRequest !== 'undefined') {
        return new XMLHttpRequest();
    }
    var versions = [
        "MSXML2.XmlHttp.6.0",
        "MSXML2.XmlHttp.5.0",
        "MSXML2.XmlHttp.4.0",
        "MSXML2.XmlHttp.3.0",
        "MSXML2.XmlHttp.2.0",
        "Microsoft.XmlHttp"
    ];

    var xhr;
    for (var i = 0; i < versions.length; i++) {
        try {
            xhr = new ActiveXObject(versions[i]);
            break;
        } catch (e) {
        }
    }
    return xhr;
};

ajax.send = function (url, callback, method, data, async) {
    if (async === undefined) {
        async = true;
    }
    var x = ajax.x();
    x.open(method, url, async);
    x.onreadystatechange = function () {
        if (x.readyState == 4) {
            callback(x.responseText)
        }
    };
    if (method == 'POST') {
        x.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    }
    x.send(data)
};

ajax.get = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async)
};

ajax.post = function (url, data, callback, async) {
    var query = [];
    for (var key in data) {
        query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    ajax.send(url, callback, 'POST', query.join('&'), async)
};

1
Это действительно хороший старт, но я думаю, что вам не хватает того, что есть в ответе @ 3nigma. То есть я не уверен, насколько имеет смысл делать определенные запросы (все получают и некоторые сообщения), не возвращая ответ сервера. Я добавил еще одну строку в конце метода отправки return x.responseText;- и затем возвращаю каждый из ajax.sendвызовов.
Сэм

3
@ Сэм, который вы [обычно] не можете вернуть как асинхронный запрос. Вы должны обработать ответ в обратном вызове.
Петах

@ Сэм, там есть пример:ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
Петах

Хороший фрагмент. Однако не должно ли это быть query.join('&').replace(/%20/g, '+')вместо этого?
afsantos

3
Пожалуйста, включите запрос CORS также, включив эту строку в качестве опции. 'xhr.withCredentials = true;'
Акам

131

Я знаю, что это довольно старый вопрос, но теперь есть более приятный API, доступный изначально в новых браузерах . fetch()Метод позволяет сделать веб - запросов. Например, чтобы запросить JSON от /get-data:

var opts = {
  method: 'GET',      
  headers: {}
};
fetch('/get-data', opts).then(function (response) {
  return response.json();
})
.then(function (body) {
  //doSomething with body;
});

Смотрите здесь для более подробной информации.


9
На самом деле было бы неправильно утверждать, что Fetch API работает в «новых браузерах», поскольку IE и Edge не поддерживают его. (Edge 14 требует, чтобы пользователь специально включил
saluce

7
Здесь должно быть упоминание о полифилле GitHub. github.com/github/fetch
TylerY86

7
Просто добавь <script src="https://cdn.rawgit.com/github/fetch/master/fetch.js"></script>и используй fetch как чемпион.
TylerY86

7
@saluce Теперь он включен по умолчанию в Edge 14 (и IE больше не является «новым» браузером :-)
Supersharp

1
Не используйте Fetch на мобильном телефоне. В Android есть проблема с нижним регистром HTTP-заголовка. Хорошо работает на iOS.
Кенни Лим

104

Вы можете использовать следующую функцию:

function callAjax(url, callback){
    var xmlhttp;
    // compatible with IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
            callback(xmlhttp.responseText);
        }
    }
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

Вы можете попробовать похожие решения онлайн по этим ссылкам:


Также было бы неплохо добавить некоторую входную переменную для запроса (будет использоваться в xmlhttp.send (request);)
Павел Перна

2
@PavelPerna, поскольку здесь приведен пример GET, так что вы можете просто добавить их к запросу, но если быть более общим, я с вами, я действительно думал об обновлении ответа, чтобы принимать параметры запроса в качестве параметра функции здесь , & также передать метод ( GETили POST), но что остановило меня, так это то, что я хочу, чтобы ответ здесь был как можно более простым, чтобы люди попробовали его как можно быстрее. На самом деле, я ненавидел некоторые другие ответы за то, что слишком долго, потому что они пытаются быть идеальными :)
AbdelHady

40

Как насчет этой версии в простом ES6 / ES2015 ?

function get(url) {
  return new Promise((resolve, reject) => {
    const req = new XMLHttpRequest();
    req.open('GET', url);
    req.onload = () => req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
    req.onerror = (e) => reject(Error(`Network Error: ${e}`));
    req.send();
  });
}

Функция возвращает обещание . Вот пример того, как использовать функцию и обрабатывать обещание, которое она возвращает:

get('foo.txt')
.then((data) => {
  // Do stuff with data, if foo.txt was successfully loaded.
})
.catch((err) => {
  // Do stuff on error...
});

Если вам нужно загрузить файл json, вы можете использовать его JSON.parse()для преобразования загруженных данных в объект JS.

Вы также можете интегрировать req.responseType='json'в функцию, но, к сожалению, IE не поддерживает ее , поэтому я бы придерживался JSON.parse().


2
Используя XMLHttpRequestвы делаете асинхронную попытку загрузки файла. Это означает, что выполнение вашего кода будет продолжаться, пока ваш файл загружается в фоновом режиме. Чтобы использовать содержимое файла в вашем скрипте, вам нужен механизм, который сообщает вашему скрипту, когда файл завершил загрузку или произошел сбой загрузки. Вот где обещания пригодятся. Есть и другие способы решения этой проблемы, но я думаю, что обещания наиболее удобны.
Ротарети

@Rotareti Поддерживают ли мобильные браузеры этот подход?
бодрук

Только новые версии браузера поддерживают его. Обычной практикой является написание вашего кода в последней версии ES6 / 7 / .. и использование Babel или чего-то подобного, чтобы перенести его обратно в ES5 для лучшей поддержки браузера.
Ротарети

2
@Rotareti Можете ли вы также объяснить, почему это было бы более удобно, чем «простой» обратный вызов? Стоит ли это удобство для того, чтобы использовать его для поддержки старых браузеров?
lennyklb

@LennartKloppenburg Я думаю, что этот ответ хорошо объясняет это: stackoverflow.com/a/14244950/1612318 «Стоит ли это удобство дополнительных усилий, чтобы перенести его для поддержки старых браузеров?» Обещания - только одна из многих функций, которые пришли с ES6 / 7. Если вы используете транспортер, вы можете написать актуальную JS. Это стоит того!
Ротарети

38
 var xhReq = new XMLHttpRequest();
 xhReq.open("GET", "sumGet.phtml?figure1=5&figure2=10", false);
 xhReq.send(null);
 var serverResponse = xhReq.responseText;
 alert(serverResponse); // Shows "15"

58
Не делайте синхронных звонков. Используйте xhReq.onload и используйте обратные вызовы.
19

3
@FellowStranger oReq.onload = function () {/*this.responseText*/};
19

3
@kenansulayman Что не так с синхронным вызовом? Иногда это подходит лучше всего.
Андрей Немченко

@ Андрей: ничего, поскольку вы понимаете, что останавливаете выполнение всего, пока не вернется ответ от сервера. Ничего особенно плохого, но, возможно, не совсем подходит для некоторых целей.
mrówa

Кроме того, если сервер фактически никогда не отвечает по какой-либо причине, остальная часть вашего кода никогда не будет работать.
Случайный Слон

35

Используйте XMLHttpRequest .

Простой запрос GET

httpRequest = new XMLHttpRequest()
httpRequest.open('GET', 'http://www.example.org/some.file')
httpRequest.send()

Простой POST-запрос

httpRequest = new XMLHttpRequest()
httpRequest.open('POST', 'http://www.example.org/some/endpoint')
httpRequest.send('some data')

Мы можем указать, что запрос должен быть асинхронным (true), заданным по умолчанию или синхронным (false) с необязательным третьим аргументом.

// Make a synchronous GET request
httpRequest.open('GET', 'http://www.example.org/some.file', false)

Мы можем установить заголовки перед вызовом httpRequest.send()

httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Мы можем обработать ответ, установив httpRequest.onreadystatechangeфункцию перед вызовомhttpRequest.send()

httpRequest.onreadystatechange = function(){
  // Process the server response here.
  if (httpRequest.readyState === XMLHttpRequest.DONE) {
    if (httpRequest.status === 200) {
      alert(httpRequest.responseText);
    } else {
      alert('There was a problem with the request.');
    }
  }
}

1
Обратите внимание, что есть другие успешные статусы, кроме 200, например, 201
Нейт Воган,

30

Вы можете получить правильный объект в соответствии с браузером с

function getXmlDoc() {
  var xmlDoc;

  if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlDoc = new XMLHttpRequest();
  }
  else {
    // code for IE6, IE5
    xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return xmlDoc;
}

С правильным объектом GET может быть абстрагирован для:

function myGet(url, callback) {
  var xmlDoc = getXmlDoc();

  xmlDoc.open('GET', url, true);

  xmlDoc.onreadystatechange = function() {
    if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
      callback(xmlDoc);
    }
  }

  xmlDoc.send();
}

И ПОЧТА, чтобы:

function myPost(url, data, callback) {
  var xmlDoc = getXmlDoc();

  xmlDoc.open('POST', url, true);
  xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

  xmlDoc.onreadystatechange = function() {
    if (xmlDoc.readyState === 4 && xmlDoc.status === 200) {
      callback(xmlDoc);
    }
  }

  xmlDoc.send(data);
}

18

Я искал способ включить обещания в ajax и исключить jQuery. На HTML5 Rocks есть статья, в которой говорится об обещаниях ES6. (Вы можете заполнить библиотеку обещаний наподобие Q ). Вы можете использовать фрагмент кода, который я скопировал из статьи.

function get(url) {
  // Return a new promise.
  return new Promise(function(resolve, reject) {
    // Do the usual XHR stuff
    var req = new XMLHttpRequest();
    req.open('GET', url);

    req.onload = function() {
      // This is called even on 404 etc
      // so check the status
      if (req.status == 200) {
        // Resolve the promise with the response text
        resolve(req.response);
      }
      else {
        // Otherwise reject with the status text
        // which will hopefully be a meaningful error
        reject(Error(req.statusText));
      }
    };

    // Handle network errors
    req.onerror = function() {
      reject(Error("Network Error"));
    };

    // Make the request
    req.send();
  });
}

Примечание: я также написал статью об этом .


15

Небольшая комбинация из пары примеров ниже и создала эту простую часть:

function ajax(url, method, data, async)
{
    method = typeof method !== 'undefined' ? method : 'GET';
    async = typeof async !== 'undefined' ? async : false;

    if (window.XMLHttpRequest)
    {
        var xhReq = new XMLHttpRequest();
    }
    else
    {
        var xhReq = new ActiveXObject("Microsoft.XMLHTTP");
    }


    if (method == 'POST')
    {
        xhReq.open(method, url, async);
        xhReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        xhReq.send(data);
    }
    else
    {
        if(typeof data !== 'undefined' && data !== null)
        {
            url = url+'?'+data;
        }
        xhReq.open(method, url, async);
        xhReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        xhReq.send(null);
    }
    //var serverResponse = xhReq.responseText;
    //alert(serverResponse);
}

// Example usage below (using a string query):

ajax('http://www.google.com');
ajax('http://www.google.com', 'POST', 'q=test');

ИЛИ, если ваши параметры - объект (ы) - незначительная дополнительная корректировка кода:

var parameters = {
    q: 'test'
}

var query = [];
for (var key in parameters)
{
    query.push(encodeURIComponent(key) + '=' + encodeURIComponent(parameters[key]));
}

ajax('http://www.google.com', 'POST', query.join('&'));

Оба должны быть полностью совместимы с браузером и версией.


Стоит ли здесь использовать hasOwnProperty внутри цикла for?
Кибибу

15

Если вы не хотите включать JQuery, я бы попробовал несколько облегченных библиотек AJAX.

Мой любимый это reqwest. Это только 3.4kb и очень хорошо построено: https://github.com/ded/Reqwest

Вот пример запроса GET с reqwest:

reqwest({
    url: url,
    method: 'GET',
    type: 'json',
    success: onSuccess
});

Теперь, если вы хотите что-то еще более легкое, я бы попробовал microAjax всего за 0,4 КБ: https://code.google.com/p/microajax/

Это весь код прямо здесь:

function microAjax(B,A){this.bindFunction=function(E,D){return function(){return E.apply(D,[D])}};this.stateChange=function(D){if(this.request.readyState==4){this.callbackFunction(this.request.responseText)}};this.getRequest=function(){if(window.ActiveXObject){return new ActiveXObject("Microsoft.XMLHTTP")}else{if(window.XMLHttpRequest){return new XMLHttpRequest()}}return false};this.postBody=(arguments[2]||"");this.callbackFunction=A;this.url=B;this.request=this.getRequest();if(this.request){var C=this.request;C.onreadystatechange=this.bindFunction(this.stateChange,this);if(this.postBody!==""){C.open("POST",B,true);C.setRequestHeader("X-Requested-With","XMLHttpRequest");C.setRequestHeader("Content-type","application/x-www-form-urlencoded");C.setRequestHeader("Connection","close")}else{C.open("GET",B,true)}C.send(this.postBody)}};

А вот пример звонка:

microAjax(url, onSuccess);

1
Я думаю, что есть проблема с microAjax, когда вы вызываете его дважды (из-за многочисленных «это», я думаю, должно быть столкновение). Я не знаю, если назвать два «новых microAjax» хорошим решением, не так ли?
Джилл-Дженн Ви

13

Старый, но я постараюсь, возможно, кто-то найдет эту информацию полезной.

Это минимальный объем кода, необходимый для GETзапроса и получения JSONотформатированных данных. Это применимо только к современным браузерам, таким как последние версии Chrome , FF , Safari , Opera и Microsoft Edge .

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://example.com/data.json'); // by default async 
xhr.responseType = 'json'; // in which format you expect the response to be


xhr.onload = function() {
  if(this.status == 200) {// onload called even on 404 etc so check the status
   console.log(this.response); // No need for JSON.parse()
  }
};

xhr.onerror = function() {
  // error 
};


xhr.send();

Также ознакомьтесь с новым Fetch API, который является заменой на основе обещаний для API XMLHttpRequest .


9

XMLHttpRequest ()

Вы можете использовать XMLHttpRequest()конструктор для создания нового XMLHttpRequest(XHR) объекта, который позволит вам взаимодействовать с сервером, используя стандартные методы HTTP-запроса (такие как GETи POST):

const data = JSON.stringify({
  example_1: 123,
  example_2: 'Hello, world!',
});

const request = new XMLHttpRequest();

request.addEventListener('load', function () {
  if (this.readyState === 4 && this.status === 200) {
    console.log(this.responseText);
  }
});

request.open('POST', 'example.php', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(data);

выборки ()

Вы также можете использовать fetch()метод для получения, Promiseкоторое разрешает Responseобъект, представляющий ответ на ваш запрос:

const data = JSON.stringify({
  example_1: 123,
  example_2: 'Hello, world!',
});

fetch('example.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  },
  body: data,
}).then(response => {
  if (response.ok) {
    response.text().then(response => {
      console.log(response);
    });
  }
});

navigator.sendBeacon ()

С другой стороны, если вы просто пытаетесь получить POSTданные и не нуждаетесь в ответе от сервера, самое короткое решение будет использовать navigator.sendBeacon():

const data = JSON.stringify({
  example_1: 123,
  example_2: 'Hello, world!',
});

navigator.sendBeacon('example.php', data);

1
Мне очень нравятся ваши ответы, потому что вы рассматриваете большинство случаев, даже для Internet Explorer, с помощью XMLHttpRequest, но я бы рекомендовал изменить: "const data = ..." на: "var data = ..." в этом примере (XMLHttpRequest), поэтому он полностью совместим с ним
Dazag

8

От youMightNotNeedJquery.com +JSON.stringify

var request = new XMLHttpRequest();
request.open('POST', '/my/url', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(JSON.stringify(data));

7

Это может помочь:

function doAjax(url, callback) {
    var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            callback(xmlhttp.responseText);
        }
    }

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

4
<html>
  <script>
    var xmlDoc = null ;

  function load() {
    if (typeof window.ActiveXObject != 'undefined' ) {
      xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
      xmlDoc.onreadystatechange = process ;
    }
    else {
      xmlDoc = new XMLHttpRequest();
      xmlDoc.onload = process ;
    }
    xmlDoc.open( "GET", "background.html", true );
    xmlDoc.send( null );
  }

  function process() {
    if ( xmlDoc.readyState != 4 ) return ;
    document.getElementById("output").value = xmlDoc.responseText ;
  }

  function empty() {
    document.getElementById("output").value = '<empty>' ;
  }
</script>

<body>
  <textarea id="output" cols='70' rows='40'><empty></textarea>
  <br></br>
  <button onclick="load()">Load</button> &nbsp;
  <button onclick="empty()">Clear</button>
</body>
</html>

4

Ну, это всего лишь 4 шага,

Я надеюсь, что это помогает

Step 1. Сохраните ссылку на объект XMLHttpRequest

var xmlHttp = createXmlHttpRequestObject();

Step 2. Получить объект XMLHttpRequest

function createXmlHttpRequestObject() {
    // will store the reference to the XMLHttpRequest object
    var xmlHttp;
    // if running Internet Explorer
    if (window.ActiveXObject) {
        try {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
            xmlHttp = false;
        }
    }
    // if running Mozilla or other browsers
    else {
        try {
            xmlHttp = new XMLHttpRequest();
        } catch (e) {
            xmlHttp = false;
        }
    }
    // return the created object or display an error message
    if (!xmlHttp)
        alert("Error creating the XMLHttpRequest object.");
    else
        return xmlHttp;
}

Step 3. Выполните асинхронный HTTP-запрос, используя объект XMLHttpRequest

function process() {
    // proceed only if the xmlHttp object isn't busy
    if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {
        // retrieve the name typed by the user on the form
        item = encodeURIComponent(document.getElementById("input_item").value);
        // execute the your_file.php page from the server
        xmlHttp.open("GET", "your_file.php?item=" + item, true);
        // define the method to handle server responses
        xmlHttp.onreadystatechange = handleServerResponse;
        // make the server request
        xmlHttp.send(null);
    }
}

Step 4. Выполняется автоматически при получении сообщения с сервера

function handleServerResponse() {

    // move forward only if the transaction has completed
    if (xmlHttp.readyState == 4) {
        // status of 200 indicates the transaction completed successfully
        if (xmlHttp.status == 200) {
            // extract the XML retrieved from the server
            xmlResponse = xmlHttp.responseText;
            document.getElementById("put_response").innerHTML = xmlResponse;
            // restart sequence
        }
        // a HTTP status different than 200 signals an error
        else {
            alert("There was a problem accessing the server: " + xmlHttp.statusText);
        }
    }
}

3

в обычном JavaScript в браузере:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
  if (xhr.readyState == XMLHttpRequest.DONE ) {
    if(xhr.status == 200){
      console.log(xhr.responseText);
    } else if(xhr.status == 400) {
      console.log('There was an error 400');
    } else {
      console.log('something else other than 200 was returned');
    }
  }
}

xhr.open("GET", "mock_data.json", true);

xhr.send();

Или, если вы хотите использовать Browserify для объединения ваших модулей с помощью node.js. Вы можете использовать суперагент :

var request = require('superagent');
var url = '/mock_data.json';

 request
   .get(url)
   .end(function(err, res){
     if (res.ok) {
       console.log('yay got ' + JSON.stringify(res.body));
     } else {
       console.log('Oh no! error ' + res.text);
     }
 });

3

Вот JSFiffle без JQuery

http://jsfiddle.net/rimian/jurwre07/

function loadXMLDoc() {
    var xmlhttp = new XMLHttpRequest();
    var url = 'http://echo.jsontest.com/key/value/one/two';

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == XMLHttpRequest.DONE) {
            if (xmlhttp.status == 200) {
                document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
            } else if (xmlhttp.status == 400) {
                console.log('There was an error 400');
            } else {
                console.log('something else other than 200 was returned');
            }
        }
    };

    xmlhttp.open("GET", url, true);
    xmlhttp.send();
};

loadXMLDoc();

3
var load_process = false;
function ajaxCall(param, response) {

 if (load_process == true) {
     return;
 }
 else
 { 
  if (param.async == undefined) {
     param.async = true;
 }
 if (param.async == false) {
         load_process = true;
     }
 var xhr;

 xhr = new XMLHttpRequest();

 if (param.type != "GET") {
     xhr.open(param.type, param.url, true);

     if (param.processData != undefined && param.processData == false && param.contentType != undefined && param.contentType == false) {
     }
     else if (param.contentType != undefined || param.contentType == true) {
         xhr.setRequestHeader('Content-Type', param.contentType);
     }
     else {
         xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
     }


 }
 else {
     xhr.open(param.type, param.url + "?" + obj_param(param.data));
 }

 xhr.onprogress = function (loadTime) {
     if (param.progress != undefined) {
         param.progress({ loaded: loadTime.loaded }, "success");
     }
 }
 xhr.ontimeout = function () {
     this.abort();
     param.success("timeout", "timeout");
     load_process = false;
 };

 xhr.onerror = function () {
     param.error(xhr.responseText, "error");
     load_process = false;
 };

 xhr.onload = function () {
    if (xhr.status === 200) {
         if (param.dataType != undefined && param.dataType == "json") {

             param.success(JSON.parse(xhr.responseText), "success");
         }
         else {
             param.success(JSON.stringify(xhr.responseText), "success");
         }
     }
     else if (xhr.status !== 200) {
         param.error(xhr.responseText, "error");

     }
     load_process = false;
 };
 if (param.data != null || param.data != undefined) {
     if (param.processData != undefined && param.processData == false && param.contentType != undefined && param.contentType == false) {
             xhr.send(param.data);

     }
     else {
             xhr.send(obj_param(param.data));

     }
 }
 else {
         xhr.send();

 }
 if (param.timeout != undefined) {
     xhr.timeout = param.timeout;
 }
 else
{
 xhr.timeout = 20000;
}
 this.abort = function (response) {

     if (XMLHttpRequest != null) {
         xhr.abort();
         load_process = false;
         if (response != undefined) {
             response({ status: "success" });
         }
     }

 }
 }
 }

function obj_param(obj) {
var parts = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
    }
}
return parts.join('&');
}

мой вызов ajax

  var my_ajax_call=ajaxCall({
    url: url,
    type: method,
    data: {data:value},
    dataType: 'json',
    async:false,//synchronous request. Default value is true 
    timeout:10000,//default timeout 20000
    progress:function(loadTime,status)
    {
    console.log(loadTime);
     },
    success: function (result, status) {
      console.log(result);
    },
      error :function(result,status)
    {
    console.log(result);
     }
      });

для отмены предыдущих запросов

      my_ajax_call.abort(function(result){
       console.log(result);
       });

2

HTML:

<!DOCTYPE html>
    <html>
    <head>
    <script>
    function loadXMLDoc()
    {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
        }
      }
    xmlhttp.open("GET","1.php?id=99freebies.blogspot.com",true);
    xmlhttp.send();
    }
    </script>
    </head>
    <body>

    <div id="myDiv"><h2>Let AJAX change this text</h2></div>
    <button type="button" onclick="loadXMLDoc()">Change Content</button>

    </body>
    </html>

PHP:

<?php

$id = $_GET[id];
print "$id";

?>

Однострочные, если не нужны фигурные скобки, Никто не использует IE6, Вероятно, это было вставлено при копировании, используйте onload вместо onreadystatechange, перехватывайте ошибки для возможных рекурсивных вызовов, xmlhttp - ужасное имя переменной, просто назовите его x.
супер

1

Очень хорошее решение с чистым JavaScript здесь

/*create an XMLHttpRequest object*/

let GethttpRequest=function(){  
  let httpRequest=false;
  if(window.XMLHttpRequest){
    httpRequest   =new XMLHttpRequest();
    if(httpRequest.overrideMimeType){
    httpRequest.overrideMimeType('text/xml');
    }
  }else if(window.ActiveXObject){
    try{httpRequest   =new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
      try{
        httpRequest   =new ActiveXObject("Microsoft.XMLHTTP");
      }catch(e){}
    }
  }
  if(!httpRequest){return 0;}
  return httpRequest;
}

  /*Defining a function to make the request every time when it is needed*/

  function MakeRequest(){

    let uriPost       ="myURL";
    let xhrPost       =GethttpRequest();
    let fdPost        =new FormData();
    let date          =new Date();

    /*data to be sent on server*/
    let data          = { 
                        "name"      :"name",
                        "lName"     :"lName",
                        "phone"     :"phone",
                        "key"       :"key",
                        "password"  :"date"
                      };

    let JSONdata =JSON.stringify(data);             
    fdPost.append("data",JSONdata);
    xhrPost.open("POST" ,uriPost, true);
    xhrPost.timeout = 9000;/*the time you need to quit the request if it is not completed*/
    xhrPost.onloadstart = function (){
      /*do something*/
    };
    xhrPost.onload      = function (){
      /*do something*/
    };
    xhrPost.onloadend   = function (){
      /*do something*/
    }
    xhrPost.onprogress  =function(){
      /*do something*/
    }

    xhrPost.onreadystatechange =function(){

      if(xhrPost.readyState < 4){

      }else if(xhrPost.readyState === 4){

        if(xhrPost.status === 200){

          /*request succesfull*/

        }else if(xhrPost.status !==200){

          /*request failled*/

        }

      }


   }
  xhrPost.ontimeout = function (e){
    /*you can stop the request*/
  }
  xhrPost.onerror = function (){
    /*you can try again the request*/
  };
  xhrPost.onabort = function (){
    /*you can try again the request*/
  };
  xhrPost.overrideMimeType("text/plain; charset=x-user-defined-binary");
  xhrPost.setRequestHeader("Content-disposition", "form-data");
  xhrPost.setRequestHeader("X-Requested-With","xmlhttprequest");
  xhrPost.send(fdPost);
}

/*PHP side
<?php
  //check if the variable $_POST["data"] exists isset() && !empty()
  $data        =$_POST["data"];
  $decodedData =json_decode($_POST["data"]);
  //show a single item from the form
  echo $decodedData->name;

?>
*/

/*Usage*/
MakeRequest();

0

Попробуйте использовать Fetch Api ( Fetch API )

fetch('http://example.com/movies.json').then(response => response.json()).then(data => console.log(data));

Это действительно ясно, и 100% ваниль.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.