js检测页面上一个元素是否已经滚动到了屏幕的可视区域内

时间: 2018-07-26阅读: 2314标签: js知识

应用场景:

只要页面加载了,其中在页面中出现的li就向控制台输出第几个发送请求;在本次加载的页面中,再将滚动条滚回前边的li,不再向控制台输出东西,也就是说已经显示过的li,不再向控制台输出东西。

  1. <body>
  2. <ul>
  3. <li onclick="jumpOther()">0001</li>
  4. <li>0002</li>
  5. <li>0003</li>
  6. <li>0004</li>
  7. <li>0005</li>
  8. <li>0006</li>
  9. <li>0007</li>
  10. <li>0008</li>
  11. <li>0009</li>
  12. <li>00010</li>
  13. <li>00011</li>
  14. <li>00012</li>
  15. <li>00013</li>
  16. <li>00014</li>
  17. <li>00015</li>
  18. <li>00016</li>
  19. <li>00017</li>
  20. <li>00018</li>
  21. <li>00019</li>
  22. <li>00020</li>
  23. <li class="ts">00021</li>
  24. <li>00022</li>
  25. </ul>
  26. </body>


思路一:

定义了一个全局变量lastItem,用来记下最后显示的li的index;如此,当li的index>lastItem,就表示li还没展示过,能输出东西。

  1. <script type="text/JavaScript">
  2. var lastItem=0;
  3. $(document).ready(function () {
  4. sendAsk();
  5. window.addEventListener("scroll",function(e){
  6. sendAsk();
  7. });
  8. });
  9. function sendAsk(){
  10. var lis= $('ul').find("li");
  11. //swHeight=滚动的高度+窗体的高度;当li的offset高度<=swHeight,那么说明当前li显示在可视区域了
  12. var swHeight=$(window).scrollTop()+$(window).height();
  13. $.each(lis, function (index, item) {
  14. mTop=item.offsetTop;
  15. var dItem=index+1;
  16. if(mTop<swHeight&&dItem>lastItem){
  17. console.log(index+1+"个发送请求 ");
  18. lastItem+=1;
  19. }
  20. });
  21. }
  22. </script>


思路二:

给每个li动态添加一个属性,用来表示这个li是否显示过;在发送请求后,设置属性为true即可;未显示过不添加属性即可。

  1. function sendAsk() {
  2. var lis= $('ul').find("li");
  3. //swHeight=滚动的高度+窗体的高度;当li的offset高度<=swHeight,那么说明当前li显示在可视区域了
  4. var swHeight=$(window).scrollTop()+$(window).height();
  5. $.each(lis, function (index, item) {
  6. mTop=item.offsetTop;
  7. if(mTop<swHeight&&!item.getAttribute("data-send")){
  8. console.log(index+1+"个发送请求 ");
  9. item.setAttribute("data-send","true");
  10. }
  11. });
  12. }


思路三:

利用getBoundingClientRect()方法,只要其中的.top<=可视区域的高度即可

  1. function sendAsk(){
  2. var lis= $('ul').find("li");
  3. //swHeight=滚动的高度+窗体的高度;当li的offset高度<=swHeight,那么说明当前li显示在可视区域了
  4. var swHeight=$(window).height();
  5. $.each(lis, function (index, item) {
  6. mTop=item.getBoundingClientRect().top;
  7. console.log(mTop);
  8. if(mTop<=swHeight){
  9. console.log(index+1+"个发送请求 ");
  10. }
  11. });
  12. }

拓展:

getBoundingClientRect() https://www.cnblogs.com/Songyc/p/4458570.html

来源:https://blog.csdn.net/yingzizizizizizzz/article/details/81205602


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

2.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/955

关闭

JavaScript中的循环和作用域

JavaScript有一个特点,也许会让开发者头痛, 是与循环和作用域相关的.const。最简单的方案是用 let 声明、另外一个非常普遍的解决这个问题是使用pre-ES6代码, 同时它被称作即时调用函数表达式(IIFE)

JavaScript中变量提升和函数提升的意义理解

在ES6之前,Js中是没有块级作用域的,只存在全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分;函数提升只有函数声明中才发生。

适配器在JavaScript中的体现

适配器设计模式在JavaScript中非常有用,在处理跨浏览器兼容问题、整合多个第三方SDK的调用,都可以看到它的身影。适配器模式是一种软件设计模式,允许从另一个接口使用现有类的接口。它通常用于使现有的类与其他类一起工作,而无需修改其源代码。

你所忽略的js隐式转换

你有没有在面试中遇到特别奇葩的js隐形转换的面试题,第一反应是怎么会是这样呢?难以自信,js到底是怎么去计算得到结果,你是否有深入去了解其原理呢?下面将深入讲解其实现原理。

javascript的Object. hasOwnProperty方法

hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中(非继承属性)是否具有指定的属性,如果 object 具有带指定名称的属性,则 hasOwnProperty 方法返回 true,否则返回 false。

JavaScript中的魔幻代理Proxy

什么是 JavaScript 代理?通过 Proxy 我们可以拦截并改变一个对象的几乎所有的根本操作,包括但不限于属性查找、赋值、枚举、函数调用等等。利用 Proxy,我们可以拦截并不存在的属性的读取

JS中for循环的常见题型

for循环示例;让用户输入行数,使用for循环嵌套打出倒着的星星出来,行数等于用户输入的数字 ;有1,2,3,4这么4个数,能组成多少个互不相同且不含有重复数字的三位数?都是多少?

js中void 0 与 undefined

偶然看到一个问题:为什么有的编程规范要求用 void 0 代替 undefined?如果不知道这个答案的小伙伴,第一反应就要问void 0是什么鬼?

原生js实现数组随机排列(数组乱序)的方法.【快速洗牌算法】

在开发中遇到这样的问题,需要将一组已知数组的顺序打乱,按照以前和现在的做法,总结了以下方法。

Javascript实现模仿接口的3种方式

Javascript模仿接口可以有三种方式:1.注释法,此方法属于程序文档范畴,对接口的继承实现完全依靠程序员自觉 2.检查属性法,把要实现的接口方法添加到类属性列表里,通过定义好的检测反复检查是否已经实现了那些方法 3.鸭式辨形法

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!