慕姐4208626
XMLHttpRequest 2(首先阅读 Benjamin Gruenbaum和 Felix Kling的答案)如果你不使用jQuery并想要一个很好的简短的XMLHttpRequest 2,它适用于现代浏览器,也适用于移动浏览器,我建议用这种方式:function ajax(a, b, c){ // URL, callback, just a placeholder
c = new XMLHttpRequest;
c.open('GET', a);
c.onload = b;
c.send()}如你看到的:它比列出的所有其他功能都短。回调是直接设置的(因此没有额外的不必要的闭包)。它使用新的onload(因此您不必检查readystate && status)还有其他一些我不记得的情况会让XMLHttpRequest 1变得烦人。有两种方法可以获得此Ajax调用的响应(三种使用XMLHttpRequest var名称):最简单的:this.response或者,如果由于某种原因你bind()回调到一个类:e.target.response例:function callback(e){
console.log(this.response);}ajax('URL', callback);或者(上面的一个是更好的匿名函数总是一个问题):ajax('URL', function(e){console.log(this.response)});没什么比这更容易现在有些人可能会说最好使用onreadystatechange或甚至XMLHttpRequest变量名。那是错的。查看XMLHttpRequest高级功能它支持所有*现代浏览器。我可以确认,因为我使用这种方法,因为XMLHttpRequest 2存在。在我使用的所有浏览器上,我从未遇到任何类型的问题。onreadystatechange仅在您希望获取状态2的标头时才有用。使用XMLHttpRequest变量名是另一个大错误,因为你需要在onload / oreadystatechange闭包内执行回调,否则你就丢失了它。现在,如果您想使用post和FormData更复杂的东西,您可以轻松扩展此功能:function x(a, b, e, d, c){ // URL, callback, method, formdata or {key:val},placeholder
c = new XMLHttpRequest;
c.open(e||'get', a);
c.onload = b;
c.send(d||null)}再一次......这是一个非常短的功能,但它确实得到和发布。用法示例:x(url, callback); // By default it's get so no need to setx(url, callback, 'post', {'key': 'val'}); // No need to set post data或者传递一个完整的表单元素(document.getElementsByTagName('form')[0]):var fd = new FormData(form);x(url, callback, 'post', fd);或者设置一些自定义值:var fd = new FormData();fd.append('key', 'val')x(url, callback, 'post', fd);如你所见,我没有实现同步...这是一件坏事。话虽如此......为什么不这么简单呢?正如评论中所提到的,使用error && synchronous确实完全打破了答案的要点。哪个是以正确方式使用Ajax的简短方法?错误处理程序function x(a, b, e, d, c){ // URL, callback, method, formdata or {key:val}, placeholder
c = new XMLHttpRequest;
c.open(e||'get', a);
c.onload = b;
c.onerror = error;
c.send(d||null)}function error(e){
console.log('--Error--', this.type);
console.log('this: ', this);
console.log('Event: ', e)}function displayAjax(e){
console.log(e, this);}x('WRONGURL', displayAjax);在上面的脚本中,您有一个静态定义的错误处理程序,因此它不会危及该功能。错误处理程序也可用于其他功能。但要真正解决错误,唯一的方法是写一个错误的URL,在这种情况下每个浏览器都会抛出一个错误。如果您设置自定义标头,将responseType设置为blob数组缓冲区或其他任何内容,则错误处理程序可能很有用...即使你传递'POSTAPAPAP'作为方法它也不会抛出错误。即使你将'fdggdgilfdghfldj'作为formdata传递它也不会抛出错误。在第一种情况下,错误在displayAjax()under this.statusTextas中Method not Allowed。在第二种情况下,它只是起作用。如果您传递了正确的帖子数据,则必须在服务器端进行检查。跨域不允许自动抛出错误。在错误响应中,没有错误代码。只有this.type哪个被设置为错误。如果您完全无法控制错误,为什么要添加错误处理程序?大多数错误都在回调函数中返回displayAjax()。因此:如果您能够正确复制和粘贴URL,则无需进行错误检查。;)PS:作为我写的第一个测试x('x',displayAjax)......,它完全得到了回应...... ??? 所以我检查了HTML所在的文件夹,并且有一个名为'x.xml'的文件。因此,即使您忘记了文件的扩展名,XMLHttpRequest 2也会找到它。我好意思同步读取文件不要那样做。如果你想阻止浏览器一段时间加载一个漂亮的大.txt文件同步。function omg(a, c){ // URL
c = new XMLHttpRequest;
c.open('GET', a, true);
c.send();
return c; // Or c.response}现在你可以做到 var res = omg('thisIsGonnaBlockThePage.txt');没有其他方法可以以非异步方式执行此操作。(是的,使用setTimeout循环......但是认真吗?)另一点是......如果你使用API或只是你自己的列表文件或者你总是为每个请求使用不同的函数...只有当你有一个页面,你总是加载相同的XML / JSON或任何你只需要一个函数。在这种情况下,修改一点Ajax函数并用您的特殊函数替换b。以上功能仅供基本使用。如果你想扩展功能......是的你可以。我使用了很多API,我在每个HTML页面中集成的第一个函数之一是这个答案中的第一个Ajax函数,只有GET ...但是你可以用XMLHttpRequest 2做很多事情:我创建了一个下载管理器(使用范围,包括简历,文件读取器,文件系统),使用画布的各种图像调整器转换器,使用base64images填充Web SQL数据库等等......但在这些情况下,您应该只创建一个函数目的...有时你需要一个blob,数组缓冲区,你可以设置标题,覆盖mimetype,还有更多......但这里的问题是如何返回Ajax响应...(我添加了一个简单的方法。)