JS页面滚动

前言

JavaScript技术大发展的今天,越来越多的网页都深入使用了JavaScript技术。在做爬虫的时候,请求的页面不一定是最终的看到的效果,可能需要再浏览器中执行一些脚本才能出现我们最终看到的页面。静态爬虫就无法爬取动态生成的页面。Phantomjs是一个无界面的浏览器,可以模拟浏览器去访问,如果需要执行脚本,也有相应的接口。

Selenium 是目前用的最广泛的Web UI 自动化测试框架。selenium-java是selenium的一个java包,相关知识可以自行百度。selenium-java可以支持日常使用的几乎所有类型的浏览器,另外,还支持Phantomjs和htmlunit。以Phantomjs为例,说一下自己的使用情况。

使用Phantomjs解析页面的目的是预测到页面需要运行脚本,才能获取HTML源码的情况。如果是静态页面当然也可以用Phantomjs,但是访问速度不如其他工具。

Phantomjs解析动态页面一般要触发页面事件才能执行脚本,我遇到的情况跟微博访问的情况类似,需要不断的页面滚动才能不断的拿到数据。

代码示例

自己的一段简单的代码

var i=0;
var interval = window.setInterval(function(){
    i=i+768;
    window.scrollTo(0,i);
    if(i >= document.body.scrollHeight){
        btn = document.querySelector("XXX");
        if(btn)
            btn.click();
        else {
            clearInterval(interval);
            setTimeout(function(){
                window.scrollTo(0,document.body.scrollHeight);
            },1000);
        }
    }
},1500);

使用selenium-java的Phantomjs接口,直接运行上边的脚本,基本保证能滚动到页面底部,因为有的页面当滚动过快或者网站某些机制会在滚动到底部之前出现一个按钮,在上面配置上就可以了。

另一段代码

下面的一点代码是UI 测试之:保证页面滚动到底部提供的。

/**
 * 保证页面滚动到底部
 */
function scrollToBottom (callback) {

    var TIMES = 10  // 最多滚动10次,防止无限加载
        , INTERVAL = 600  // 每次滚动之间的间隔时间,太短有可能不会触发懒加载事件
        , delta = 1500    // 每次的滚动距离,太长有可能导致之间有的部分未加载
        , preScrollTop = 0  // 滚动前的 window.scrollTop 值
        , curScrollTOp = 0;  // 滚动后的 window.scrollTop 值

    var scroll = function () {
        preScrollTop = $(window).scrollTop();
        TIMES --;
        $(window).scrollTop(preScrollTop + delta);
    };

    scroll();

    var timer = setInterval(function () {

        curScrollTOp = $(window).scrollTop();

        if (TIMES <= 0 || (curScrollTOp - preScrollTop) <= 3 ) {
            // 滚动结束
            clearInterval(timer);
            return callback();
        }

        scroll();

    }, INTERVAL);

}

使用这段代码的话,需要显式的调用函数,才会触发页面执行动作。

PS:如果一个动态页面,不需要滚动,但需要触发一下,才能获得源码,可以执行一句永远不会出错的脚本,比如document.getElementsByTagName('html')[0]

参考

UI 测试之:保证页面滚动到底部

<think>嗯,用户想要了解如何使用JavaScript将页面滚动滚动到顶部的方法。根据用户给出的参考材料,确实有三种解决方案可以参考。 用户引用的资料[1]直接提到了三种JS实现滚动条回顶部的方案:第一种是通过设置document.body.scrollTop和document.documentElement.scrollTop为0;第二种是使用scrollTo(0,0)方法;第三种是通过location.href='#'实现但不太推荐。用户特别提到想查找JavaScript的实现方法,说明ta需要的是纯前端解决方案。 另外参考资料[3]提到了在Vue框架中的解决方法,用户当前问题虽然没有提到框架,但考虑到现代前端开发环境,可能需要补充框架适配的建议。资料[4]则提到滚动动画的性能问题,这个可以作为优化点提供给用户。 考虑到实际应用场景,用户可能需要这个功能用于"返回顶部"按钮的实现。因此除了基础方法外,还应该提供平滑滚动的优化方案,以及不同浏览器的兼容性处理建议。资料[1]已经指出document.body.scrollTop和document.documentElement.scrollTop需要同时设置,这是因为不同浏览器的兼容性差异。 在回答组织上,应该先给出最基础的即时滚动方案,然后是平滑滚动方案,最后补充框架适配建议。对于即时滚动方案,要特别强调兼容性写法;对于平滑滚动方案,则需要提醒用户注意性能问题,尤其是移动端设备上的表现。 </think>以下是几种常见的JavaScript实现页面滚动滚动到顶部的方法: --- ### 一、基础方法(即时滚动) 1. **直接设置`scrollTop`属性** 同时设置`body`和`documentElement`确保兼容性: ```javascript document.documentElement.scrollTop = 0; // 现代浏览器 document.body.scrollTop = 0; // 旧版兼容 ``` 2. **使用`scrollTo()`方法** 直接指定坐标: ```javascript window.scrollTo(0, 0); ``` --- ### 二、平滑滚动(带动画) 推荐使用`behavior: 'smooth'`,兼容主流浏览器: ```javascript window.scrollTo({ top: 0, behavior: 'smooth' // 启用平滑滚动 }); ``` **替代方案**(兼容旧版浏览器): ```javascript function scrollToTopSmooth() { const scrollStep = -window.scrollY / 15; const scrollInterval = setInterval(() => { if (window.scrollY <= 0) clearInterval(scrollInterval); window.scrollBy(0, scrollStep); }, 15); } scrollToTopSmooth(); ``` --- ### 三、框架场景适配 1. **Vue中页面切换后滚动到顶部** 在路由守卫中实现: ```javascript // router.js router.afterEach(() => { window.scrollTo(0, 0); }); ``` 2. **React中使用`useEffect`** 在目标组件挂载时执行: ```jsx useEffect(() => { window.scrollTo(0, 0); }, []); ``` --- ### 注意事项 1. **浏览器兼容性** - `behavior: 'smooth'` 在IE不支持,需自行实现动画逻辑[^1]。 - 同时设置`body`和`documentElement`的`scrollTop`可覆盖新旧浏览器[^1]。 2. **性能优化** - 避免在滚动事件中频繁触发滚动操作(如监听滚动显示“返回顶部”按钮时需节流)[^4]。 --- ### 相关问题 1. 如何实现滚动页面指定元素位置而非顶部? 2. 滚动动画性能较差时有哪些优化方案? 3. 在移动端实现平滑滚动有哪些注意事项? 4. 如何监听滚动事件动态显示/隐藏“返回顶部”按钮? [^1]: 引用[1] [^3]: 引用[3] [^4]: 引用[4]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值