ajax请求

ajax实现的步骤

1.创建xhrXmlHttpRequest对象 var xhr = new XMLHttpRequest();

2.配置请求信息 xhr.open("get|post","url",false/true);

3.发送请求 xhr.send();

4.判断请求是否发送成功发

if(http_request.readyState==4 && http_request.status==200){}

onreadystatechange (用于异步)属性定义当 readyState 发生变化时执行的函数

|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------|
| 属性 | 描述 |
| onreadystatechange | 定义了当 readyState 属性发生改变时所调用的函数。 |
| readyState | 保存了 XMLHttpRequest 的状态。 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 正在处理请求 4: 请求已完成且响应已就绪 |
| status | 200: "OK" 403: "Forbidden" 404: "Page not found"如需完整列表,请访问 Http 消息参考 |
| statusText | 返回状态文本(例如 "OK" 或 "Not Found") |

把字符串转化为json格式: var json=JSON.parse(str);

ajax的请求方式

get同步请求

javascript 复制代码
 //get同步请求
 function getsync(url,params,okfun,errfun){
    if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        var xhr = new ActiveXObject
            ("Microsoft.XMLHTTP");
    }
    
    xhr.open('get',url+'?'+params,false);
    xhr.send();
    if(xhr.status == 200 && xhr.readyState == 4){
    okfun(xhr.responseText);
    }else{
        errfun("wrong")
    }
 }

get异步请求

javascript 复制代码
//get异步请求
 function getasync(url,params,okfun,errfun){
    if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        var xhr = new ActiveXObject
            ("Microsoft.XMLHTTP");
    }
    xhr.open('get',url+'?'+params,true);
    xhr.send();
    xhr.onreadystatechange=function(){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                okfun( xhr.response);
            } else{
                errfun('error')
            }
        }
    }
 }

post同步请求

javascript 复制代码
 //post的同步请求
 function postsync(url,params,okfun,errfun){
    if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        var http_request = new ActiveXObject
            ("Microsoft.XMLHTTP");
    }
    xhr.open('post',url ,false);
    //设置请求头
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send(params);
    
    if(xhr.status==200 && xhr.readyState==4){
               okfun(xhr.responseText);  
        }else{
            errfun("error");
        }
     
 }

post异步请求

javascript 复制代码
//post的异步请求
 function postasync(url,params,okfun,errfun){
    if (window.XMLHttpRequest) {
        var xhr = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        var http_request = new ActiveXObject
            ("Microsoft.XMLHTTP");
    }
    xhr.open('post',url ,true);
    //设置请求头
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send(params);
    xhr.onreadystatechange=function(){
        if(xhr.readyState==4){
            if(xhr.status==200){
                okfun(xhr.response)
            }else{
                errfun('error');
            }
        }
    }
 }

懒加载

懒加载也叫延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式

懒加载的优点

1.提升用户体验,加快首屏渲染速度

2.减少无效资源的加载

3.防止并发加载的资源过多会阻塞js的加载

懒加载的原理:

首先将页面上的图片的 src 属性设为空字符串,而图片的真实路径则设置在 data-original 属性中,当页面滚动的时候需要去监听 scroll 事件,在 scroll 事件的回调中,判断我们的懒加载的图片是否进入可视区域,如果图片在可视区内则将图片的 src 属性设置为 data-original 的值,这样就可以实现延迟加载。

html 复制代码
<style>
    .goods{
        width: 300px;
        height: 200px;
        border: 1px solid #f00;
    }
    img{
        width: 100px;
    }
</style>
<script src="./xiaomi-data.js"></script>
<div id="content"></div>
<script>
    var miData = data.data;
    var str = '';
    var cont = document.getElementById('content');
    function loadInitData(){
        for(var i=0;i<miData.length;i++){
            str += `<div class="goods"><img src="./img-placeholder.png" alt="" data-src="${miData[i].info.image}">                
            <div>价格:${miData[i].info.price}</div>                 
            <div>销量:${miData[i].info.comments}</div>                
            <div>${miData[i].info.name}</div>             
            </div>`;
         }
         cont.innerHTML += str;
    }

    // 页面初始化时,判断图片的加载时机
    function loadImg(){
        var imgList = cont.getElementsByTagName('img');
        var top;
        // 页面的高度
        var winHeight = document.documentElement.clientHeight;
        for(var i=0;i < imgList.length;i++){
            // 获取图片距离页面顶端的偏移值
            top = imgList[i].offsetTop;
            if(top <= winHeight){
                // 加载图片:把data-src中的数据放在src中
                console.log('加载第一幅图片',top,winHeight);
                imgList[i].src = imgList[i].dataset.src;
            }
        }
    }
    function onScroll(){
        window.onscroll = function(){
            var scrollTop = document.documentElement.scrollTop;
            var winHeight = document.documentElement.clientHeight;
            var imgList = cont.getElementsByTagName('img');
            var top;
            // 页面的高度
            var winHeight = document.documentElement.clientHeight;
            for(var i=0;i < imgList.length;i++){
                // 获取图片距离页面顶端的偏移值
                top = imgList[i].offsetTop;
                if(winHeight + scrollTop >= top){
                    imgList[i].src = imgList[i].dataset.src;
                }
            }
        }
    }
    loadInitData();
    loadImg()
    onScroll()
</script>
相关推荐
程序员大阳29 分钟前
HTML+CSS+JS对话式实战(9)-项目总结与问题分析
javascript·css·html·实战·项目总结
Flynt1 小时前
别写拖拽行为,只声明"能拖到哪":UIST 最佳论文的拖拽方案我实测了
前端·svg·preact
Moment2 小时前
代码都能让 Agent 写了,我们为什么还要学前端?
前端·后端·面试
Hilaku2 小时前
MCP 协议会成为前端 AI 工程的标准接口吗?
前端·javascript·程序员
Zan2 小时前
Tauri 2 实战:为什么一个可靠的桌面应用,应该由 Rust Host 管理生命周期?
前端·架构·rust
SameX2 小时前
鸿蒙 ArkTS 独立开发者的项目结构 model / dao / viewmodel / page / common 的分层
前端
阿星AI工作室2 小时前
WorkBuddy做数字人口播:动效包装+克隆声音+真实照片+对口型全流程
前端
火山引擎开发者社区2 小时前
给企业配一双 AI 的手:火山引擎 OS Agent 替你操作手机和电脑
前端·人工智能
三年三月2 小时前
自建https证书SSL
前端
ClouGence4 小时前
Web 自动化测试总是超时?聊聊等待、超时和异步加载
前端·测试