如何在没有 jQuery 的情况下进行 AJAX 调用?

IT技术 javascript ajax
2021-01-04 15:48:45

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

6个回答

使用“香草”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");
    }
});
@Wade 我认为 Gokigooooks 在阅读“普通”JavaScript 时说他认为这是一个他需要下载的 JavaScript 库。他可能还引用了Vanilla JS
2021-02-14 15:48:45
@Fractaliste 如果您只是在与 xmlhttp.status 相关的 if 块之后调用回调,那么只需在那里调用它们就可以了。
2021-02-19 15:48:45

使用下面的代码片段,你可以很容易地做类似的事情,就像这样:

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)
};
这是一个非常好的启动,但我认为您错过了@3nigma 答案中的一些功能。也就是说,我不确定在不返回服务器响应的情况下发出某些请求(所有获取和一些发布)有多大意义。我在 send 方法的末尾添加了另一行 -- return x.responseText;-- 然后返回每个ajax.send调用。
2021-02-11 15:48:45
请通过包含此行作为选项来包含 CORS 请求。'xhr.withCredentials = true;'
2021-02-16 15:48:45
@Sam 你[通常] 不能作为异步请求返回。您应该在回调中处理响应。
2021-02-22 15:48:45
不错的片段。然而,不应该是这样query.join('&').replace(/%20/g, '+')吗?
2021-03-03 15:48:45
@Sam 里面有一个例子: ajax.get('/test.php', {foo: 'bar'}, function(responseText) { alert(responseText); });
2021-03-04 15:48:45

我知道这是一个相当古老的问题,但现在在较新的浏览器中提供了一个更好的 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;
});

请参阅此处了解更多详情。

这里应该提到 GitHub 的 polyfill。github.com/github/fetch
2021-02-13 15:48:45
实际上,声称 Fetch API 在“较新的浏览器”中有效是不正确的,因为 IE 和 Edge 不支持它。(Edge 14需要用户专门开启这个功能) caniuse.com/#feat=fetch
2021-02-22 15:48:45
@saluce 现在它在 Edge 14 中默认启用(并且 IE 不再是“新”浏览器 :-)
2021-02-22 15:48:45
不要在移动设备上使用 Fetch。它在 Android 上存在 HTTP 标头小写问题。在 iOS 上运行良好。
2021-03-04 15:48:45
只需<script src="https://cdn.rawgit.com/github/fetch/master/fetch.js"></script>像冠军一样添加和使用 fetch 即可。
2021-03-09 15:48:45

您可以使用以下功能:

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

您可以通过以下链接在线尝试类似的解决方案:

@PavelPerna,因为这里的例子是 a GET,所以你可以将它们添加到请求中,但更一般地说,我和你在一起,我真的想更新答案以接受请求参数作为这里函数的参数, & 也传递方法 (GETPOST),但阻止我的是我想在这里保持答案尽可能简单,以便人们尽快尝试。实际上,我讨厌其他一些太长的答案,因为他们试图做到完美:)
2021-02-20 15:48:45
也可以为请求添加一些输入变量(将在 xmlhttp.send(request); 中使用)
2021-03-07 15:48:45

这个版本在普通的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 对象。

您也可以集成req.responseType='json'到该功能中,但不幸的是没有 IE 支持它,所以我会坚持使用JSON.parse().

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