这里remove addeventlistener可以替换吗

这里remove addeventlistener可以替换吗

如题,感觉也是怕scroll事件反复触发才设置的移除事件监听,那我想之前学的那个cklearTimeout的方法应该这里也行的通把。

var timer = null;

window.addEventListener('scroll',function(){

cleartimer(timer);

timer = setTimeout(function(){

if(isInVisibleArea(document.getElementById('lazyloading'))){

var script = document.createElemnet('script');

setTimeout(function(){

script.src = 'js/loadproduct.js';

},1000);

document.body.appendChild(script);

}}

},100),false)

不知道这样行不行

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,问题解答如下:

1.同学忽略了一个判断条件,如下:


http://img1.sycdn.imooc.com//climg/5ef71101092422f610270468.jpg

div#product是页面最底部的一个元素,当页面还没有滚动到底部时,rect.top < window.innerHeight(元素到视口顶部的距离<窗口的高度)这个条件是不成立的。也就是说,只有滚动到底部,条件成立才会执行,所以不会产生同学所说的多次执行。而上个老师说的是setTimeout每次触发只会执行一次,这里只触发一次,所以可以不加清除定时器。

可以自己测试一下,加一个输出,在控制台中也会测试出来只执行了一次。

http://img1.sycdn.imooc.com//climg/5ef712aa090dcd2f07490097.jpg

http://img1.sycdn.imooc.com//climg/5ef712d4096b5f5502740075.jpg


2.同学看错了,粘贴的代码不是加载图片,是加载了一个js文件,即loadProduct.js,同一个js文件只加载一次即可,不需要重复加载。所以加载完直接移除。

同学可以下载源码看一下,在前面有一段代码是加载图片的。这里和同学的想法是一样的,使用了定时器,且不能移除事件,因为后面的图片还需要继续执行它。再重新理解一下哦http://img1.sycdn.imooc.com//climg/5ef7137609d32af107650253.jpg

祝学习愉快~


好帮手慕码 2020-06-25 19:04:12

同学你好,removeEventListener是保证这个方法不要多次触发,只执行一次:

http://img1.sycdn.imooc.com//climg/5ef477ea09c7ee2c05110300.jpg

同学的代码中使用了setTimeout,这个也是执行一次的,不是反复执行的( 重复执行可以使用 setInterval() 方法),所以不需要使用 clearTimeout去清除这个定时器!

同学可以再理解一下, 祝学习愉快~

  • 提问者 慕雪9296518 #1
    谁说setTimeout就是只执行一次的,不是延迟执行吗?每次触发都执行一次,所以要cleartimeout,我这样说是哪里理解错了吗?还有就是remove了之后下面要加载的图片不就没得触发loadproduct函数了??
    2020-06-26 15:26:21
好帮手慕码 2020-06-25 10:43:13

同学你好,你的思路是正确的,removeEventListener可以被替换,但是代码中问题很多,如下:

1、setTimeout只执行一次,所以不需要清除定时器了,而且定时器单词写错:

http://img1.sycdn.imooc.com//climg/5ef40ebe09162ae903030071.jpg

2、创建节点单词写错:

http://img1.sycdn.imooc.com//climg/5ef40ee80949f37005740068.jpg

3、括号嵌套错误,整体修改如下:

http://img1.sycdn.imooc.com//climg/5ef40f120905eb4008460427.jpg

祝学习愉快~


  • 提问者 慕雪9296518 #1
    这里为什么不需要清楚定时器啊,清除定时器不就是为了下午中不会无限次触发嘛?原本清除定时器的工作相当于是removeEventListener做的,这里1000毫秒是为了延迟加载js而不是防止重复触发。 相当于是当scroll触发时清除计时器,也就是连续下拉时候不会多次触发,100毫秒倒数,在这100毫秒中如果再次下拉,就不触发product的检验事件,当最后一下是坐落在可视范围内。如果满足了加载图片的条件,延迟1000毫秒后加载js加载图片。好像有点乱了,原本remove的意义是什么?如果移除了事件,那滚到下一个需要加载图片的位置不就没法触发了嘛
    2020-06-25 17:56:20
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师