ajax

49 阅读2分钟

哈喽哈喽,这里是小菜不拖延博主

ajax的特点

  • 创建异步请求的技术 (最开始使用的不是json,而是xml格式来传输数据)

优点

  • 可以无需刷新页面而与服务器端进行通信。

从服务器获取数据或将数据发送到服务器,然后在页面中动态更新内容,然后将响应的数据添加到页面中的特定位置,而不需要刷新整个页面,websocket(建立在tcp之上)、fetch等都可以实现无刷新请求

  • 允许根据用户时间来更新部分页面的内容

缺点

  • 不能后退
  • 存在跨域
  • seo不友好

seo即搜索引擎优化(Search Engine Optimization),是一系列的优化技术和策略,旨在提高网站在搜索引擎(如Google、百度等)中的有机排名,从而增加网站的曝光度和流量。因为很多数据需要我们触发用户事件(比如点击等)才能请求到数据,

使用

onreadystatechange 事件

image.png

请求

//创建对象
xmlhttp=new XMLHttpRequest();

//发送
xmlhttp.open("GET","url",asynctrue,false));
xmlhttp.send();

xmlhttp.open("GET","/try/ajax/demo_get2.php?fname=Henry&lname=Ford",true); 
xmlhttp.send();

//如果需要像 HTML 表单那样 POST 数据,请使用 setRequestHeader() 来添加 HTTP 头。然后在 send() 方法中规定您希望发送的数据:
//通过调用`setRequestHeader`方法设置`Content-type`请求头的目的是告诉服务器发送的数据的格式和类型。
xmlhttp.open("POST","/try/ajax/demo_post2.php",true); 
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 
xmlhttp.send("fname=Henry&lname=Ford");


//接收json
//事件绑定
xhr.onreadystatechange = function(){
    if(xhr.readyState === 4){
        if(xhr.status >= 200 && xhr.status < 300){
            // console.log(xhr.response);
            // result.innerHTML = xhr.response;
            // 1. 手动对数据转化
            let data = JSON.parse(xhr.response);
            // 2. 自动转换,先设置xhr.responseType='json'
            console.log(xhr.response);
            result.innerHTML = xhr.response.name;
        }
    }
}

解决一些问题

ie缓存

由于缓存的存在,我们页面上可能展示不是最新的数据,针对这个问题处理:xhr.open("GET",'http://127.0.0.1:8000/ie?t='+Date.now());

请求超时

xhr.timeout=事件

xhr.ontimeout=function(){触发事件}

请求err

xhr.onerr=function(){}

取消请求

xhr.abort

如果请求已经被发送到服务器,并且服务器已经接收了该请求,那么该请求将不能被取消。

重复请求解决思路

定义变量,判断当前状态是否在请求,如果在请求就abort当前请求重新创建请求,只有onreadstate===4,也就是请求完成的时候才置为false,表示请求已经结束

跨域

同源策略

协议、域名、端口必须一致(ajax默认遵循)

解决跨域

jsonp

image.png 非官方,自己开发出来,只支持get请求

使用script的src引入标签
<script src="http://127.0.0.1:5500/%E8%AF%BE%E5%A0%82/%E4%BB%A3%E7%A0%81/7-%E8%B7%A8%E5%9F%9F/2-JSONP/js/app.js"></script>

cors 官方解决

原理:通过设置一个响应头来告诉浏览器,该请求允许跨域

服务器设置:
1.  `response.setHeader("Access-Control-Allow-Origin", "*")` 表示允许所有来源(即任何域名)的跨域请求访问服务器资源。
1.  `response.setHeader("Access-Control-Allow-Headers", '*')` 指定允许跨域请求携带的自定义请求头。
1.  `response.setHeader("Access-Control-Allow-Method", '*')` 表示允许发送的跨域请求使用任意HTTP方法(GET、POST、PUT等)。