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 相关文章推荐
js保存当前路径(cookies记录)
Dec 14 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
Dec 31 Javascript
js使用循环清空某个div中的input标签值
Sep 29 Javascript
js实现单击图片放大图片的方法
Feb 17 Javascript
chrome调试javascript详解
Oct 21 Javascript
JS获取checkbox的个数简单实例
Aug 19 Javascript
Bootstrap table简单使用总结
Feb 15 Javascript
jQuery实现元素的插入
Feb 27 Javascript
详解使用Next.js构建服务端渲染应用
Jul 10 Javascript
前端vue+elementUI如何实现记住密码功能
Sep 20 Javascript
antd design table更改某行数据的样式操作
Oct 31 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基础之运算符的使用方法
2013/04/28 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
js定时器的使用(实例讲解)
2014/01/06 Javascript
jquery常用操作小结
2014/07/21 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
解决wx.onMenuShareTimeline出现的问题
2016/08/16 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
Python OS模块常用函数说明
2015/05/23 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
python实现图片压缩代码实例
2019/08/12 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
详解HTML5将footer置于页面最底部的方法(CSS+JS)
2018/10/11 HTML / CSS
美国领先的汽车轮胎和轮毂供应商:TireBuyer
2016/07/21 全球购物
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
写给医院的感谢信
2015/01/22 职场文书
校本培训个人总结
2015/02/28 职场文书
入伍通知书
2015/04/23 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis