【问题标题】:How can I make an AJAX call without jQuery?如何在没有 jQuery 的情况下进行 AJAX 调用?
【发布时间】:2012-01-23 22:11:29
【问题描述】:

如何在不使用 jQuery 的情况下使用 JavaScript 进行 AJAX 调用?

【问题讨论】:

  • 请注意,虽然这里的很多答案都建议监听 readystatechange,但现代浏览器现在支持 loadabort XMLHttpRequest 的 i>、progresserror 事件(不过,您可能只关心 load)。
  • @ImadoddinIbnAlauddin 例如当它的主要功能(DOM 遍历)不需要时。
  • youmightnotneedjquery.com 很多纯 js 示例,包括。用于 ie8+、ie9+ 和 ie10+ 的 ajax
  • w3schools 在没有 jquery 的情况下逐步介绍了 ajax:w3schools.com/js/js_ajax_intro.asp
  • 也可以使用EHTML:github.com/Guseyn/EHTML使用e-json元素获取json并映射到html元素

标签: javascript ajax


【解决方案1】:

使用“香草”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");
    }
});

【讨论】:

  • @Fractaliste 如果您只是在与 xmlhttp.status 相关的 if 块之后调用回调,那么只需在那里调用它们就可以了。
  • @Wade 我认为 Gokigooooks 在他阅读 With "vanilla" JavaScript 时说他认为这是一个他需要下载的 JavaScript 库。他也可能引用Vanilla JS
【解决方案2】:

使用下面的 sn-p 你可以很容易地做类似的事情,像这样:

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

这里是sn-p:

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

【讨论】:

  • 这是一个非常棒的快速入门,但我认为您缺少@3nigma 答案中的一些功能。也就是说,我不确定在不返回服务器响应的情况下发出某些请求(全部是 get 和一些 post)有多大意义。我在 send 方法的末尾添加了另一行 -- return x.responseText; -- 然后返回每个 ajax.send 调用。
  • @Sam 你 [通常] 不能作为异步请求返回。您应该在回调中处理响应。
  • @Sam 里面有一个例子:ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
  • 不错的sn-p。但是,不应该是query.join('&amp;').replace(/%20/g, '+')吗?
  • 请通过将此行作为选项包括 CORS 请求。 'xhr.withCredentials = true;'
【解决方案3】:

我知道这是一个相当古老的问题,但现在newer browsers 提供了更好的 API。 fetch() 方法允许您发出 Web 请求。 例如,向/get-data请求一些json:

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

更多详情请见here

【讨论】:

  • 实际上,声称 Fetch API 在“较新的浏览器”中工作是不正确的,因为 IE 和 Edge 不支持它。 (Edge 14需要用户专门开启这个功能)caniuse.com/#feat=fetch
  • 这里应该提到 GitHub 的 polyfill。 github.com/github/fetch
  • 只需添加 &lt;script src="https://cdn.rawgit.com/github/fetch/master/fetch.js"&gt;&lt;/script&gt; 并像冠军一样使用 fetch。
  • @saluce 现在它在 Edge 14 中默认启用(并且 IE 不再是“新”浏览器 :-)
  • 不要在移动设备上使用 Fetch。它在 Android 上存在 HTTP 标头小写问题。在 iOS 上运行良好。
【解决方案4】:

您可以使用以下功能:

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); 中使用)
  • @PavelPerna,因为这里的例子是GET,所以你可以将它们添加到请求中,但更笼统地说,我和你在一起,我真的想更新答案在这里接受请求参数作为函数的参数,并传递方法(GETPOST),但阻止我的是我想在这里尽可能简单地让人们尝试答案尽可能快。实际上,我讨厌其他一些答案太长,因为它们试图做到完美:)
【解决方案5】:
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
        alert(this.responseText);
    }
};
xhttp.open("GET", "ajax_info.txt", true);
xhttp.send();

【讨论】:

  • 不要进行同步调用。使用 xhReq.onload 并使用回调。
  • @FellowStranger oReq.onload = function () { /*this.responseText*/ };
  • @kenansulayman 同步调用有什么问题?有时它最适合。
  • @Andrey:没什么,只要你意识到你正在停止执行一切,直到服务器的响应返回。没有什么特别糟糕的,但可能不完全适合某些用途。
  • 另外,如果服务器由于某种原因实际上从未响应,那么您的其余代码将永远不会运行。
【解决方案6】:

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。这是一个关于如何使用该函数并处理它返回的 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 Object。

你也可以将req.responseType='json'集成到函数中但不幸的是有no IE support for it,所以我会坚持JSON.parse()

【讨论】:

  • 使用XMLHttpRequest 可以异步尝试加载文件。这意味着您的代码将继续执行,而您的文件将在后台加载。为了在脚本中使用文件的内容,您需要一种机制来告诉脚本文件何时完成加载或加载失败。这就是 promises 派上用场的地方。还有其他方法可以解决这个问题,但我认为promises是最方便的。
  • @Rotareti 移动浏览器是否支持这种方法?
  • 只有较新的浏览器版本支持它。一种常见的做法是在最新的 ES6/7/.. 中编写代码,并使用 Babel 或类似工具将其转译回 ES5 以获得更好的浏览器支持。
  • @Rotareti 你能解释一下为什么这比“简单”回调更方便吗?这种便利是否值得为旧浏览器支持付出额外的努力?
  • @LennartKloppenburg 我认为这个答案很好地解释了这一点:stackoverflow.com/a/14244950/1612318 “这种便利是否值得为旧浏览器支持而付出额外的努力?” Promise 只是其中之一许多 ES6/7 附带的特性。如果您使用转译器,您可以编写最新的 JS。值得!
【解决方案7】:

使用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()之前设置headers

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

我们可以通过在调用httpRequest.send()之前将httpRequest.onreadystatechange设置为一个函数来处理响应

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

【讨论】:

  • 请注意,除了 200 之外还有其他成功状态,例如201
【解决方案8】:

可以根据浏览器获取正确的对象

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

【讨论】:

    【解决方案9】:

    我一直在寻找一种方法来包含 ajax 的 Promise 并排除 jQuery。 HTML5 Rocks 上有一篇文章谈到了 ES6 承诺。 (您可以使用像 Q 这样的 promise 库进行 polyfill)您可以使用我从文章中复制的代码 sn-p。

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

    注意:我也写了an article about this

    【讨论】:

      【解决方案10】:

      以下几个示例的小组合并创建了这个简单的部分:

      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?
      【解决方案11】:

      如果您不想包含 JQuery,我会尝试一些轻量级的 AJAX 库。

      我最喜欢的是 reqwest。它只有 3.4kb 并且构建得非常好:https://github.com/ded/Reqwest

      这是一个带有 reqwest 的示例 GET 请求:

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

      现在,如果您想要更轻量级的东西,我会尝试只有 0.4kb 的 microAjax: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);
      

      【讨论】:

      • 我认为microAjax有问题,当你调用它两次时(因为“this”众多,我认为肯定有碰撞)。我不知道调用两个“新的 microAjax”是否是一个很好的解决方法,是吗?
      【解决方案12】:

      XMLHttpRequest()

      您可以使用XMLHttpRequest() 构造函数创建一个新的XMLHttpRequest (XHR) 对象,该对象将允许您使用标准HTTP 请求方法(例如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);
      

      获取()

      您还可以使用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);
      

      【讨论】:

      • 我真的很喜欢你的回答,因为即使对于带有 XMLHttpRequest 的 Internet Explorer,你也涵盖了大多数情况,但我建议将:“const data = ...”更改为:“var data = ..." 在该示例 (XMLHttpRequest) 上,因此它与它完全兼容
      【解决方案13】:

      旧但我会尝试,也许有人会发现此信息有用。

      这是执行GET 请求并获取一些JSON 格式化数据所需的最少代码量。这仅适用于现代浏览器,例如最新版本的 ChromeFFSafariOpera 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,它是XMLHttpRequest API 的基于承诺的替代品。

      【讨论】:

        【解决方案14】:

        尝试使用 Fetch Api (Fetch API)

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

        它非常清晰,100% 香草味。

        【讨论】:

          【解决方案15】:

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

          【讨论】:

            【解决方案16】:

            这可能会有所帮助:

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

            【讨论】:

              【解决方案17】:
              <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>
              

              【讨论】:

                【解决方案18】:

                这只是一个简单的 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);
                        }
                    }
                }
                

                【讨论】:

                  【解决方案19】:

                  在浏览器中使用纯 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);
                       }
                   });
                  

                  【讨论】:

                    【解决方案20】:

                    这是一个没有 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();
                    

                    【讨论】:

                      【解决方案21】:
                      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);
                             });
                      

                      【讨论】:

                        【解决方案22】:

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

                        【讨论】:

                        • 单行 ifs 不需要大括号,没有人使用 IE6,这可能是复制粘贴,使用 onload 而不是 onreadystatechange,捕获可能递归调用的错误,xmlhttp 是一个糟糕的变量名,只需调用它x。
                        【解决方案23】:

                        这里有一个非常好的纯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();
                        

                        【讨论】:

                          【解决方案24】:

                          无需 jQuery 即可快速获取代码

                          async  function product_serach(word) {
                                      var response = await fetch('<?php echo base_url(); ?>home/product_search?search='+word);
                                      var json = await response.json();
                                      for (let [key, value] of Object.entries(json)) 
                                      {
                                          console.log(json)
                                      }                                 
                                  }
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-11-09
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多