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禁止回车提交表单的示例代码
Dec 23 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
Jan 09 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
Mar 23 Javascript
浅析Bootstrap表格的使用
Jun 23 Javascript
vue-cli+webpack记事本项目创建
Apr 01 Javascript
微信小程序访问node.js接口服务器搭建教程
Apr 25 Javascript
使用JavaScript根据图片获取条形码的方法
Jul 04 Javascript
详解Angular2学习笔记之Html属性绑定
Jan 03 Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
Jul 26 Javascript
vuex实现的简单购物车功能示例
Feb 13 Javascript
微信公众号获取用户地理位置并列出附近的门店的示例代码
Jul 25 Javascript
JS typeof fn === 'function' &amp;&amp; fn()详解
Aug 22 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
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
《PHP边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
需要发散思维学习PHP
2009/06/29 PHP
php 抽象类的简单应用
2011/09/06 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
读jQuery之八 包装事件对象
2011/06/21 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
返回上一个url并刷新界面的js代码
2020/09/12 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
详解python如何在django中为用户模型添加自定义权限
2018/10/15 Python
python中Lambda表达式详解
2019/11/20 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
python语言是免费还是收费的?
2020/06/15 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
给校长的建议书300字
2014/05/16 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
诚信承诺书
2015/01/19 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
新闻通讯稿范文
2015/07/22 职场文书
mysql配置SSL证书登录的实现
2021/09/04 MySQL
解析MySQL索引的作用
2022/03/03 MySQL
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript