在包含图片的页面中正确使用iScroll

背景

iScroll初始化依赖DOM的高度计算,必须等DOM完全渲染好后才能使用iScroll。最近项目中有个页面需要使用iScroll,但是这个页面中包含许多图片,并且图片的高度是不定的,如果DOM ready后就去初始化iScroll肯定是有问题的(因为图片可能还没全部显示,DOM高度还没完全确定)。必须等所有图片加载完才初始化iScroll。

解决方案

知道问题所在之后接着就去找解决方案了,千万不要使用setTimeout设置个延时,然后才去初始化iScroll。

PS:项目中已经使用了zepto的Defered,underscore

// util.js 加载图片
function loadImg(src) {
    var deferred = Deferred(), // zeptojs Deferred
        img = new Image();
     img.src = src;
     // 图片加载完就resolve,不care是否成功
     img.onload = complete;
     img.onerror = complete;
     img.onabort = complete;
     function complete() {
         deferred.resolve();
     }

    return deferred.promise();
}

// 实现个简单的图片加载完再初始化iScroll函数
function lazyInitIScroll(wrap) {
    var $wrap = _.isString(wrap) ? $(wrap): wrap, // zeptojs
        $imgs = $wrap.find(‘img‘),
        imgPromises = _.map($imgs, function(img){ // underscore
            return loadImg(img.src);// 调用loadImg方法
        });
    // 强化下,如果没有图片,也得兼容
    if(imgPromises.length === 0) {
        imgPromises.push(function(){
            var deferred = Deferred(); // zeptojs Deferred
            deferred.resolve();
            return deferred.promise();
        })
    }
    $.when.apply(null, imgPromises).then(function(){
        new IScroll($wrap[0]); // 图片加载完了再初始化iScroll
    });
}

OK,就这样。如果想返回初始化的iScroll对象,则可以改进下lazyInitIScroll函数:

// 实现个简单的图片加载完再初始化iScroll函数V2
function lazyInitIScroll(wrap) {
    var deferred = Deferred(),
        $wrap = _.isString(wrap) ? $(wrap): wrap, // zeptojs
        $imgs = $wrap.find(‘img‘),
        imgPromises = _.map($imgs, function(img){ // underscore
            return loadImg(img.src);// 调用loadImg方法
        });
    // 强化下,如果没有图片,也得兼容
    if(imgPromises.length === 0) {
        imgPromises.push(function(){
            var deferred = Deferred(); // zeptojs Deferred
            deferred.resolve();
            return deferred.promise();
        })
    }
    $.when.apply(null, imgPromises).then(function(){
        deferred.resolve(new IScroll($wrap[0]));// 图片加载完了再初始化iScroll
    });
    return deferred.promise();
}

原文地址:https://www.cnblogs.com/homehtml/p/12221790.html

时间: 2024-08-01 17:24:40

在包含图片的页面中正确使用iScroll的相关文章

图片在页面中处理的方法

var w=$(".img li i").width(); //获取图片承载容器的宽度$(".img li i").height(w*0.618); //设置图片承载容器的高度 $(window).resize(function(){ //浏览器窗口大小改变时重新获取图片承载容器的宽度.设置其高度 var w=$(".img li i").width(); $(".img li i").height(w*0.618);});

从服务器中读取图片至页面中

图片的数据数据库中存储: else if ("/cake/getImg.do".equals(req.getServletPath())) { String idStr = req.getParameter("id"); Cake cake = cakeService.getCakeImg(Long.valueOf(idStr)); //通过Mybatis获取图片的数据,封装在cake这个类中 try { resp.setContentType("mult

图片在页面中居中显示

参考1:http://www.lanrentuku.com:8081/js/table-188.html# 参考2:http://www.cnblogs.com/xueming/archive/2012/03/21/VerticalAlign.html http://files.cnblogs.com/files/zfanlong1314/%E5%9B%BE%E7%89%87%E5%9C%A8%E9%A1%B5%E9%9D%A2%E4%B8%AD%E5%B1%85%E4%B8%AD%E6%98%

在页面中旋转的图片效果

1.概述 在一些交易平台网站,如淘宝网.拍拍网等,经常会发现一些图片以圈的形状旋转的效果,如此反复的执行. 2.技术要点 主要应用了Math对象的sin(返回数的正弦值)和cos(返回数的余弦值),通过取得正弦值和余弦值然后加一些算法来改变当前层的位置,使图片在页面中旋转. 3.具体实现 (1)本例利用javaScript的Math对象的正弦和余弦值来改变当前层的位置,代码如下: <script language="javascript"> var x1=200; var

jsp页面中引用其他页面的方法

初看这个标题....大家的感觉一定是好2啊.....博主一定要说jsp的动态引用(jsp:include)和静态引用(@include)了.介绍这两者区别的文章已经烂大街了..一搜一大把..博主竟然还来介绍这些老古董..果断alt+F4... 如果你确实是这么想的...那请先别急着关闭页面...今天我来分享一下自己的理解,算是对烂大街的东西的一点补充吧...(后面文字会比较啰嗦) 首先先说明下为什么会去讨论这个话题. 我在写自己的博客程序的时候(blogv2.labofjet.com),程序中的

隐藏的图片在浏览器中的请求

图片在页面中一般会以两种形式出现:img元素或者背景图片. 那么在img或者使用背景图片的元素被隐藏之后,页面加载的时候浏览器会不会发送http请求加载图片呢? 注:隐藏分为两种情况(display:none)和(visibility:hidden) 接下来就对两种情况下不同浏览器的请求情况坐下对比 ①.display:none的情况 ②.visibility: hidden的情况 隐藏的图片在浏览器中的请求

web页面中可以包含多个对象

# encoding=utf-8 #python 2.7.10 #xiaodeng #web页面中可以包含多个对象 #HTTP权威指南 10页 #应用程序完成一项任务时通常会发布多个http事务.如:web浏览器会发布一系列http事务来获取一个包含了丰富的图片的web页面. #http事务怎么运作呢? 1.执行一个事务来获取描述页面布局的html框架 2.然后发布另外的http事务来获取嵌入的图片.图像.java小程序.这些资源可能在不同的服务器上. 因此: 一个web页面不是单个资源,通常是

移动设备的HTML页面中图片实现滚动加载

如今移动互联网风靡全球,移动页面的元素也是丰富多彩,一个移动页面的图片超过10张已经是再正常不过的事情了.但是相对,很多移动用户还停留在2G,3G这样的网络中.那么这样带宽的用户,在浏览这样的页面时,要把页面加载完毕,可能就需要10s,20s甚至更多,严重影响用户的体验.针对这样的问题,让页面中的图片滚动加载(图片出现在显示器屏幕上时再加载图片)显得非常重要!这样也可以有效地节省我们服务器的带宽和解决请求大并发的问题. 1.效果图.     这是加载过程中的图片菊花显示            

如何去除AJAX收到数据中包含的html页面数据

问题: 如下代码所示,我用AJAX收到来自url: 'kzkj_check.jsp',返回的数据msg,总是包含页面的html数据,可是我只想要我返回的数据“false”, $.ajax({ url: 'kzkj_check.jsp', async:false, data: 'un='+ $('#userName').val() +'&pw=' + $('#passWord').val(), type: "get", success: function(msg){ if(msg