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 相关文章推荐
jquery控制listbox中项的移动并排序
Nov 12 Javascript
javascript中的数字与字符串相加实例分析
Aug 14 Javascript
jQuery使用之设置元素样式用法实例
Jan 19 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
Sep 04 Javascript
javascript 小数乘法结果错误的处理方法
Jul 28 Javascript
js仿小米官网图片轮播特效
Sep 29 Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 Javascript
vue项目实战总结篇
Feb 11 Javascript
vux uploader 图片上传组件的安装使用方法
May 15 Javascript
vue2.0 实现导航守卫的具体用法(路由守卫)
May 17 Javascript
vue从零实现一个消息通知组件的方法详解
Mar 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生成带有雪花背景的验证码
2008/09/28 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
Yii2 assets清除缓存的方法
2016/05/16 PHP
php阳历转农历优化版
2016/08/08 PHP
ExtJS 工具栏 分页事件参数
2010/03/05 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
JavaScript DOM节点添加示例
2014/07/16 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
2019/03/05 Javascript
vue+elementUI动态生成面包屑导航教程
2019/11/04 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
python调用xlsxwriter创建xlsx的方法
2018/05/03 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
python实现二维数组的对角线遍历
2019/03/02 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
编码实现字符串转整型的函数
2012/06/02 面试题
五一服装活动方案
2014/01/11 职场文书
毕业生写求职信的要点
2014/03/04 职场文书
校园环保建议书
2014/05/14 职场文书
投资入股合作协议书
2014/10/28 职场文书
房贷收入证明范本
2015/06/12 职场文书
告知书格式
2015/07/01 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
宪法宣传标语100条
2019/10/15 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang