PhotoSwipe异步动态加载图片方法


Posted in Javascript onAugust 25, 2016

在开发搜房家居M站的时候,搜房家居装修效果图相册展示效果需要用到PhotoSwipe插件来显示图片。
特点:
1. 家居提供的接口,每次只能获取一张图片
2. 装修效果图的张数不限。
3. 从PhotoSwipe用法来看,在PhotoSwipe初始化前必须把所有图片列出。
 instance = PhotoSwipe.attach( window.document.querySelectorAll('#Gallery a'), options ); 

标签a是PhotoSwipe初始化前的, 之后再往Gallery里动态添加是无效的。 

目前的方案是先调用10次接口,列出10张图片,当展示完这10张图片后,通过网址跳转到下一页,展示下一组的10个图片。 

这种方案的优点
1. 容易实现。
缺点也很是明显:
1. 每次跳转到下一页都会让用户等待比较长的时间。(10次调用接口的时间+当前图片下载到客户端的时间+其他时间)
2. 在图片左右滑动的过程中,突然再来年页面跳转也影响了用户体验。
如何优化PhotoSwipe实现不分页不跳转。
用过PhotoSwipe的人都应该了解PhotoSwipe.EventTypes.onDisplayImage。每次显示一个图片都会触发这个事件,

instance.addEventHandler(PhotoSwipe.EventTypes.onDisplayImage, function(e){
  //在这里实现一些代码功能。
 });

通过研究发现通过e.target.cache.images可以访问所以展示的图片对象集合。这样思路就比较清晰了—“先定义足够的a占位,然后在图片滑动显示的过程中不断地通过AJAX逐个获取图片的地址,然后赋值e.target.cache.images图片集合中的相应图片。” 

下面代码是这个思路方法的实现(为了方便说明这个思路,略去了其中额外细节) 

<ul id="Gallery" style="display:none;">
<!-- 下面10个是一开始通过接口获取到的图片 -->
<li><a href="viewimage/zxb/2014_06/30/82/86/pic/000711232400/800x800.jpg"></a></li>
<li><a href="viewimage/zxb/2014_04/18/31/94/pic/000664552500/800x800.jpg"></a></li>
<li><a href="viewimage/zxb/2014_06/14/69/65/pic/002962064200/800x800.jpg"></a></li>
<li><a href="viewimage/zxb/2014_06/05/75/33/pic/005426525600/800x800.png"></a></li>
<li><a href="viewimage/zxb/2014_02/12/13/15/pic/007331476000/800x800.jpg"></a></li>
<li><a href="viewimage/zxb/2014_05/06/44/99/pic/004717983300/800x800.jpg"></a></li>
<!-- 以下是占位a标签-->
<li><a href="common_m/m_public/images/loading.gif"></a></li>
<li><a href="common_m/m_public/images/loading.gif"></a></li>
<li><a href="common_m/m_public/images/loading.gif"></a></li>
<li><a href="common_m/m_public/images/loading.gif"></a></li>
<li><a href="common_m/m_public/images/loading.gif"></a></li>
<!-- 可以依要求加多个上面的占位a标签-->
</ul>

通过侦听PhotoSwipe.EventTypes.onDisplayImage事件,修改e.target.cache.images,以实现在图片未下载前更正占位图片的地址。 

var aimgArrIndex=0;
var picSetIndex = 10;
instance.addEventHandler(PhotoSwipe.EventTypes.onDisplayImage, function(e){
  var needSetImg = e.target.cache.images[picSetIndex++];
  if(needSetImg){
    $.getJSON(“./index.php?c=jiaju&a=ajaxNextPicInfo&picid={picid参数}”, function(data){
      var url = data[0][“img”]
      new Image().src = url;//预加载这个图片
      needSetImg["src"] = url;//把图片地址赋值给PhotoSwipe的图片集合中相应对象属性
      $(needSetImg.metaData.item).data('comment','');//其他附加内容通过这样设置
    })
  }
});

index.php?c=jiaju&a=ajaxNextPicInfo&picid={picid参数} 返回内容。根据picid的不同每调用一次返回一条图片的相关信息。 

[{"img":http://img1n.soufunimg.com/viewimage/zxb/2014_06/14/69/65/pic/002962064200/800x800.jpg}]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
驱动事件的addEvent.js代码
Mar 27 Javascript
传智播客学习之JavaScript基础篇
Nov 13 Javascript
jquery提升性能最佳实践小结
Dec 06 Javascript
jquery实现input输入框实时输入触发事件代码
Jan 28 Javascript
浅谈JavaScript 标准对象
Jun 02 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
js实现开启密码大写提示
Dec 21 Javascript
微信小程序实现打开内置地图功能【附源码下载】
Dec 07 Javascript
微信小程序网络封装(简单高效)
Aug 06 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
Jun 11 Javascript
js实现手表表盘时钟与圆周运动
Sep 18 Javascript
js基于canvas实现时钟组件
Feb 07 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 #Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
Aug 25 #Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 #Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
Aug 25 #Javascript
手机图片预览插件photoswipe.js使用总结
Aug 25 #Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
Aug 25 #Javascript
jQuery组件easyui对话框实现代码
Aug 25 #Javascript
You might like
如何在PHP中进行身份认证
2006/10/09 PHP
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP 编程安全性小结
2010/01/08 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
2016/03/06 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
PHP微信模板消息操作示例
2017/06/29 PHP
微信JSSDK分享功能图文实例详解
2019/04/08 PHP
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
再谈javascript原型继承
2014/11/10 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
清除输入框内的空格
2016/12/21 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
python strip()函数 介绍
2013/05/24 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python 实现aes256加密
2020/11/27 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
工程质量承诺书范文
2014/03/27 职场文书
投资意向书范本
2014/04/01 职场文书
大学班级计划书
2014/04/29 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
2014年民警工作总结
2014/11/25 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书