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 相关文章推荐
jquery 插件 人性化的消息显示
Jan 21 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
Jun 13 Javascript
jquery.Callbacks的实现详解
Nov 30 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
VUE元素的隐藏和显示(v-show指令)
Jun 23 Javascript
微信小程序实现表单校验功能
Mar 30 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
Sep 11 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
element跨分页操作选择详解
Jun 29 Javascript
关于React Native 无法链接模拟器的问题
Jun 21 Javascript
微信小程序APP页面的之间的相互传递参数以及自定义组件
Apr 19 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下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
2016/03/17 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
JavaScript 事件属性绑定带参数的函数
2009/03/13 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
js仿微博实现统计字符和本地存储功能
2015/12/22 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
Nodejs中使用phantom将html转为pdf或图片格式的方法
2017/09/18 NodeJs
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
js实现星星打分效果
2020/07/05 Javascript
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Python包,__init__.py功能与用法分析
2020/01/07 Python
opencv python 图片读取与显示图片窗口未响应问题的解决
2020/04/24 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
goodhealth官方海外旗舰店:新西兰国民营养师
2017/12/15 全球购物
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
为什么要使用servlet
2016/01/17 面试题
在校生党员自我评价
2013/09/25 职场文书
应届毕业生的自我鉴定
2013/11/13 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
2016党校学习心得体会
2016/01/07 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
话题作文之关于呼唤
2019/11/29 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis
Python中json.dumps()函数的使用解析
2021/05/17 Python
SQL实现LeetCode(197.上升温度)
2021/08/07 MySQL