jQuery FlexSlider插件一些使用上的小tips

article/2025/11/5 18:18:12

最近做的一个需求,用到了jQuery FlexSlider这个插件,本以为一个算是已经比较成熟的插件,用起来应该没什么难度,然而真正用起来才发现,其实还是有些坑的,不过好在这个插件源代码写的比较好,比较好看,所以自己多看看也就能弄明白。

网上那些随便一搜就能找到的你抄我我抄你大家互相抄的东西,我就不继续浪费网络资源和自己的时间了,主要是一些网上很难找到的或者比较模棱两可的点,这里以jQuery FlexSlider v2.6.3这个版本为例,总结如下。


回调方法

网上一些提到 flex-slider插件的方法,基本上都是一带而过,而且模棱两可,我估计当时作者不知从哪里看到然后随手 copy下来的时候,连他自己都不知道自己在写些什么。

一共 7个回调函数,如下:

回调函数API

  1. start: function(){}
    源代码里面标注的解释是:当第一个滑块第一次加载完毕后执行。 说白了就是当此组件初始化(init)完成后,然后又当第一个滑块加载完毕后,此函数执行,在当前slider组件的整个生命周期中,只执行一遍。
  2. before: function(){}
    在滑块运动之前的一刻执行,也就是说当你点击切换当前轮播项的时候,此函数会在轮播项开始运动的前一刻执行。
  3. after: function(){}
    和上一个相反,在滑块运动完成的下一刻执行,也就是说当你点击切换当前轮播项的时候,此函数会在轮播项完成运动的下一刻执行。
  4. end: function(){}
    当前整个轮播组件滑动到了最后一个滑块的时候执行,与滑块的运动动作异步并行执行,也就是说是在 beforeafter 函数之间执行,每次到达尾部,此函数都会执行一遍。
  5. added: function(){}
    当新的滑块被追加到轮播组件中后,就会调用此回调函数。
  6. removed: function(){}
    当轮播组件中有滑块被删除掉后,此函数会执行
  7. init: function() {}
    当轮播组件初始化完成后执行,此函数实际上不仅只在开始的时候和执行一遍,如果第一次初始化完后,继续向轮播组件中追加滑块,则此函数还可能会被调用,所以在轮播组件的整个生命周期中,此函数被调用的次数 >= start 函数被调用的次数。

异步获取数据初始化

如果轮播组件的数据是异步获取而来,则很显然在数据尚未获得之前,flex-slider是不能够进行初始化的,否则将会出现异常情况。

对于这种情况,有两种常用的解决手段,一是使用回调函数,二是使用 Promise

通过回调函数初始化组件

首先页面发送获取数据的的请求,当数据成功获取后,再在回调函数中进行 flex-slider的初始化。

如下示例(为了简化代码,使用到了 Jquery库):

$(function(){getData(){$.getJSON('http://api.example.com&callback=?', (data)=>{// 这里可以放初始化`flex-slider`的代码// ...})}
})

通过 Promise初始化组件

如果不方便在回调函数中执行 flex-slider组件的初始化才做,或者希望以同步的写法来进行组件的初始化,那么 Promise值得一用。

首先依旧是需要首先请求数据,但是回调函数中不执行初始化操作,而是返回一个 Promise对象:

$(function(){getData(){return new Promise((resolve, reject)=> {$.getJSON('http://api.example.com&callback=?', (data)=>{// 将获取到的数据当成 `Promise`的参数传回去resolve(data)})})}
})

然后就能保证在初始化 组件之前获取到数据了:

let promiseResult = getData()
promiseResult.then((data)=>{// 这里可以放初始化`flex-slider`的代码// ...
})

当然还可以使用 async函数来完成异步操作的同步操作,如果需要兼容不支持 ES6的浏览器,则最后别忘了使用一些工具将 ES6代码转换成 ES5的形式。


异步增删数据项

如果 flex-slider组件的滑块数量是固定的,而且还不用懒加载,是一次性加载初始化完毕的,那么没什么好说的,但是如果在组件第一次完成初始化后,还将会动态地向组件内增加 slider,也就是滑块的数量是动态变化的,那么就需要用到 flex-slider另外的方法了。

动态追加数据

需要用到 flex-slideraddSlide()方法,此方法代码很简单:

addSlide 方法

要做的事情也很清楚:

首先更新组件的滑块数量,然后重新将组件初始化一遍,最后调用 added()这个回调函数。

addSlide()方法中可以看出,动态增加滑块数量,是会引起组件重新初始化的,所以 init:function(){} 回调函数会执行,这也就解释了为什么 init 并不总是只执行一遍的原因。

从上述代码中可以看到,addSlide()方法其实是放在 slider 对象上的,想用addSlide()方法,就必须要有 slider 对象才行,有人可以不清楚这个slider到底是什么鬼,其实这个对象,可以在前面所说的 7个回调函数中获取,因为这个slider就是那 7个回调函数的参数。

例如:

$("#flexSlider").flexslider({start(slider): function(){// 这里就可以使用 addSlide()方法...slider.addSlide(obj, pos);}
})

其他 6个回调函数都有 slider这个函数,和 start一样。

至于 addSlide的两个参数,一个是必选参数obj,第二个则是可选的。

  1. obj
    此参数代表的就是你想要动态追加的滑块 HTML字符串,例如 <li></li>,在被传入 addSlide方法中后,会被自动包装成 Jquery对象。
  2. pos
    你可以通过 此参数来选择将动态插入的滑块HTML插入到原有的一些滑块的什么位置,如果你不传入此参数,则默认追加到原有组件的末尾处。
  • 关于 addSlide方法的简单改进

addSlide的实现方法中可以看到,此方法每次只能动态新增一个滑块,数量每次只能加 1,如果你想一次性新增多个滑块,则必须多次调用此函数,也就会多次执行对 flex-slider的初始化操作,这显然很影响性能。

而且据我测试,连续多次调用此函数,flex-slider的初始化会出现异常,例如无法正确计算出每次滑动的距离,导致组件布局崩溃。

所以我就简单对这个方法改进了一下,让其能够一次性插入多个滑块的DOM,但是却仅在最后重新初始化一次,如下:

改进 addSlider方法

此函数只是将原先每次固定的只能追加一个滑块,变成了能够自由选择数量,其余的一些操作依旧不变。

四个参数中 objpos 的含义和作用和原先一样,至于 slider 则和上面的 slider指的是同一个对象,都是那 7个回调函数的参数,这是为了方便通过此对象来调用我们自己重写的 addSlider 方法,number值得就是你需要新增的滑块数量,默认为 1

用法示例如下:

$("#flexSlider").flexslider({// 这里我们假设当每次组件滑动到最后一个滑块的时候,就追加新的滑块// 有点类似于懒加载或者预加载的意思end(slider): function(){// 假设每一个 `li`元素,就是一个滑块的单位,这里我们一次性追加了三个滑块的 `DOM`let str = '<li></li><li></li><li></li>'// 调用我们重写的 addSlide() 方法,这里我们一次性新增了三个滑块,// 所以传入数字 3addSlide(slider, str, 3);}
})
  • 追加滑块时出现的问题

如果是理想情况下,新增滑块的数据是通过同步方法一次性顺序获得,那么一切正常。

但不知是不是我用法不太对,如果是通过异步请求数据的方法来取得新增滑块的数据,无论我是通过 flex-slider提供的 addSlide方法,正常地每次新增一个滑块,还是使用自己改进的 addSlide方法来一次性新增多个滑块,亦或是我通过回调函数还是 Promise的方法来请求异步数据,甚至我把新增滑块的动作,在 7个回调函数中都试了一遍,最终的结果,都是 flex-slider 组件无法正常初始化,无法正常计算每次需要滑动的距离。

我明明想让它每次滑动三个滑块的距离,结果它却滑动了一个半,甚至还给我来了个漂移地来回滑动,导致布局崩溃。

最后折腾了好长时间,试了好多种方法,但好在总算是让我找出了一个还算是好用的方法。

道理很简单,既然如果是同步请求数据来追加新的滑块,组件就能够正常初始化,那么我们就假装让组件中追加的新滑块数据是同步得来的就行了:

先用没有任何内容的滑块DOM(例如空的 li标签)来占位,让 flex-slider组件正常新增滑块,这样组件就能正常初始化,能够正确计算每次滑动的距离,一切正常。
然后在此基础上,在稍后获取到异步数据后,将获取到的真正的滑块数据,替换掉之前的占位空滑块,这样对于 flex-slider组件来说,滑块的数量并没有任何变化,也就不会引起其任何的动作,所以替换完成后,组件依旧是正常的。

下面用代码说话。

假设我们异步获取新增滑块数据的方式是通过 Promise,每次到达组件末尾的时候,就自动获取新的数据,追加新的滑块。

$("#flexSlider").flexslider({// 这里我们假设当每次组件滑动到最后一个滑块的时候,就追加新的滑块// 有点类似于懒加载或者预加载的意思end(slider): function(){// 假设每一个 `li`元素,就是一个滑块的单位,这里我们一次性追加了三个空滑块的 `DOM`,// 这三个 `DOM`只有一个作用,那就是给将来真正要呈现在这里的滑块占位,// 以便于 `flex-slider`组件正常的重新初始化,不会产生各种各样的异常,将来是要被替换掉的。let str = '<li></li><li></li><li></li>'// 调用我们重写的 addSlide() 方法,这里我们一次性新增了三个滑块,// 所以传入数字 3addSlide(slider, str, 3);let promiseResult = getData()promiseResult.then((data)=>{// 假设 data 中有动态追加滑块的数据// len 指的是新增滑块的数量let len = data.lengthfor(let i=0;i<len;i++){// 在这里组装真正的滑块DOMlet newDOM = ...// 关键在这里,将原先的占位滑块DOM,替换成真正想要展示的// 这里假设是追加到 flex-slider 的末尾处$('#flexSlider .slides li:eq('+(slider.count-j)+')').replaceWith(str)}})}
})

动态删减数据

删除数据使用到另外一个方法 :removeSlide

这里写图片描述

此方法做的事情,基本上都是一样的,都重新指定了删减后滑块的数量,以及重新初始化,并且在最后调用了 removed 回调函数。

这个方法只有一个 obj参数,代表的意思与 addSlide相同,没有第二个参数,也就是不能随意指定要删除哪个滑块,只能是最后一个。

不过我们同样可以自己将此方法重写一遍,让其能一次性删除多个滑块,并且能够指定要删除的滑块下标,我没有实际做过,期间可能还会有其他的异常,但大致思路是这样的肯定没错。

removeSlide方法的用法与 addSlide 没有太大区别,就不多说了。


http://chatgpt.dhexx.cn/article/HmawZfS4.shtml

相关文章

jquery.flexslider-min.js实现banner轮播图效果

查看演示 立即下载 插件描述&#xff1a; jquery图片轮播插件仿支付宝2013版全屏图片幻灯片淡出淡进切换效果 实现方法 引用jquery和flexslider.js到你的页面 <script type"text/javascript" src"js/jquery-1.7.2.min.js"></script> <sc…

Vue+Element-ui实例_使用flexslider插件设计横向时间线

下面是做了一个类似时间线(history事件线)的页面&#xff0c;主要是记录一下log&#xff0c;或者history的操作记录。 主要难点&#xff1a; &#xff08;1&#xff09;一般的插件时间线例如(elementUI中的el-timeline)就是纵向的时间线&#xff0c;如果数据过多的话&#xf…

flexSlider 图片轮播插件的使用(附参数设置)

前提&#xff1a;下载插件&#xff08;官网下载地址&#xff1a;http://flexslider.woothemes.com/ 请用IE打开&#xff0c;chrome可能打不开&#xff1b;其他下载地址&#xff1a;点击打开链接&#xff09;&#xff0c;并引入flexslider.css和jquery.flexslider-min.js文件(缺…

flex

水平垂直居中也算是 CSS 领域最为常见的一个问题了&#xff0c;不同场景下的方法也各不相同&#xff0c;各有优劣。嗯&#xff0c;下面这种应该算是最便捷的了&#xff1a; <div class"g-container"><div class"g-box"></div> </div…

轮播插件——flexslider

轮播插件——flexslider, 首先&#xff0c;当我们需要轮播插件的时候呢&#xff0c;去浏览器中找自己需要的轮播插件&#xff0c;比如&#xff0c;搜索关键词“JQuery轮播插件”&#xff0c;就会出来很多网站&#xff0c;选一个点进去&#xff0c;预览效果&#xff0c;然后下载…

重现Struts1的操纵classLoader漏洞

注&#xff1a;本文仅限技术研究&#xff0c;探讨&#xff0c;测试使用. 2014年4月29日爆出的struts的可操纵classLoader的漏洞&#xff0c; 横跨struts1和struts2的所有版本。 影响面和问题的严重性几乎可以和heartbleed相媲美。 struts2要严重一些&#xff0c;对于struts1&am…

Struts1、Struts2、Hibernate、Spring框架工作原理介绍

Struts1工作原理 Struts1工作原理图 1 、初始化&#xff1a; struts 框架的总控制器 ActionServlet 是一个 Servlet &#xff0c;它在 web.xml 中配置成自动启动的 Servlet &#xff0c;在启动时总控制器会读取配置文件 (struts-config.xml) 的配置信息&#xff…

Struts1 和 Struts2

关于Struts2的出现缘由和好处就不多说啦&#xff0c;看了几篇总结的不错的文章&#xff0c;整理下贴出来&#xff0c;共同学习了。 Action的区别 对于有着丰富的Struts1.x开发经验的朋友来说&#xff0c;都十分的清楚Action是整个Struts框架的核心内容&#xff0c;当然Struts2也…

Struts1的工作流程

Struts1的工作流程图如下所示&#xff1a; 其工作流程如下&#xff1a; 当Web服务器启动的时候&#xff0c;根据web.xml文件加载并初始化ActionServlet&#xff0c;根据配置ActionServlet的config参数信息&#xff0c;确定struts-config.xml配置文件存放的位置&#xff0c;并根…

struts2讲解

Struts2部分 1. JavaEE软件三层结构和MVC的区别&#xff1f; JavaEE软件三层机构是由sun公司提供JavaEE开发规范的&#xff1a;Web层(表现层)、业务逻辑层、数据持久层。【其中WEB层会使用前端控制器模式】 MVC是一种思想&#xff0c;是一种模式&#xff0c;将软件分为 Model…

Struts1和Struts2对比

最近学习了Struts1和Struts2.很多人、很多资料都提到。Struts2不是从Struts1发展而来的。Struts2的前身是WebWork。那它俩到底有多大的不同呢&#xff0c;看了一些资料&#xff0c;下边就来比较比较。 一、架构分析 Struts1的架构图&#xff1a; 执行流程&#xff1a; 1.…

Struts1.x使用入门

Struts1框架是apache公司的开源子项目&#xff0c;是基于mvc逻辑分层的web层框架实现。是出现最早的web层框架&#xff0c;应用最广发。Struts1框架重点关注的是控制层&#xff0c;对于视图层只是提供了大量的标签&#xff1b;对于model层的影响微乎其微。 本文也是本人初学st…

Struts1的路径映射详解

首先介绍下struts1种xml配置的相关概念&#xff1a; • Action 的path: ActionServlet 根据该属性来转发用户的请求&#xff0c;即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do 后缀去掉&#xff0c;匹配Action 的path属性值。 • Action 的name: 此处的name 属…

Struts1框架轻易入门,经典示例

Struts1框架轻易入门&#xff0c;经典示例 版权申明&#xff1a;此文为作者原创&#xff0c;未经允许&#xff0c;请勿转载&#xff01; Struts工作原理及流程登录验证示例 Struts1 工作原理及流程 这是本人整理的一点材料&#xff0c;原理图为纯手工绘制&#xff0c;不喜勿喷&…

struts1框架基本(笔记)

在阿帕奇官网下载合适的struts1框架文件。 应用在显示层框架。 struts1与struts2虽然是一脉相承&#xff0c;但它们用法完全不一样。 struts2是在struts1与webwork基础上&#xff0c;发展的全新框架。 注&#xff1a;本文是在MyEclipse下进行的操作&#xff0c;不是之前的E…

Struts1介绍

struts&#xff1a;[strʌts]支柱; 撑杆; 支杆; 支撑; 趾高气扬的步态; 高视阔步的样子; 引入struts Model1结构如图1所示&#xff1a; Model1是一个以JSP文件为中心的模式&#xff0c;在这种模式中JSP页面不仅负责表现逻辑&#xff0c;也负责控制逻辑。专业书籍上称之为逻辑…

入门Struts1第一讲——Struts1入门就这么简单

现在终于进入框架的学习中了&#xff0c;后面还有好几个框架等待着我们呢&#xff01;我们先来学习Struts1框架&#xff0c;然后再过渡到Struts2框架的学习中。下面我们开始学习Struts1框架之旅。 Struts1简介 Struts1是Apache开发的一个web层的框架&#xff0c;它主要用于简…

连接微软云的几种方式

1&#xff0c;通过管理portal连接微软云 需要使用liveId 2&#xff0c;通过visual web developer 直接更新 需要.cer(509)证书 3.通过远程登录管理 需要XXXXX-Staging-WebRole1_IN_0.rdp文件 PowerShell 需要管理证书

使用微软的OneDrive给别人分享大文件,非常方便

假设我想把这个40多MB的文件分享给一位同事&#xff1a; 在右键菜单里选share&#xff1a; 指定我要分享给谁&#xff1f; 假设我分享给这位姓丁的同事&#xff0c;OK了&#xff1a; 要获取更多Jerry的原创文章&#xff0c;请关注公众号"汪子熙":

谷歌云盘文件快速下载方法

最近看的论文附带的数据集在谷歌云盘里&#xff0c;每个文件都有十个G左右的大小&#xff0c;而直接从谷歌云盘下载速度过慢而且有可能中断&#xff0c;而multcloud是一个非常好的多云盘管理软件。他可以通过国内网直接登录操作&#xff0c;我们可以通过multcloud将谷歌云盘的文…