jQuery없이 AJAX를 호출하는 방법은 무엇입니까?


789

jQuery를 사용하지 않고 JavaScript를 사용하여 AJAX 호출을 수행하는 방법은 무엇입니까?


20
여기에 많은 답변이 readystatechange 수신 대기를 제안 하지만 현대 브라우저는 이제 XMLHttpRequest에 대한 load , abort , progresserror 이벤트를 지원합니다 (아마도 로드 만 신경 쓰면됩니다 ).
Paul S.

2
예를 들어 주요 기능 (DOM 통과)이 필요하지 않은 경우의 @ImadoddinIbnAlauddin.
SET

8
youmightnotneedjquery.com 많은 순수 js 예제가 포함되어 있습니다. IE8 +, IE9 + 및 IE10 +에 대한 아약스
Sanya_Zol

1
w3schools는 jquery없이 ajax를 단계별로 소개합니다 : w3schools.com/js/js_ajax_intro.asp
eli

EHTML을 사용할 수도 있습니다 : github.com/Guseyn/EHTML json을 가져 와서 html 요소에 매핑하기 위해 e-json 요소 사용
Guseyn Ismayylov

답변:


591

"vanilla"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 xmlhttp.status와 관련된 if 블록 다음에 콜백을 간단히 호출하면 콜백을 호출하면됩니다.
Jay

5
@Wade Gokigooooks가 "vanilla"JavaScript 를 읽을 때 그가 다운로드해야하는 JavaScript 라이브러리라고 생각한다고 생각합니다. 그는 또한 바닐라 JS를 참조 할 수도 있습니다 .
22:05에

220

다음 스 니펫을 사용하면 다음과 같이 비슷한 작업을 매우 쉽게 수행 할 수 있습니다.

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의 답변에 특징이있는 것이 빠져 있다고 생각합니다. 즉, 서버 응답을 반환하지 않고 특정 요청 (모두 가져 오기 및 게시)을 수행하는 것이 얼마나 의미가 있는지 잘 모르겠습니다. send 메소드 끝에 다른 줄을 추가 return x.responseText;한 다음 각 ajax.send호출 을 반환 합니다.
Sam

3
@Sam [일반적으로]은 비동기 요청으로 반환 할 수 없습니다. 콜백에서 응답을 처리해야합니다.
Petah

@Sam 여기에 예가 있습니다 :ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
Petah

좋은 발췌 문장. 그러나 query.join('&').replace(/%20/g, '+')대신 해서는 안 됩니까?
afsantos

3
이 줄을 옵션으로 포함하여 CORS 요청도 포함하십시오. 'xhr.withCredentials = true;'
Akam

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
실제로 IE와 Edge는이를 지원하지 않기 때문에 Fetch API가 "최신 브라우저"에서 작동한다고 주장하는 것은 올바르지 않습니다. (Edge 14의 경우 사용자가이 기능을 구체적으로 활성화해야합니다.) caniuse.com/#feat=fetch
saluce

7
여기에 GitHub의 폴리 필에 대한 언급이 있어야합니다. github.com/github/fetch
TylerY86

7
<script src="https://cdn.rawgit.com/github/fetch/master/fetch.js"></script>챔피언처럼 페치를 추가 하고 사용 하십시오 .
TylerY86

7
@saluce 이제 Edge 14에서 기본적으로 활성화되어 있습니다 (IE는 더 이상 "새로운"브라우저가 아닙니다 :-)
Supersharp

1
모바일에서 Fetch를 사용하지 마십시오. Android에서 HTTP 헤더에 문제가 있습니다. iOS에서 잘 작동합니다.
Kenny Lim

103

다음 기능을 사용할 수 있습니다 :

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);에서 사용됩니다)
Pavel Perna

2
@PavelPerna, 여기 예제는 GET이므로 요청에 추가 할 수는 있지만 더 일반적으로 당신과 함께, 요청 매개 변수를 함수의 매개 변수로 수락하도록 응답을 업데이트하는 것이 실제로 여기에 있다고 생각했습니다. , & 또한 메소드 ( GET또는 POST) 를 전달 하지만, 나를 막은 것은 사람들이 가능한 한 빨리 시도해 볼 수 있도록 가능한 한 간단하게 답변을 유지하고 싶다는 것입니다. 실제로, 나는 그들이 완벽하기 위해 노력하고 있기 때문에 toooo 오래되었다는 다른 답변을 싫어했습니다 :)
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();
  });
}

이 함수는 promise를 반환합니다 . 다음은 함수를 사용하고 반환 되는 약속을 처리하는 방법에 대한 예입니다 .

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

@Rotareti 모바일 브라우저가이 접근법을 지원합니까?
bodruk

최신 브라우저 버전 만 지원합니다. 일반적인 방법은 최신 ES6 / 7 /.에서 코드를 작성하고 Babel 등을 사용하여 더 나은 브라우저 지원을 위해 ES5로 다시 변환하는 것입니다.
Rotareti

2
@Rotareti 왜 이것이 단순한 콜백보다 더 편리한 지 설명 할 수 있습니까? 이 편리함은 오래된 브라우저 지원을 위해 추가 노력을 기울일 가치가 있습니까?
lennyklb

@LennartKloppenburg 나는이 대답은 잘 설명 생각 : stackoverflow.com/a/14244950/1612318는 ? "이 편의 가치가 오래된 브라우저 지원을 위해 그것을 transpile 할 수있는 여분의 노력이다" 약속은 ES6 / 7과 함께 제공되는 많은 기능 중 하나 일뿐 입니다. 트랜스 파일러를 사용하는 경우 최신 JS를 작성할 수 있습니다. 그것은 가치!
Rotareti

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 = 함수 () {/*this.responseText*/};
19 시간

3
@kenansulayman 동기 호출의 문제점은 무엇입니까? 때로는 가장 적합합니다.
Andrii Nemchenko 1

@Andrey : 서버의 응답이 반환 될 때까지 모든 실행을 중지한다는 것을 알고있는 한 아무것도 아닙니다. 특별히 나쁘지는 않지만 일부 용도에는 적합하지 않을 수 있습니다.
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();
}

그리고 POST :

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

아약스에 약속을 포함시키고 jQuery를 제외하는 방법을 찾고있었습니다. ES6 약속에 대해 이야기 하는 HTML5 Rocks 에 관한 기사가 있습니다 . ( Q 와 같은 promise 라이브러리로 polyfill 할 수 있습니다.) 기사에서 복사 한 코드 스 니펫을 사용할 수 있습니다.

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('&'));

둘 다 완전히 브라우저 + 버전과 호환되어야합니다.


for 루프 안에서 hasOwnProperty를 사용할 가치가 있습니까?
kibibu

15

JQuery를 포함하지 않으려면 간단한 AJAX 라이브러리를 사용해보십시오.

내가 가장 좋아하는 것은 reqwest입니다. 그것은 단지 3.4kb이며 매우 잘 구축되어 있습니다 : https://github.com/ded/Reqwest

다음은 reqwest를 사용한 샘플 GET 요청입니다.

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

더 가벼운 것을 원한다면 microAjax를 단 0.4kb로 사용해보십시오 : 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에 문제가 있다고 생각합니다. 두 번 호출 할 때 (많은 "this"때문에 충돌이 있어야합니다.) 두 개의 "새로운 microAjax"를 호출하는 것이 좋은 해결 방법인지 모르겠습니다.
Jill-Jênn Vie

13

오래되었지만 시도해 볼 것입니다. 어쩌면 누군가이 정보를 유용하게 사용할 수 있습니다.

GET요청 을 수행하고 JSON형식이 지정된 데이터를 가져 오는 데 필요한 최소량의 코드 입니다. 이는 최신 버전의 Chrome , FF , Safari , OperaMicrosoft 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();

XMLHttpRequest API 의 약속 기반 대체 인 새로운 Fetch API 도 확인하십시오 .


9

XMLHttpRequest ()

당신이 사용할 수있는 XMLHttpRequest()새로운 생성하는 생성자를 XMLHttpRequest사용하면 표준 HTTP 요청 방법 (예 : 사용하여 서버와 상호 작용 할 수 있습니다 (XHR) 객체를 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
XMLHttpRequest를 사용하는 Internet Explorer의 경우에도 대부분의 경우를 다루므로 답변이 정말 마음에 들지만이 예에서 "const data = ..."를 "var data = ..."로 변경하는 것이 좋습니다. (XMLHttpRequest) 따라서 완전히 호환됩니다
Dazag

8

from 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. XMLHttpRequest 객체를 사용하여 비동기 HTTP 요청

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를 사용하여 모듈을 묶으십시오. superagent 를 사용할 수 있습니다 .

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

다음은 JQuery가없는 JSFiffle입니다.

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('&');
}

내 아약스 전화

  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을 사용하지 않습니다. 이것은 아마도 복사하여 붙여 졌을 것입니다 .onreadystatechange 대신 onload를 사용하고 가능한 재귀 호출에 대한 오류를 잡으십시오 .xmlhttp는 끔찍한 변수 이름입니다 .x라고 부르십시오.
super

1

순수한 자바 스크립트가있는 매우 좋은 솔루션이 여기 있습니다.

/*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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.