JavaScript仿淘宝页面图片滚动加载及刷新回顶部的方法解析


Posted in Javascript onMay 24, 2016

淘宝图片处理讨论
淘宝网页面很大,但是打开速度很快。其对图片处理是运用了滚动加载,就是滚动轴滚到哪里,图片在哪里加载。但是你想查看他的源代码,那要费九牛二虎之力吧,因为他们代码压缩合并做的很好!因为图片是滚动加载的,初始化的时候图片不加载,那么当你在页面底部刷新页面的时候,底部的页面通常不会加载出来,淘宝网的做法貌似是(因为我没有看他们的源代码,只是凭操作),刷新让页面回到顶部。

模仿淘宝,做滚动图片加载
这里想到了三种方法:
1.javascript懒加载之可视区域加载

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>haorooms前端博客-可视区域加载之 javascript</title>
  <style>
  img{width:100%;margin-bottom: 30px; min-height: 400px; background-color: #ddd;}

  </style>
</head>
<body>
  <img haoroomslazyload="Chrysanthemum.jpg" src="" >
  <img haoroomslazyload="Desert.jpg" src="" >
  <img haoroomslazyload="Hydrangeas.jpg" src="" >
  <img haoroomslazyload="Koala.jpg" src="" >
  <img haoroomslazyload="Lighthouse.jpg" src="" >
  <img haoroomslazyload="Penguins.jpg" src="" >
  <img haoroomslazyload="Tulips.jpg" src="" >
  <script>
  var imgNum=document.getElementsByTagName('img').length;
  var imgObj=document.getElementsByTagName("img");
  var l=0;

    window.onscroll=function(){
        var seeHeight = document.documentElement.clientHeight;
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        for(var i=l;i<imgNum;i++){
          if(imgObj[i].offsetTop < seeHeight + scrollTop){
            console.log(imgObj[i].getAttribute("src"));
            console.log(imgObj[i].src );
            if(imgObj[i].getAttribute("src") == ""){
              imgObj[i].src = imgObj[i].getAttribute("haoroomslazyload");
            }
          }
          if(imgObj[i].offsetTop > seeHeight + scrollTop){
            l=i;
            break;
          }
        }
    }

</script>

大家注意看我的两个console输出,console.log(imgObj[i].src );获取的是整个浏览器地址!
2.jquery懒加载之可视区域加载
上面的js用jquery翻译版!

var l=0
//js方法翻译版
$(window).bind("scroll", function(event){

        for(var i=l;i<$("img").length;i++){
          if($("img").eq(i).offset().top < parseInt($(window).height()) + parseInt($(window).scrollTop())){
            if($("img").eq(i).attr("src") == ""){
              var lazyloadsrc=$('img').eq(i).attr("haoroomslazyload");
              $("img").eq(i).attr("src",lazyloadsrc);
            }
          }
          if($("img").eq(i).offset().top > parseInt($(window).height()) + parseInt($(window).scrollTop())){
            l=i;
            break;
          }
        }

 });

3.可视区域加载延伸
例如一个动画效果,或者一个canvas图片,我想达到的效果是,初始进来不加载,当滚动到这个动画或者图表上面的时候,进行加载,那么我们就可以根据上面的代码进行如下改进:

$(window).bind("scroll", function(event){

     //窗口的高度+看不见的顶部的高度=屏幕低部距离最顶部的高度 
      var thisButtomTop = parseInt($(window).height()) + parseInt($(window).scrollTop()); 
      var thisTop = parseInt($(window).scrollTop()); //屏幕顶部距离最顶部的高度 
        var PictureTop = parseInt($("你的要滚动加载的ID").offset().top); 
         if (PictureTop >= thisTop && PictureTop <= thisButtomTop) {
         // $("#你的要滚动加载的ID").attr("src", $("#你的要滚动加载的ID").attr("haoroomslazyload")); 

          //此处可以执行你的加载函数,加载函数由原来的document.ready中,移到这里来!



         }
})

刷新回顶部
当我们做了可视区域加载的时候,通常让其刷新回到顶部。像淘宝那样。刷新回顶部。
我不知道淘宝网是如何做的。刷新回顶部,我用到的是onbeforeunload 事件。
onbeforeunload与onunload事件,onunload和onbeforeunload都是在刷新或关闭时调用,可以在< script>脚本中通过window.onunload来指定或者在< body>里指定。区别在于onbeforeunload在onunload之前执行,它还可以阻止onunload的执行。
Onbeforeunload也是在页面刷新或关闭时调用,Onbeforeunload是正要去服务器读取新的页面时调用,此时还没开始读取;而onunload则已经从服务器上读到了需要加载的新的页面,在即将替换掉当前页面时调用。Onunload是无法阻止页面的更新和关闭的。而 Onbeforeunload 可以做到。
1.页面加载时只执行onload
2.页面关闭时先执行onbeforeunload,最后onunload
3.页面刷新时先执行onbeforeunload,然后onunload,最后onload。
刷新回顶部就是用这个事件,可以这么写。

window.onbeforeunload  =  function(){$(window).scrollTop(0);}

当网站所有的图片都用了可是区域加载,css和js都合并压缩了,那我们的网站速度和性能会提升很多!
假如你想做成淘宝那样,你可以改进一下代码。
其实延迟加载的思路就是先把图片放在一个data-src或者一个属性中,当页面滑动到可视区域内时,把存起来的图片地址赋值给src就可以了。
这里我就不罗列代码了。

Javascript 相关文章推荐
js中return false(阻止)的用法
Aug 14 Javascript
js清除input中type等于file的值域(示例代码)
Dec 24 Javascript
基于javascript显示当前时间以及倒计时功能
Mar 18 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
Vue+SpringBoot开发V部落博客管理平台
Dec 27 Javascript
es6新特性之 class 基本用法解析
May 05 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
详细分析JavaScript中的深浅拷贝
Sep 17 Javascript
js实现购物车商品数量加减
Sep 21 Javascript
详解Vue的异步更新实现原理
Dec 22 Vue.js
基于angular实现树形二级表格
Oct 16 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 #Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 #Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 #Javascript
页面向下滚动ajax获取数据的实现方法(兼容手机)
May 24 #Javascript
JQuery点击事件回到页面顶部效果的实现代码
May 24 #Javascript
JavaScript中判断数据类型的方法总结
May 24 #Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 #Javascript
You might like
PHP 输出简单动态WAP页面
2009/06/09 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
2013/04/23 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
微信小程序中button组件的边框设置的实例详解
2017/09/27 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
Python中处理unchecked未捕获异常实例
2015/01/17 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
用python编写第一个IDA插件的实例
2018/05/29 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
python科学计算之scipy——optimize用法
2019/11/25 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
老教师工作总结的自我评价
2013/09/27 职场文书
人事助理岗位职责
2013/11/18 职场文书
大学生秋游活动方案
2014/02/17 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
医院见习报告范文
2014/11/03 职场文书
民事和解协议书格式
2014/11/29 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
电影雷锋观后感
2015/06/10 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python