js防抖和节流优化浏览器滚动条滚动到最下面时加载更多数据
程序员文章站
2024-01-03 21:17:16
防抖和节流,主要是用来防止过于平凡的执行某个操作,如浏览器窗口变化执行某个操作,监听某个input输入框keyup变化,瀑布流布局时Y轴滚动,图片加载。 js函数的防抖 经过一段事件才执行某个操作,如果时间内又执行了该操作则延长时间重新开始计算 /* 输入快的话会出现输出结果多次重复 */ 使用防抖 ......
防抖和节流,主要是用来防止过于平凡的执行某个操作,如浏览器窗口变化执行某个操作,监听某个input输入框keyup变化,瀑布流布局时y轴滚动,图片加载。
js函数的防抖
经过一段事件才执行某个操作,如果时间内又执行了该操作则延长时间重新开始计算
/* 不做处理input触发keyup事件 */
/* 输入快的话会出现输出结果多次重复 */
window.onload = function () { let obj = document.getelementbyid('input') obj.addeventlistener('keyup',()=>{ let val = obj.value; inputchange(val) },false) } function inputchange(val) { console.log(val) }
// 11 11 123 123 123456 123456 123456
使用防抖去处理
/* 使用防抖去处理input触发keyup事件 */ /* 输入快的话会也不会输出多次重复结果 */ window.onload = function () { let obj = document.getelementbyid('input') let callback = inputchange() obj.addeventlistener('keyup',()=>{ let val = obj.value; callback(val) },false) } // 高级函数的应用 // 闭包time为局部变量 但不会在inputchange 函数调用完后释放 // 函数返回函数 function inputchange() { var time return function(val){ if(time) { cleartimeout(time) } time = settimeout(() => { console.log(val) }, 200); } }
js函数节流
定义:执行某个操作后一段时间内不在不行该操作
/* 使用节流去处理input触发keyup事件 */ /* 输入快的话会也不会输出多次重复结果 */ window.onload = function () { let obj = document.getelementbyid('input') let callback = inputchange() obj.addeventlistener('keyup',()=>{ let val = obj.value; callback(val) },false) } // 使用闭包保存hasdone function inputchange() { var hasdone = false return function(val){ // 如果已经执行 hasdone = true 则直接返回 if(hasdone) { return; } // 设置已经执行 console.log(val) hasdone =true /* 一段时间后设置hasdone 为能够再次执行 */ time = settimeout(() => { hasdone = false }, 2000); } }
上面的节流,第一次输入马上执行,是最后输入不执行。
还有就是第一次输入不马上执行,时间内最后执行
/* 使用节流去处理input触发keyup事件 */ /* 输入快的话会也不会输出多次重复结果 */ window.onload = function () { let obj = document.getelementbyid('input') let callback = inputchange() obj.addeventlistener('keyup',()=>{ let val = obj.value; callback(val) },false) } // 使用闭包保存hasdone /* 时间内不马上执行,时间段内只执行一次 */ function inputchange() { var hasdone = false var time = null return function(val){ // 如果已经执行 hasdone = true 则直接返回 if(hasdone) { return; } // 设置已经执行 hasdone =true /* 一段时间后设置hasdone 为能够再次执行 */ time = settimeout(() => { console.log(val) hasdone = false }, 500); } }
js 实现浏览器滚动条滚动到最下面时,加载更多数据
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>document</title> <script src="./js/fangdouhejl.js"></script> <style> .box{ height:890px; } li{ height: 60px; } .loading{ width: 80px; height: 40px; margin: 0 auto; margin-top:100px; display: none; } .loading span{ display: inline-block; width: 8px; height: 100%; border-radius: 4px; background: lightgreen; -webkit-animation: load 1s ease infinite; } @-webkit-keyframes load{ 0%,100%{ height: 40px; background: lightgreen; } 50%{ height: 70px; margin: -15px 0; background: lightblue; } } .loading span:nth-child(2){ -webkit-animation-delay:0.2s; } .loading span:nth-child(3){ -webkit-animation-delay:0.4s; } .loading span:nth-child(4){ -webkit-animation-delay:0.6s; } .loading span:nth-child(5){ -webkit-animation-delay:0.8s; } </style> </head> <body> <ul id="box"> <li>baojia1</li> <li>baojia2</li> <li>baojia3</li> <li>baojia4</li> <li>baojia5</li> <li>baojia6</li> <li>baojia7</li> <li>baojia8</li> <li>baojia9</li> <li>baojia10</li> <li>baojia11</li> <li>baojia12</li> <li>baojia13</li> <li>baojia14</li> <li>baojia15</li> <li>baojia16</li> <li>baojia17</li> <li>baojia18</li> <li>baojia19</li> <li>baojia20</li> </ul> <div class="loading" id="loading"> <span></span> <span></span> <span></span> <span></span> <span></span> </div> </body> </html>
/* 浏览器滚动事件onsroll */ /* 实现浏览器滚动到最下面实现加载 */ var loadmore = loadmoreresource (); /* 模仿滚到最下面继续加载数据 */ window.onscroll = function (e) { /* 判断是否滚到最下面 */ /* 如果已经滚到最下面则执行某个操作 */ var e =e || window.event; // 为了兼容谷歌和火狐 document.body.scrolltop是谷歌上的 /* 滚动条的垂直位置 */ var scrolltop = document.documentelement.scrolltop||document.body.scrolltop; /* 整个页面的正文高度 */ var scrollheight = document.documentelement.scrollheight||document.body.scrollheight; /* 可见区域高度 */ var clientheight = document.documentelement.clientheight||document.body.clientheight; /* 当scrolltop加clientheight 等于scrollheight */ if(scrollheight === (scrolltop+clientheight)) { loadmore(); } } /* 往下拉时加载的数据 */ /* 使用函数节流优化加载,否则会出现一次性加载很多次 */ function loadmoreresource () { let i = 21; /* 定义是否已经加载 */ let isloading = false; return function () { /* 假如已经在加载中了则直接返回 */ if(isloading) { return; } /* 出现加载动画 */ loadingimg() let obj = document.getelementbyid('box'); /* 代码片段 用于插入多个标签 */ let docfragment = document.createdocumentfragment(); for(let j=0;j<5;j++){ let li = document.createelement('li') li.append('baojia'+i) docfragment.appendchild(li) i++; } /* 设置当前加载的状态为true */ isloading = true; /* 使用settimeout 模拟从api加载数据 */ settimeout(() => { obj.appendchild(docfragment) loadingimg() /* 将加载状态设置为false */ isloading = false }, 3000); } } /* 加载动画 */ function loadingimg() { let loading = document.getelementbyid('loading'); if(loading.style.display==='block') { loading.style.display = 'none'; } else { loading.style.display = 'block'; } }