JavaScript瀑布流怎么实现(javascript,开发技术)

时间:2024-04-29 21:17:37 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    瀑布流的核心

    1, 根据 ajax请求的响应体结果 动态渲染生成页面

    请求地址 请求方式 参数键名 都是 后端程序定义的

    前端 只能根据需求 定义 携带的具体的参数数据

    响应体数据是后端程序返回的数据结果

    只能获取数据结果 不能修改数据结果

    可以根据 响应体数据结果 动态渲染生成页面内容

    可以使用 三元运算符 给标签定义属性等

    2, 瀑布流 再次 发起请求的判断依据

    上卷高度 + 视窗窗口高度 + 预留高度 > 最矮ul占位高度

    3, 函数的节流

    同时触发 多次执行 相同的函数程序

    只需要触发执行 第一次 函数程序的调用

    原理:

    • 定义一个 开关变量

    • 变量储存原始数据

    执行判断

    • 如果 变量 存储原始数据 变量赋值其他数据

    • 如果 变量 存储其他数据 执行 return 终止之后程序的执行

    当 函数的所有程序都触发执行结束

    变量 赋值原始值 可以再次触发 新的函数

    案例

    这里用某糖网站作为案例,调用某糖网站的接口,仿一个简单的网页。

    代码

    <!DOCTYPEhtml><htmllang="en"><head><!--服务器加载网络图片的meta标签--><metaname="referrer"content="never"><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><style>*{margin:0;padding:0;}.btn{width:300px;margin:50pxauto;}ul,ol,li{list-style:none;}img{display:block;width:100%;height:100%;}a,a:hover,a:active{text-decoration:none;}.box{width:1200px;margin:0auto;}.box::after{display:block;content:"";clear:both;}.boxul{width:260px;float:left;margin:020px;}.boxulli{width:100%;display:flex;flex-direction:column;border:2pxsolid#000;margin:0015px0;}.boxulli.imgBox{width:100%;}.boxulli.contentBox{width:100%;padding:15px;display:flex;flex-direction:column;justify-content:space-between;}.boxulli.contentBoxp{display:flex;justify-content:flex-start;align-items:center;}.boxulli.contentBoxp:nth-child(1){margin:10px0;}.boxulli.contentBoxp:nth-child(2){margin:10px0;}.boxulli.contentBoxp:nth-child(2)span{margin:010px00;}.boxulli.contentBoxp:nth-child(2)spani{margin:010px00;}.boxulli.contentBoxp:nth-child(3)span:nth-child(1){display:block;width:40px;height:40px;border-radius:50%;overflow:hidden;margin:010px00;}</style></head><body><divclass="btn"><button>美食菜谱</button><button>美妆造型</button><button>家居生活</button><button>人物明星</button></div><!--div中的内容是动态生成的--><divclass="box"></div><scriptsrc="../../ajax.js"></script><script>//定义全局变量存储相关的数据信息letstart;lettime;letkeyword;//获取父级div标签constoBox=document.querySelector('.box');//定义全局变量存储要使用的数据letoUls;letflag=true;//获取所有的button按钮constoBtns=document.querySelectorAll('button');//循环遍历给所有的button标签添加点击事件oBtns.forEach(item=>{item.addEventListener('click',function(){//默认第一次显示的是从索引下标是0开始的第一条数据start=0;//获取关键词keyword=this.innerHTML;//向div标签中写入4个ul空标签oBox.innerHTML="<ul></ul><ul></ul><ul></ul><ul></ul>";//获取所有的ul标签对象oUls=oBox.querySelectorAll('ul');//调用执行asyncawait和promise执行的ajax请求setPage();})})//定义页面滚动监听事件window.addEventListener('scroll',function(){//获取占位数据数值//页面上卷高度letscrollTop=document.documentElement.scrollTop;//视窗窗口占位高度letwinHeight=document.documentElement.clientHeight;//设定预留高度letheight=500;//获取最矮ul标签对象//循环结束minUl变量中存储最矮ul标签对象letminUl=oUls[0];for(leti=0+1;i<=oUls.length-1;i++){//如果minUl变量中存储的ul标签高度大于oUls[i]循环遍历的ul标签的占位//变量minUl中存储oUls[i]循环遍历的ul标签if(minUl.offsetHeight>oUls[i].offsetHeight){minUl=oUls[i];}}//执行判断if(scrollTop+winHeight+height>minUl.offsetHeight){//再次发起请求动态渲染生成新的页面内容/*因为scroll事件鼠标滚动一次多次触发scroll事件也就是鼠标滚动一次多次触发执行setPage()函数也就是鼠标滚动一次多次触发执行新的ajax请求因为ajax请求是异步程序结果就是多次触发的ajax请求执行的是相同的请求参数获取的响应体结果是相同的响应体结果实际项目中多次请求只需要执行第一次请求*///判断变量储存的数据防止多次调用函数if(flag){flag=false;}else{return;}//再次调用函数发起新的请求动态渲染生成新的页面setPage();}})//使用async定义异步请求函数程序asyncfunctionsetPage(){//获取时间对象和时间戳constt=newDate();time=t.getTime();//发起请求时根据需求设定ajax请求携带的参数数据//response中存储的是响应体数据constresponse=JSON.parse(awaitmyPromiseAjax('/dt','get',`include_fields=top_comments%2Cis_root%2Csource_link%2Citem%2Cbuyable%2Croot_id%2Cstatus%2Clike_count%2Csender%2Calbum%2Creply_count&filter_id=${keyword}&start=${start}&_=${time}`));console.log(response);//给下一次请求赋值起始数据的索引下标start=response.data.next_start;//获取24条数据的数组constarr=response.data.object_list;//循环遍历数组中的24个单元arr.forEach(item=>{//根据数组单元的数据生成li标签letstr=`<li><divclass="imgBox"><imgsrc="${item.photo.path}"alt=""></div><divclass="contentBox"><p>${item.msg}</p><p><span><i>点赞</i>${item.like_count}</span><span><i>收藏</i>${item.favorite_count}</span></p><p><span><imgsrc="${item.sender.avatar}"alt=""></span><span>${item.sender.username}<br>发布到<ahref="JavaScript:;">${item.album.name}</a></span></p></div></li>`;//每生成一个li就要拼接写入最矮的ul标签中//获取最矮的ul标签letminUl=oUls[0];for(leti=0+1;i<=oUls.length-1;i++){//如果minUl变量中存储的ul标签高度大于oUls[i]循环遍历的ul标签的占位//变量minUl中存储oUls[i]循环遍历的ul标签if(minUl.offsetHeight>oUls[i].offsetHeight){minUl=oUls[i];}}//循环结束minUl中存储的是最矮的ul标签对象//向最矮的ul标签中拼接写入li标签minUl.innerHTML+=str;})//当请求执行结束当新的页面内容生成完毕//可以再次发起新的请求给变量赋值原始数据flag=true;}</script></body></html>

    ajax代码

    //封装一个promise程序执行ajax请求//参数1请求的url地址//参数2请求的方式//参数3携带的参数怇functionmyPromiseAjax(url,type='get',data=''){//创建一个promise对象constp=newPromise(function(fulfilled,rejected){//执行异步ajax请求constxhr=newXMLHttpRequest();if(type.toLowerCase()==='get'){//get请求方式xhr.open('get',`${url}?${data}`);xhr.send();}else{//post请求方式xhr.open('post',url);xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xhr.send(data);}//接收请求结果xhr.onreadystatechange=function(){//当ajax状态码是4时判断http状态码if(xhr.readyState===4){//如果http状态码是200-299if(/^2\d{2}$/.test(xhr.status)){//请求成功fulfilled(xhr.response);}elseif(/^(4|5)\d{2}$/.test(xhr.status)){//请求失败rejected(xhr.statusText);}}}});//return返回这个promise对象returnp;}

    注意点

    (1)服务器加载网络图片的meta标签

    JavaScript瀑布流怎么实现

    (2)瀑布流执行的判断依据

    JavaScript瀑布流怎么实现

    (3)函数的节流

    JavaScript瀑布流怎么实现

    JavaScript瀑布流怎么实现

    (4)服务器配置更改

    运行结果

    JavaScript瀑布流怎么实现

     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:JavaScript瀑布流怎么实现的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:Java贪心算法实例分析下一篇:

    2 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18