backgroundiScroll来初始化依赖于DOM的高度计算。在使用iScroll之前,您必须等待DOM完全呈现。最近做项目有一个页面需要用到iScroll,但是这个页面包含很多图片,图片的高度不确定。如果DOM准备好初始化iScroll,那肯定有问题(因为图片可能还没有全部显示出来,DOM的高度还没有完全确定)。在初始化iScroll之前,您必须等到所有图像都加载完毕。解决方案知道问题后,再去寻找解决方案。在初始化iScroll之前,切勿使用setTimeout设置延迟。PS:Zepto的Deferred,underscore//util.js在项目中已经被用来加载图片functionloadImg(src){vardeferred=Deferred(),//zeptojsDeferredimg=newImage();img.src=源代码;//图片加载完成后会解析,不关心是否成功img.onload=complete;img.onerror=完成;img.onabort=完成;函数完成(){deferred.resolve();}returndeferred.promise();}//实现一个简单的图片加载然后初始化iScroll函数functionlazyInitIScroll(wrap){var$wrap=_.isString(wrap)?$(wrap):wrap,//zeptojs$imgs=$wrap.find('img'),imgPromises=_.map($imgs,function(img){//下划线returnloadImg(img.src);//调用loadImg方法});//增强,如果没有图片,必须兼容if(imgPromises.length===0){imgPromises.push(function(){vardeferred=Deferred();//zeptojsDeferreddeferred.resolve();返回deferred.promise();})}$.when.apply(null,imgPromises).then(function(){newIScroll($wrap[0]);//加载图片后初始化iScroll});}OK,所以如果想返回初始化的iScroll对象,可以改进lazyInitIScroll函数://实现一个简单的图片加载然后初始化iScroll函数V2functionlazyInitIScroll(wrap){vardeferred=Deferred(),$wrap=_.isString(wrap)?$(wrap):wrap,//zeptojs$imgs=$wrap.find('img'),imgPromises=_.map($imgs,function(img){//下划线returnloadImg(img.src);//调用loadImg方法});//增强,如果没有图片,必须兼容if(imgPromises.length===0){imgPromises.push(function(){vardeferred=Deferred();//zeptojsDeferreddeferred.resolve();returndeferred.promise();})}$.when.apply(null,imgPromises).then(function(){deferred.resolve(newIScroll($wrap[0]));//image后初始化iScroll加载});返回deferred.promise();}
