>这就是我们处理服务器的响应的方式:
>
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);> onreadystatechange是异步的,这意味着它随时被调用。这些类型的功能是回调 - 一旦处理完成后,它就会被调用。在这种情况下,处理器正在服务器上进行。
>
对于那些希望更多地了解Ajax基础知识的人,MDN网络有一个很好的指南。到jQuery还是不jQuery?
> 因此,好消息是上述代码将在所有最新的主要浏览器中起作用。坏消息是,它非常令人费解。好!我已经在寻找优雅的解决方案。xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } };>
使用jQuery,可以将整个片段浓缩为:
这很好。确实,对于包括您在内的许多人来说,JQuery在Ajax方面已成为事实上的标准。但是,你知道吗?不必是这样。存在jQuery来绕过丑陋的DOM API。但是,真的是
丑陋的吗?还是难以理解?>
所以让我们开始吧……>
>设置这将检查请求URL,以确定应用程序应如何响应。如果请求来自脚本目录,则将适当的文件与应用程序/JavaScript的内容类型一起提供。否则,如果已将请求的X重新抽出标题设置为XMLHTTPRequest,那么我们知道我们正在处理AJAX请求,并且可以做出适当的响应。如果没有这样的情况,则提供文件视图/index.html。
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);>我将在我们潜入服务器中的AJAX响应中,扩展评论的部分。在node.js中,我不得不对渲染和httphandler进行一些重弹性:
渲染函数异步读取所请求的文件的内容。它通过对HTTPhandler函数的引用,然后将其作为回调执行。 httphandler函数检查是否存在错误对象(例如,如果无法打开所请求的文件)。提供一切都很好,然后使用适当的HTTP状态代码和内容类型为文件的内容提供服务。
>xhr.onreadystatechange = function () { var DONE = 4; // readyState 4 means the request is done. var OK = 200; // status 200 is a successful return. if (xhr.readyState === DONE) { if (xhr.status === OK) { console.log(xhr.responseText); // 'This is the returned text.' } else { console.log('Error: ' + xhr.status); // An error occurred during the request. } } };测试API
喜欢使用任何声音后端API,让我们编写一些单元测试以确保其有效。对于这些测试,我正在呼吁Supertest和Mocha寻求帮助:
接口
$.ajax({ url: 'send-ajax-data.php', }) .done(function(res) { console.log(res); }) .fail(function(err) { console.log('Error: ' + err.status); });
现在,让我们看一下我们在html中构建的用户界面:
>
var xhr = new XMLHttpRequest(); xhr.open('GET', 'send-ajax-data.php'); xhr.send(null);这是控制台中的输出:
时,Onload事件才会发射。因此,Onload事件是您可以在几秒钟内充分利用的现代API。现有的事件将有向后兼容。但是,Onload事件应该是您选择的工具。 Onload事件看起来像是JQuery上的成功回调,不是吗?
是时候将5磅的哑铃放在一边,然后移动到手臂卷发了。
如您所见,Vanilla Ajax是灵活而现代的前端API。您可以使用请求标题有很多想法,其中之一是版本化。因此,例如,假设我想支持此Web API的多个版本。这很有用,因为当我不想打破URL并提供一种机制,客户可以选择他们想要的版本。我们可以这样设置请求标头:
>
>您可能想知道,当我与之合作时,为什么ResponseText包含服务器响应,这就是普通的旧json。事实证明,这是因为我没有设置适当的重新定型。此AJAX属性非常适合告诉前端API对服务器对期望的响应类型。因此,让我们充分利用它: a,如果您必须解决这个问题:
>
在没有jQuery vanilla ajax是指使用本机JavaScript创建异步的Web应用程序,而无需依靠JQuery库。尽管JQuery Ajax提供了一种简化的跨浏览器兼容方法来处理Ajax,但Vanilla Ajax可以使您对基础过程有更多的控制和理解。如果您想减少诸如JQuery之类的外部库的依赖关系。 var xhr = new xmlhttprequest(); xhr.send(); >如何监视AJAX请求的进度? >所有现代浏览器都支持
>这样,我们可以在Node.js中进行检查:xhr.onreadystatechange = function () {
var DONE = 4; // readyState 4 means the request is done.
var OK = 200; // status 200 is a successful return.
if (xhr.readyState === DONE) {
if (xhr.status === OK) {
console.log(xhr.responseText); // 'This is the returned text.'
} else {
console.log('Error: ' + xhr.status); // An error occurred during the request.
}
}
};
在后端,请尝试:$.ajax({
url: 'send-ajax-data.php',
})
.done(function(res) {
console.log(res);
})
.fail(function(err) {
console.log('Error: ' + err.status);
});
>我们在家中,没有汗水!您可能想知道,关于Ajax还有什么要知道的?好几个整洁的技巧。// app.js
var app = http.createServer(function (req, res) {
if (req.url.indexOf('/scripts/') >= 0) {
render(req.url.slice(1), 'application/javascript', httpHandler);
} else if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
// Send Ajax response
} else {
render('views/index.html', 'text/html', httpHandler);
}
});
var xhr = new XMLHttpRequest();
xhr.open('GET', 'send-ajax-data.php');
xhr.send(null);
很棒的,我可以告诉API的期望,而不必退回纯文本,而不得不将其解析为JSON。几乎所有最新的主要浏览器都可以使用此功能。当然,jQuery会自动进行这种类型的转换。但是,我们现在有一种方便的方式在普通的JavaScript中做同样的事情,这不是很棒吗? Vanilla Ajax对许多其他响应类型都有支持,包括XML。
可悲的是,在Internet Explorer中,这个故事并不那么出色。截至IE 11,该团队尚未增加对Xhr.ResponseType ='json'的支持。此功能将到达Microsoft Edge。但是,截至撰写本文时,该错误已经近两年了。我的猜测是微软的人们一直在努力改造浏览器。希望我们希望Microsoft Edge(又名Spartan项目)能兑现其承诺。
xhr.onreadystatechange = function () {
var DONE = 4; // readyState 4 means the request is done.
var OK = 200; // status 200 is a successful return.
if (xhr.readyState === DONE) {
if (xhr.status === OK) {
console.log(xhr.responseText); // 'This is the returned text.'
} else {
console.log('Error: ' + xhr.status); // An error occurred during the request.
}
}
};
>
根据jQuery文档,它所做的只是将时间戳查询字符串附加到请求的末尾。这使请求有些独特,并破坏了浏览器缓存。发射http ajax请求时,您可以看到这是什么样子:
$.ajax({
url: 'send-ajax-data.php',
})
.done(function(res) {
console.log(res);
})
.fail(function(err) {
console.log('Error: ' + err.status);
});
tada!一切都没有戏剧。>希望您喜欢300磅的卧推香草·阿贾克斯(Vanilla Ajax)。一段时间以来,阿贾克斯是一个可怕的野兽,但不再是。实际上,我们涵盖了Ajax的所有基础知识,而没有拐杖,sha骨,jQuery。
这就是响应的样子:
// app.js
var app = http.createServer(function (req, res) {
if (req.url.indexOf('/scripts/') >= 0) {
render(req.url.slice(1), 'application/javascript', httpHandler);
} else if (req.headers['x-requested-with'] === 'XMLHttpRequest') {
// Send Ajax response
} else {
render('views/index.html', 'text/html', httpHandler);
}
});
>
如何使用vanilla javaScript?
if(xhr.readystate == 4 && xhr.status ===== 200)
console.log(json.parse(xhr.responseText));
}
xhr.send();
>
>我如何处理香草ajax中的错误?可以使用XMLHTTPREQUEST对象的OnError事件处理程序完成xhr.open(“ get”,'https://api.example.com/data',true) 。失败的“);
};
var xhr = new xmlhttprequest();
xhr.send(json.stringify({key:“ value”}));
如何在Vanilla Javascript中取消AJAX请求? >您可以通过调用xmlhttprequest对象的中止方法来取消AJAX请求。这将立即终止请求。
>我可以使用vanilla javascript?>是的,但是不建议这样做,因为它可以阻止脚本的执行并使您的网页无反应互动,但不建议这样做。 。要提出同步请求,请将false作为第三个参数传递到打开的方法。
>
以上是没有jQuery的香草·阿贾克斯的指南的详细内容。更多信息请关注PHP中文网其他相关文章!