Làm cách nào để thực hiện cuộc gọi AJAX mà không cần jQuery?


789

Làm cách nào để thực hiện cuộc gọi AJAX bằng JavaScript mà không cần sử dụng jQuery?


20
Xin lưu ý rằng trong khi có rất nhiều câu trả lời ở đây khuyên bạn nên đọc readystatechange , các trình duyệt hiện đại hiện hỗ trợ các sự kiện tải , hủy bỏ , tiến trìnhlỗi cho XMLHttpRequest (có lẽ bạn sẽ chỉ quan tâm đến tải ).
Paul S.

2
Ví dụ, @ImadoddinIbnAlauddin khi không cần chức năng chính (di chuyển ngang qua DOM).
THIẾT LẬP

8
youmightnotneedjquery.com rất nhiều ví dụ thuần js bao gồm. ajax cho eg8 +, eg9 + và eg10 +
Sanya_Zol

1
w3schools có một bước giới thiệu tốt đẹp về ajax mà không cần jquery: w3schools.com/js/js_ajax_intro.asp
eli

Bạn cũng có thể sử dụng EHTML: github.com/Guseyn/EHTML Sử dụng phần tử e-json để tìm nạp json và ánh xạ nó tới phần tử html
Guseyn Ismayylov

Câu trả lời:


591

Với JavaScript "vani":

<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>

Với jQuery:

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

1
@Fractaliste Nếu bạn chỉ đơn giản gọi các cuộc gọi lại sau các khối if liên quan đến xmlhttp.status, thì chỉ cần gọi chúng ở đó và bạn đã hoàn tất.
Jay

5
@Wade Tôi nghĩ rằng Gokigooooks đang nói khi đọc Với "vanilla" JavaScript , anh ấy nghĩ rằng đó là một thư viện JavaScript mà anh ấy cần tải xuống. Anh ta cũng có thể tham khảo Vanilla JS .
Đã xem

221

Sử dụng đoạn mã sau, bạn có thể thực hiện những việc tương tự khá dễ dàng, như thế này:

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

Đây là đoạn trích:

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
Đây là một bước khởi đầu thực sự tuyệt vời, nhưng tôi nghĩ rằng bạn đang thiếu một cái gì đó có trong câu trả lời của @ 3nigma. Đó là, tôi không chắc có bao nhiêu ý nghĩa khi thực hiện một số yêu cầu nhất định (tất cả nhận và một số bài đăng) mà không trả lại phản hồi của máy chủ. Tôi đã thêm một dòng khác vào cuối phương thức gửi - return x.responseText;- và sau đó trả lại từng ajax.sendcuộc gọi.
Sam

3
@Sam bạn [thường] không thể trả lại vì đây là yêu cầu không đồng bộ. Bạn nên xử lý các phản hồi trong một cuộc gọi lại.
Petah

@Sam có một ví dụ ở đó:ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
Petah

Đoạn trích hay. Tuy nhiên, không nên query.join('&').replace(/%20/g, '+')thay thế?
afsantos

3
Vui lòng bao gồm yêu cầu CORS cũng bằng cách bao gồm dòng này như là một tùy chọn. 'xhr.withCredentials = true;'
Akam

131

Tôi biết đây là một câu hỏi khá cũ, nhưng hiện tại đã có một API đẹp hơn có sẵn trong các trình duyệt mới hơn . Các fetch()phương pháp cho phép bạn thực hiện các yêu cầu web. Ví dụ: để yêu cầu một số json từ /get-data:

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

Xem ở đây để biết thêm chi tiết.


9
Trên thực tế, sẽ không chính xác khi tuyên bố API Fetch hoạt động trong "các trình duyệt mới hơn", vì IE và Edge không hỗ trợ nó. (Edge 14 yêu cầu người dùng kích hoạt cụ thể chức năng này) caniuse.com/#feat=fetch
saluce

7
Cần có một đề cập đến polyfill của GitHub ở đây. github.com/github/fetch
TylerY86

7
Chỉ cần thêm <script src="https://cdn.rawgit.com/github/fetch/master/fetch.js"></script>và sử dụng tìm nạp như một nhà vô địch.
TylerY86

7
@saluce Bây giờ, nó được bật theo mặc định trong Edge 14 (và IE không còn là trình duyệt "mới" nữa :-)
Supersharp

1
Đừng sử dụng Fetch trên thiết bị di động. Nó có vấn đề vỏ tiêu đề HTTP thấp hơn trên Android. Hoạt động tốt trên iOS.
Kenny Lim

104

Bạn có thể sử dụng chức năng sau:

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

Bạn có thể thử các giải pháp tương tự trực tuyến trên các liên kết sau:


Cũng sẽ rất hay khi thêm một số biến đầu vào cho yêu cầu (sẽ được sử dụng trong xmlhttp.send (request);)
Pavel Perna

2
@PavelPerna, vì ví dụ ở đây là a GET, vì vậy bạn chỉ cần thêm chúng vào yêu cầu, nhưng để chung chung hơn, tôi với bạn, tôi thực sự nghĩ đến việc cập nhật câu trả lời để chấp nhận tham số yêu cầu làm tham số cho hàm ở đây , & cũng để vượt qua phương thức ( GEThoặc POST), nhưng điều khiến tôi dừng lại là tôi muốn giữ câu trả lời ở đây đơn giản nhất có thể để mọi người thử nó nhanh nhất có thể. Trên thực tế, tôi ghét một số câu trả lời khác vì đã lâu rồi vì họ đang cố gắng để trở nên hoàn hảo :)
AbdelHady

40

Làm thế nào về phiên bản này trong ES6 / ES2015 đơn giản ?

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

Hàm trả về một lời hứa . Dưới đây là một ví dụ về cách sử dụng chức năng và xử lý lời hứa mà nó trả về:

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

Nếu bạn cần tải một tệp json, bạn có thể sử dụng JSON.parse()để chuyển đổi dữ liệu được tải thành Đối tượng JS.

Bạn cũng có thể tích hợp req.responseType='json'vào chức năng nhưng tiếc là không có hỗ trợ IE cho nó , vì vậy tôi sẽ gắn bó JSON.parse().


2
Sử dụng XMLHttpRequestbạn thực hiện một nỗ lực không đồng bộ để tải một tệp. Điều đó có nghĩa là việc thực thi mã của bạn sẽ tiếp tục, trong khi tệp của bạn tải trong nền. Để sử dụng nội dung của tệp trong tập lệnh của bạn, bạn cần một cơ chế cho biết tập lệnh của bạn khi tải xong hoặc tải không thành công. Đó là nơi hứa hẹn có ích. Có nhiều cách khác để giải quyết vấn đề này, nhưng tôi nghĩ những lời hứa là thuận tiện nhất.
Rotareti

@Rotareti Các trình duyệt di động có hỗ trợ phương pháp này không?
Bodruk

Chỉ các phiên bản trình duyệt mới hơn hỗ trợ nó. Một thực tế phổ biến là viết mã của bạn trong ES6 / 7 / .. mới nhất và sử dụng Babel hoặc tương tự để chuyển mã trở lại ES5 để hỗ trợ trình duyệt tốt hơn.
Rotareti

2
@Rotareti Bạn cũng có thể giải thích lý do tại sao điều này sẽ thuận tiện hơn so với cuộc gọi lại 'đơn giản'? Sự tiện lợi này có xứng đáng với nỗ lực bổ sung để dịch nó cho hỗ trợ trình duyệt cũ không?
lennyklb

@LennartKloppenburg Tôi nghĩ rằng câu trả lời này giải thích rất rõ: stackoverflow.com/a/14244950/1612318 "Sự tiện lợi này có đáng để bỏ thêm công sức để hỗ trợ cho trình duyệt cũ không?" Hứa hẹn chỉ là một trong nhiều tính năng đi kèm với ES6 / 7. Nếu bạn sử dụng một bộ chuyển mã, bạn có thể viết JS cập nhật. Thật đáng giá!
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
Đừng thực hiện các cuộc gọi đồng bộ. Sử dụng xhReq.onload và sử dụng các cuộc gọi lại.
19h

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

3
@kenansulayman Có gì sai với cuộc gọi đồng bộ? Đôi khi nó phù hợp nhất.
Andrii Nemchenko

@Andrey: không có gì, theo như bạn nhận ra bạn đang dừng thực thi mọi thứ cho đến khi phản hồi từ máy chủ trở lại. Không có gì đặc biệt xấu, nhưng có lẽ không chính xác đầy đủ cho một số sử dụng.
mrówa

Ngoài ra, nếu máy chủ thực sự không bao giờ phản hồi vì một số lý do, phần còn lại của mã của bạn sẽ không bao giờ chạy.
Voi ngẫu nhiên

35

Sử dụng XMLHttpRequest .

Yêu cầu NHẬN đơn giản

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

Yêu cầu POST đơn giản

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

Chúng tôi có thể chỉ định rằng yêu cầu phải không đồng bộ (đúng), mặc định hoặc đồng bộ (sai) với đối số thứ ba tùy chọn.

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

Chúng tôi có thể đặt tiêu đề trước khi gọi httpRequest.send()

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

Chúng ta có thể xử lý phản hồi bằng cách cài đặt httpRequest.onreadystatechangemột chức năng trước khi gọihttpRequest.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
Lưu ý rằng có những trạng thái thành công khác hơn 200, ví dụ: 201
Nate Vaughan

30

Bạn có thể lấy đúng đối tượng theo trình duyệt với

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;
}

Với đúng đối tượng, một GET có thể được trừu tượng hóa thành:

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

Và một bài viết để:

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

Tôi đang tìm cách bao gồm các lời hứa với ajax và loại trừ jQuery. Có một bài viết về HTML5 Rocks nói về ES6 hứa hẹn. (Bạn có thể polyfill với một thư viện lời hứa như Q ) Bạn có thể sử dụng đoạn mã mà tôi đã sao chép từ bài viết.

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

Lưu ý: Tôi cũng đã viết một bài viết về điều này .


15

Một sự kết hợp nhỏ từ một vài ví dụ dưới đây và tạo ra tác phẩm đơn giản này:

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

HOẶC nếu tham số của bạn là (các) đối tượng - điều chỉnh mã bổ sung nhỏ:

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

Cả hai nên tương thích hoàn toàn với trình duyệt + phiên bản.


Có đáng để sử dụng hasOwnProperty trong vòng lặp for ở đây không?
kibibu

15

Nếu bạn không muốn bao gồm JQuery, tôi sẽ thử một số thư viện AJAX nhẹ.

Yêu thích của tôi là reqwest. Nó chỉ có 3,4kb và được xây dựng rất tốt: https://github.com/ded/Reqwest

Đây là một yêu cầu GET mẫu với reqwest:

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

Bây giờ nếu bạn muốn thứ gì đó nhẹ hơn nữa, tôi sẽ thử microAjax chỉ với 0,4kb: https://code.google.com.vn/p/microajax/

Đây là tất cả các mã ngay tại đây:

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)}};

Và đây là một cuộc gọi mẫu:

microAjax(url, onSuccess);

1
Tôi nghĩ rằng có một vấn đề với microAjax, khi bạn gọi nó hai lần (vì có rất nhiều điều này, tôi nghĩ rằng, phải có một sự va chạm). Tôi không biết nếu gọi hai microAjax mới là một cách giải quyết tốt, phải không?
Jill-Jênn Vie

13

Cũ nhưng tôi sẽ thử, có thể ai đó sẽ thấy thông tin này hữu ích.

Đây là số lượng mã tối thiểu bạn cần để thực hiện một GETyêu cầu và tìm nạp một số JSONdữ liệu được định dạng. Điều này chỉ áp dụng cho các trình duyệt hiện đại như các phiên bản mới nhất của 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();

Ngoài ra, hãy kiểm tra API tìm nạp mới , một sự thay thế dựa trên lời hứa cho API XMLHttpRequest .


9

XMLHttpRequest ()

Bạn có thể sử dụng hàm XMLHttpRequest()tạo để tạo một XMLHttpRequestđối tượng (XHR) mới cho phép bạn tương tác với máy chủ bằng các phương thức yêu cầu HTTP tiêu chuẩn (như GETPOST):

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);

lấy ()

Bạn cũng có thể sử dụng fetch()phương thức để có được một Promisegiải pháp cho Responseđối tượng thể hiện phản hồi cho yêu cầu của bạn:

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);
    });
  }
});

hoa tiêu.sendBeacon ()

Mặt khác, nếu bạn chỉ đơn giản là cố gắng POSTdữ liệu và không cần phản hồi từ máy chủ, giải pháp ngắn nhất sẽ là sử dụng navigator.sendBeacon():

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

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

1
Tôi thực sự thích câu trả lời của bạn, bởi vì bạn bao quát hầu hết các trường hợp ngay cả đối với Internet Explorer với XMLHttpRequest, nhưng tôi khuyên bạn nên thay đổi: "const data = ..." thành: "var data = ..." trên ví dụ đó (XMLHttpRequest) vì vậy nó hoàn toàn tương thích với nó
Dazag

8

Từ bạnMightNotNeedJquery.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

Điều này có thể giúp:

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

Vâng, nó chỉ là một quá trình dễ dàng 4 bước,

Tôi hy vọng nó sẽ giúp

Step 1. Lưu trữ tham chiếu đến đối tượng XMLHttpRequest

var xmlHttp = createXmlHttpRequestObject();

Step 2. Truy xuất đối tượng 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. Thực hiện yêu cầu HTTP không đồng bộ bằng cách sử dụng đối tượng 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. Được thực hiện tự động khi nhận được tin nhắn từ máy chủ

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

bằng JavaScript đơn giản trong trình duyệt:

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

Hoặc nếu bạn muốn sử dụng Browserify để gói các mô-đun của mình lên bằng node.js. Bạn có thể sử dụng 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

Đây là một JSFiffle không có 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('&');
}

cuộc gọi ajax của tôi

  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);
     }
      });

để hủy bỏ các yêu cầu trước đó

      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";

?>

Nếu một dòng không cần dấu ngoặc nhọn, Noone sử dụng IE6, Đây có thể là bản sao được dán, sử dụng onload thay vì onreadystatechange, bắt lỗi cho các cuộc gọi đệ quy có thể, xmlhttp là một tên biến khủng khiếp, chỉ cần gọi nó là x.
siêu

1

Một giải pháp tuyệt vời với javascript thuần túy có ở đây

/*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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.