原生js监听页面滚动事件

举报
yd_47669746 发表于 2026/11/01 00:44:34 2026/11/01
【摘要】 我们在做项目时不免会遇到列表,列表中会有分页的请求。在移动端的列表的加载中,当然如果使用 ui 框架就另当别论。这次在做 vue 移动端的项目时有一个场景是列表上拉加载数据,这种情况肯定是在 mounted 中给 window 加上一个滚动监听,记住这里要提前定义好 this 如果你有用到 this 的话,因为监听也算是异步操作,没有提前定义的话会报错。mounted () { thi...

我们在做项目时不免会遇到列表,列表中会有分页的请求。

在移动端的列表的加载中,当然如果使用 ui 框架就另当别论。

这次在做 vue 移动端的项目时有一个场景是列表上拉加载数据,这种情况肯定是在 mounted 中给 window 加上一个滚动监听,

记住这里要提前定义好 this 如果你有用到 this 的话,因为监听也算是异步操作,没有提前定义的话会报错。

mounted () {
    this.initList()
    var that = this
    window.addEventListener("scroll", function () {
        if(document.body.scrollHeight <= window.screen.height + document.body.scrollTop){
            if (that.noMore) {
                return
            }
            if (that.initOver) {
                that.initList()
            }
        }
    })
},

当页面滚动到底部即程序走到if判断中执行数据请求。

这里我在做项目的过程中有多次用到滚动监听,有意思的是有的地方成功了有的地方失败了。

原因是不同浏览器获取页面滚动距离的方法不一样。

总结了以下三种

(window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop)

虽然不知道分别对应什么浏览器但是只要向上面的代码一样直接写上去就 ok 了,函数会找有值的那个进行计算。

还有

在你从列表页跳转到写一页的时候,上一个列表页的页面滚动监听事件还是存在的,当你在下一个页面拉到底部的时候还会继续监听上一个页面的滚动监听。

那么既然在离开页面后依然存在那我们就在离开的时候这个监听事件去掉就行了。

在beforeDestroy中通过个removeEventListener这个方法去掉

beforeDestroy(){
  var that = this
  window.removeEventListener('scroll', that.scroll);//监听页面滚动事件
},

这里我们要封装一下滚动到底部触发的方法。在 method 中

methods: {
    scroll: function () {
        var that = this
        if (document.body.scrollHeight <= window.screen.height + document.body.scrollTop) {
            if (that.noMore) {
                return
            }
            if (that.initOver) {
                that.init(2)
            }
        }
    },
}

那么mounted中的滚动监听就要写成

mounted: function () {
  this.init(0)
  var that = this
  window.addEventListener("scroll", that.scroll)
},

removeEventListener后面跟的应该是函数名不能加括号(我也不知道为什么)但是直接写函数却是可以的

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。