《beginning jquery》是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件。实现了自动播放,键盘和鼠标控制。但是,借助jquery的自定义事件来优化这个插件,可以使逻辑更清楚。

效果图

首先贴一下作者(Jack Franklin)的原程序:

  1. (function($) {
    $.fn.slider = function(options) {
    var defaults = {duration: };
    var settings = $.extend({}, defaults, options);
    return this.each(function() { // store some initial variables
    var $slider = $(this);
    var $sliderList = $slider.children("ul");
    var $sliderItems = $sliderList.children("li");
    var $allButtons = $slider.find(".button");
    var imageWidth = $sliderItems.first().children("img").width();
    var $buttons = {
    forward: $allButtons.filter(".forward"),
    back: $allButtons.filter(".back")
    };
    var endMargin = -(($sliderItems.length - ) * $sliderItems.first().children("img").width());
    var animateSlider = function(direction, callback) {
    $sliderList.stop(true, true).animate({
    "margin-left" : direction + "=" + imageWidth },
    settings.duration,
    callback);
    var increment = (direction === "+" ? -1 : );
    updateIndex(currentIndex + increment);
    };
    var animateSliderToMargin = function(margin, callback) {
    $sliderList.stop(true, true).animate({"margin-left": margin}, settings.duration, callback);
    };
    var getLeftMargin = function() {
    return parseInt($sliderList.css("margin-left"), );
    };
    var isAtBeginning = function() {
    return getLeftMargin() === ;
    };
    var isAtEnd = function() {
    return getLeftMargin() === endMargin;
    };
  2.  
  3. var updateIndex = function(newIndex) {
    currentIndex = newIndex;
    $index.text(currentIndex);
    };
    var triggerSlider = function(direction, callback) {
    var isBackButton = (direction === "+");
    if(!isBackButton && isAtEnd()) {
    animateSliderToMargin(, callback);
    updateIndex();
    }
    else if(isBackButton && isAtBeginning()) {
    animateSliderToMargin(endMargin, callback);
    updateIndex(totalImages); }
    else {
    animateSlider(direction, callback);
    }
    };
    $allButtons.on("click", function(event) {
    var isBackButton = $(this).hasClass("back");
    triggerSlider((isBackButton? "+" : "-"));
    event.preventDefault();
    });
    $(document.documentElement).on("keyup", function(event) {
    if(event.keyCode === ) {
    triggerSlider("+");
    }
    else if (event.keyCode === ) {
    triggerSlider("-");
    }
    });
    });
    };
    })(jQuery);

这里没有添加键盘事件和自动播放功能,实现了鼠标点击back和forward按钮使图片滚动。当到达最后一张时,点击forward会回到第一张;当第一张图片显示并点击back按钮时,则会显示最后一张,从而实现循环滚动。通过读代码可以看出,作者定义了比较多的函数来实现这个过程。定义的相关函数有:

判断图片位置函数:

  1. isAtBeginning(),
  1. isAtEnd()

DOM函数和动画函数:

  1. animateSliderToMargin(),
  1. updateIndex()

事件处理函数

  1. triggerSlider()

作者的思路是click首先触发图片移动事件,然后再更新索引,但是换一种方式考虑:

1.前进后退两个按钮只控制index的变化。就是只控制一个number的增加和减小。

2.将索引变化看作一个事件,当索引发生变化时相应的margin-left便可以计算出来。

3再通过自定义事件,当索引发生变化时,触发(indexChange)事件,改变slider元素的margin-left值。实现图片的切换。

这样所有逻辑都会在操作index这个数上面,而图片切换只是响应index的变化。这样逻辑上会更清晰,也容易写出更简单紧凑的代码。如下:

  1. (function($) {
    $.fn.slider = function(options) {
    var defaults = {duration:,direction:'left',animationDelay: };
    var settings = $.extend({}, defaults, options);
    return this.each(function() {
    var $slider = $(this),
    $sliderList = $slider.children("ul"),
    $sliderItems = $sliderList.children("li"),
    $itemLen=$sliderItems.length,
    $allButtons = $slider.find(".button"),
    $forward= $allButtons.filter(".forward"),
    $back=$allButtons.filter(".back"),
    $counter=$('#counter'),
    counter= ,
    type='margin-'+settings.direction,
    timer=null,
    imageWidth=$sliderItems.find('img').width();
    //-----------------------------jquery Map-----------------------------
  2.  
  3. //-----------------------------utility method-----------------------------
    function counterToMargin(count){
    return (-count)*imageWidth;
    }
    function sliderWay(){
    var obj={};
    obj[type]=counterToMargin(counter);
    return obj;
    }
    function counterChange(flag){
    if(flag==='+'){
    counter<$itemLen?(counter++):counter=;
    }
    else if(flag==='-'){
    counter>?(counter--):counter=$itemLen;
    }
    }
  4.  
  5. var automaticSlide = function() {
    timer=setTimeout(function () {
    counterChange('+');
    $sliderList.trigger('counterChange');
    automaticSlide();
    },settings.animationDelay);
    };
    timer =setTimeout(automaticSlide,settings.animationDelay);
    var resetTimer = function() {
    if(timer) {
    clearTimeout(timer);
    }
    timer = setTimeout(automaticSlide, );
    };
    //-----------------------------event methods----------------------------
    $sliderList.on('counterChange',function(){
    resetTimer();
    var $this=$(this);
    $this.stop(true,true).animate(sliderWay(),settings.duration);
    showCounter();
    });
    $forward.on('click',function(){
    counterChange('+');
    $sliderList.trigger('counterChange');
    });
    $back.on('click',function(){
    counterChange('-');
    $sliderList.trigger('counterChange');
    });
    $(document.documentElement).on("keyup", function(event) {
    if(event.keyCode === ) { //left arrow
    $back.trigger("click"); }
    else if (event.keyCode === ) { //right arrow
    $forward.trigger("click"); }
    });
    //-----------------------------dom methods----------------------------
    function showCounter(){
    $counter.html(counter);
    }
    });
    };
    })(jQuery);
当然,这个插件还远远不够成熟,理想状况下,给出容器元素,在对容器元素调用插件时传入图片url数列就可以实现slider功能,才算一个比较成熟的插件。这里只是提供一种组织代码思路。
demo

跟着《beginning jquery》学写slider插件并借助自定义事件改进它的更多相关文章

  1. jQuery 的自定义事件

    jQuery  中,想要自动触发自定义事件,必须满足2个条件: 1.事件必须是通过on 来绑定的. 2.事件必须是通过trigger / triggerHandler 来触发. 格式如下: $(fun ...

  2. 自己写一个jQuery垂直滚动栏插件(panel)

    html中原生的滚动栏比較难看,所以有些站点,会自己实现滚动栏,导航站点hao123在一个側栏中,就自己定义了垂直滚动栏,效果比較好看,截图例如以下: watermark/2/text/aHR0cDo ...

  3. 跟我一起学写jQuery插件开发方法(转载)

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧!     很 ...

  4. 学写jQuery插件开发方法

    jQuery如此流行,各式各样的jQuery插件也是满天飞.你有没有想过把自己的一些常用的JS功能也写成jQuery插件呢?如果你的答案是肯定的,那么来吧!和我一起学写jQuery插件吧!   很多公 ...

  5. Nivo Slider - 世界上最棒的 jQuery 图片轮播插件

    Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ...

  6. 基于Bootstrap的炫酷jQuery slider插件

    简要教程 这是一款在原生bootstrap slider的基础上制作效果非常炫酷的jQuery slider插件.该slider插件可以自定义slider的颜色.形状.透明度和tooltip等属性,美 ...

  7. 【jQuery】结合accordion插件分析写插件的方法及注意事项

    1.jQuery插件的命名方式:jquery.[插件名].js 2.对象方法附加在jQuery.fn上,全局函数附加在jQuery对象本身上 3.插件内部this指向的是通过选择器获取的jQuery对 ...

  8. 源码来袭!!!基于jquery的ajax分页插件(demo+源码)

    前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...

  9. slider插件制作轮播图

    html代码: <div id="banner_tabs" class="flexslider"> <ul class="slide ...

随机推荐

  1. Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)

    简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...

  2. Linux下安装Hadoop完全分布式(Ubuntu12.10)

    Hadoop的安装非常简单,可以在官网上下载到最近的几个版本,最好使用稳定版.本例在3台机器集群安装.hadoop版本如下: 工具/原料 hadoop-0.20.2.tar.gz Ubuntu12.1 ...

  3. PHP变量

    变量的声明 PHP变量声明必须是$(美元符号)+变量名进行命名,同时在=(赋值操作符)后进行赋值 声明后的变量不是仅可以在一个<?php 这里是php代码 ?>使用,它还可以在当前页面所有 ...

  4. js Form.elements[i]的使用实例

    function pdf(){    //一个html里面可能存在多个form,所以document.form[0]指的是第一个form,document.form[1]返回就是第二个form,如果没 ...

  5. JSON转化为JAVABEAN集合

    String str = "[{'id':'392','type':'jpg'},{'id':'393','type':'jpg'},{'id':'377','type':'jpg'}]&q ...

  6. spring mvc返回json字符串的方式

    spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json            优点:不需要自己再处理 步骤一:在spring- ...

  7. JavaScript的“原型甘露”

    今天跟朋友讨论JS的面向对象编程问题,想起了原来曾经看过一篇文章,但是看过很久想不起来了,用了很多关键词,终于用“悟透JavaScript  面向对象”这两个关键词找到了“原文”,原文地址:http: ...

  8. px、dp和sp,这些单位有什么区别?

    DP 这个是最常用但也最难理解的尺寸单位.它与“像素密度”密切相关,所以 首先我们解释一下什么是像素密度.假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算 ...

  9. JS高程4.变量,作用域和内存问题(2)执行环境及作用域

    1.执行环境:执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为, 每个执行环境都有一个与之相关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中. 2.全局执行环境: 最外围的 ...

  10. 自己实现一个简易web服务器

    一个web服务器是网络应用中最基础的环节. 构建需要理解三个内容: 1.http协议 2.socket类 3.服务端实现原理 1.1 HTTP http请求 一般一个http请求包括以下三个部分: 1 ...