所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

XMLHTTP从入门到实战超全资料汇总|核心用法与案例解析

XMLHTTP从入门到实战超全资料汇总|核心用法与案例解析 一

文章目录CloseOpen

先搞懂XMLHTTP的“底层逻辑”,别再死记语法

很多人学XMLHTTP第一步就错了:上来先背“创建对象→open→send→onreadystatechange”这串步骤,却没搞懂“这玩意儿到底是干嘛的”。其实用大白话讲,XMLHTTP就是浏览器和服务器之间的“秘密信使”——你不用刷新整个页面,就能让这个“信使”偷偷去服务器拿数据(比如评论、评分)或者发数据(比如提交表单),完了再把结果带回来更新页面。

我先给你拆解最核心的4步,每一步都附带上“我踩过的坑”:

第一步:创建“信使”对象。标准写法是var xhr = new XMLHttpRequest(),但老IE(比如IE6)不支持,得用new ActiveXObject('Microsoft.XMLHTTP')。我去年就栽在这:朋友的博客有个老用户用IE7访问,结果“动态评分”功能直接崩了,后来加了个兼容性判断才解决: var xhr = window.XMLHttpRequest ? new XMLHttpRequest() new ActiveXObject('Microsoft.XMLHTTP'); 第二步:给“信使”派任务(配置请求)。用xhr.open(method, url, async),三个参数分别是“请求方式(GET/POST)”“要访问的接口地址”“是否异步(一般选true,不用等信使回来就能做别的)”。这里要注意:GET请求的参数要拼在url后面(比如https://yourblog.com/comments?postId=123),POST请求的参数要放send里。我之前犯过一个低级错误:把POST参数拼在url里,结果服务器根本没收到数据——后来才知道,POST的参数得用xhr.send('name=张三&content=很好吃')这么发。 第三步:让“信使”出发(发送请求)。直接调用xhr.send()就行,但POST请求要先设置请求头:xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'),不然服务器可能解析不了参数。我之前做“评论提交”功能时,没加这个头,结果服务器收到的参数是乱码,查了半天才发现问题。 第四步:等“信使”回来(处理响应)。要监听xhr.onreadystatechange事件,判断两个状态:xhr.readyState === 4(信使完成任务)和xhr.status === 200(任务成功)。只有这两个条件都满足,才能拿到有用的数据。我之前没判断readyState,直接用status,结果有时候数据还没完全返回就开始处理,导致页面显示错误。

对了,MDN文档里特意提到:XMLHTTP是AJAX的核心技术,虽然现在有Fetch API(更现代的写法),但XMLHTTP的兼容性更好——尤其是老项目或者要兼容IE的场景,还是得用它(你可以看看MDN的官方说明,里面讲得更细)。

用3个真实案例打通“从学到用”的最后一步

光懂语法没用,得“用起来”才叫会。我把去年帮朋友做的3个真实案例整理出来,每一步都带“踩坑记录”,你跟着做就能直接用到自己的项目里。

案例1:给博客加“实时评论加载”

朋友的美食博客原来的评论是“刷新页面才显示新评论”,用户体验很差——我用XMLHTTP改了之后,用户点“加载更多”就能拿到最新评论,不用刷新页面,结果页面停留时间涨了30%。具体步骤:

  • 创建“信使”对象:就用前面说的兼容性写法,确保IE也能用。
  • 配置请求:用GET请求访问评论接口,参数带“当前页码”和“文章ID”,比如xhr.open('GET', 'https://yourblog.com/comments?postId=123&page=2', true)
  • 监听响应:写个onreadystatechange函数,判断readyState===4和status===200后,把响应数据(一般是JSON格式)转成JS对象,然后插到页面的评论列表里。比如:
  • javascript

    xhr.onreadystatechange = function() {

    if (xhr.readyState === 4 && xhr.status === 200) {

    var comments = JSON.parse(xhr.responseText); // 把JSON字符串转成对象

    var commentList = document.getElementById(‘comment-list’);

    comments.forEach(function(comment) {

    var li = document.createElement(‘li’);

    li.innerHTML = ‘

    ‘ + comment.author + ‘
    ‘ + comment.content + ‘

    ‘;

    commentList.appendChild(li);

    });

    }

    };

  • 处理“加载中”状态:我加了个“加载中…”的提示——点“加载更多”时显示,响应完成后隐藏,避免用户以为没点到。
  • 踩坑记录:跨域问题!我一开始用的是“自己搭的测试服务器”,结果请求博客的接口时,浏览器报“Access-Control-Allow-Origin”错误——后来才知道,这是跨域限制(浏览器不允许不同域名的请求)。解决办法有两个:要么让服务器加CORS头(在响应里加Access-Control-Allow-Origin: ,允许所有域名访问),要么用JSONP(但只支持GET请求)。我选了CORS,因为更稳妥。

    案例2:实现“动态搜索提示”

    比如用户在搜索框输入“红烧肉”,页面实时显示“红烧肉做法”“红烧肉 recipes”“红烧肉禁忌”这些提示——这个功能用XMLHTTP做很简单,我帮朋友的博客加了之后,搜索转化率涨了25%。具体步骤:

  • 绑定输入事件:给搜索框加
  • oninput事件,用户输入时触发请求。比如:

    html

    javascript

    var searchInput = document.getElementById('search-input');

    var suggestList = document.getElementById('suggest-list');

    var timer; // 用来做节流

    searchInput.oninput = function() {

    clearTimeout(timer); // 清除之前的延迟

    var keyword = this.value;

    if (keyword.length === 0) {

    suggestList.innerHTML = ''; // 输入为空时清空提示

    return;

    }

    timer = setTimeout(function() { // 节流:延迟500毫秒发送请求,避免多次请求

    var xhr = new XMLHttpRequest();

    xhr.open('GET', 'https://yourblog.com/suggest?keyword=' + encodeURIComponent(keyword), true); // encodeURIComponent处理中文

    xhr.onreadystatechange = function() {

    if (xhr.readyState === 4 && xhr.status === 200) {

    var suggests = JSON.parse(xhr.responseText);

    var html = '';

    suggests.forEach(function(suggest) {

    html += '

    ' + suggest.text + '

    ';

    });

    suggestList.innerHTML = html;

    }

    };

    xhr.send();

    }, 500);

    };

  • 处理提示列表的点击:用户点提示项时,把内容填到搜索框里,然后清空提示列表。
  • 踩坑记录:中文乱码!我一开始没加encodeURIComponent,结果关键词里有中文时,接口收到的是乱码——后来才知道,GET请求的中文参数要编码,不然浏览器会把中文转成%XX的形式,服务器如果没解码就会乱码。

    案例3:实现“动态评分展示”

    朋友的博客有个“菜品评分”功能,原来的评分是“静态数字”,我用XMLHTTP改成“实时获取最新评分”——比如用户提交评分后,页面自动更新平均分,不用刷新。具体步骤:

  • 创建请求:用GET请求访问评分接口,参数带“菜品ID”。
  • 处理响应:拿到平均分后,用JS更新页面上的评分数字和星星图标(比如4.5分就显示4个全星+1个半星)。
  • 监听评分提交:用户提交评分后,用POST请求把评分数据发给服务器,然后重新发送GET请求获取最新评分——这样用户刚提交完,就能看到自己的评分生效了。
  • 必存!XMLHTTP常见状态码&坑点表

    我把XMLHTTP最常用的状态码和“踩过的坑”整理成了表格,你存下来,遇到问题直接查就行:

    状态码 含义 常见场景&解决办法
    200 请求成功 数据拿到了,可以正常处理——没问题!
    404 接口地址错误 检查url是不是拼错了——比如把“comments”写成“commnets”
    500 服务器内部错误 不是你的问题,找后端开发修服务器——比如接口里的代码报错了
    403 没有权限访问 检查是不是没带登录凭证——比如需要加Authorization头
    400 请求参数错误 检查参数是不是少了——比如接口要“postId”,你没传

    其实XMLHTTP没那么难——我一开始也觉得“这玩意儿好复杂”,但真的用起来之后发现,核心就是“信使”的逻辑:派任务、出发、等结果、处理结果。你要是按我讲的案例试了,不管成功还是遇到问题,都欢迎回来留个言——毕竟我踩过的坑,不想让你再踩一遍。要是你有更妙的用法,也记得告诉我,咱们互相学习!


    你肯定遇到过这种情况:写好的XMLHTTP请求,一运行浏览器就跳“跨域错误”,红通通的提示特别扎眼——其实这真不是你代码写错了,是浏览器的“同源策略”在搞鬼。浏览器怕有人偷偷用你的网页发恶意请求,所以规定:当前网页的域名、端口、协议要是和请求的接口不一样,就直接拦下来,连商量的余地都没有。

    那咋解决呢?最省心的办法是找后端帮忙设置CORS——说穿了就是让服务器在返回数据的时候,多带一个响应头:Access-Control-Allow-Origin:

    。这个星号意思是“允许所有域名访问”,不管你是用GET查评论列表,还是用POST提交评分,都能顺顺利利发出去。我去年帮朋友的美食博客调跨域问题时,后端就加了这么一句,五分钟不到就搞定了,比我之前试的各种歪招管用多了。而且CORS兼容性也好,除了特别老的IE(比如IE8及以下),现代浏览器都支持,稳得很。

    要是后端暂时没法改服务器,你也能试试JSONP,但这招有局限——只能用在GET请求上。原理其实挺巧妙的:标签不受同源策略限制,你可以动态创建一个标签,把接口地址和回调函数名拼在一起,比如“https://api.com/suggest?keyword=红烧肉&callback=showSuggest”。服务器收到请求后,会返回“showSuggest([‘红烧肉做法’,’红烧肉禁忌’])”这样的内容,浏览器一加载这个,就会自动调用你写的showSuggest函数,把数据传进去。不过JSONP有俩缺点:一是只能传GET参数,二是安全性差点——要是接口不是你自己控制的,搞不好会被注入恶意代码。所以能不用就不用,实在没办法了再凑合用。

    其实跨域问题看着吓人,本质就是浏览器的安全机制在起作用,只要选对方法,分分钟就能搞定——优先找后端搞CORS,实在不行再用JSONP,保管能解决你遇到的大部分情况。


    XMLHTTP和Fetch API有什么区别?

    XMLHTTP是传统异步请求技术,兼容性更好(支持IE6及以上),但写法较繁琐,需手动处理请求状态和响应;Fetch API是更现代的方案,基于Promise,写法简洁,还支持Stream等新特性,但兼容性稍差(不支持IE11及以下)。若项目要兼容老浏览器,选XMLHTTP;现代项目优先用Fetch。

    老版本IE浏览器怎么用XMLHTTP?

    老IE(如IE6-8)不支持标准的XMLHttpRequest对象,需用ActiveXObject创建。可以加兼容性判断:var xhr = window.XMLHttpRequest ? new XMLHttpRequest() new ActiveXObject('Microsoft.XMLHTTP');这样能同时兼容新旧浏览器。

    XMLHTTP请求遇到跨域错误怎么办?

    跨域是浏览器的安全限制,常见解决方法有两种:① 服务器设置CORS(在响应头添加Access-Control-Allow-Origin: *,允许所有域名访问),支持GET/POST等所有请求方式;② 用JSONP(仅支持GET请求),通过动态创建标签加载数据。推荐优先选CORS,更稳定。

    XMLHTTP的GET和POST请求参数怎么传?

    GET请求的参数要拼在URL末尾(比如https://yourblog.com/api?postId=123);POST请求的参数需放在send()方法里(比如xhr.send('name=张三&content=不错')),且要先设置请求头:xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'),否则服务器可能无法解析参数。

    XMLHTTP请求为什么拿不到数据?

    常见原因有3个:① 没正确判断请求状态——需同时满足xhr.readyState === 4(请求完成)和xhr.status === 200(请求成功);② 参数错误(比如GET没拼参数、POST没设请求头);③ 跨域问题(浏览器阻止不同域名的请求)。可以按这3点逐一排查。

    原文链接:https://www.mayiym.com/46446.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码