JQuery плагин помощь ... нужно добавить свой собственный функционал - PullRequest
2 голосов
/ 28 января 2010

Я пытаюсь добавить свою собственную функциональность в плагин jQuery, и, если честно, все идет не так, я использую easySlider 1.7 из здесь

Моя идея состоит в том, чтобы использовать версию с нумерацией страниц, на приведенном выше сайте есть пример, но вместо этого, когда пользователь останавливается, когда пользователь нажимает на одну из пронумерованных ссылок, я хочу, чтобы он пропустил удержание слайда, а затем продолжил. Ниже моя попытка, я опубликую весь плагин и прокомментирую биты, которые я понимаю, и биты, которые я добавил.

          /*
         *  Easy Slider 1.7 - jQuery plugin
         *  written by Alen Grakalic    
         *  http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
         *
         *  Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
         *  Dual licensed under the MIT (MIT-LICENSE.txt)
         *  and GPL (GPL-LICENSE.txt) licenses.
         *
         *  Built for jQuery library
         *  http://jquery.com
         *
         */

        /*
         *  markup example for $("#slider").easySlider();
         *  
         *  <div id="slider">
         *      <ul>
         *          <li><img src="images/01.jpg" alt="" /></li>
         *          <li><img src="images/02.jpg" alt="" /></li>
         *          <li><img src="images/03.jpg" alt="" /></li>
         *          <li><img src="images/04.jpg" alt="" /></li>
         *          <li><img src="images/05.jpg" alt="" /></li>
         *      </ul>
         *  </div>
         *
         */

        (function($) {

            $.fn.easySlider = function(options){

                // default configuration properties
                var defaults = {            
                    prevId:         'prevBtn',
                    prevText:       'Previous',
                    nextId:         'nextBtn',  
                    nextText:       'Next',
                    controlsShow:   true,
                    controlsBefore: '',
                    controlsAfter:  '', 
                    controlsFade:   true,
                    firstId:        'firstBtn',
                    firstText:      'First',
                    firstShow:      false,
                    lastId:         'lastBtn',  
                    lastText:       'Last',
                    lastShow:       false,              
                    vertical:       false,
                    speed:          800,
                    auto:           false,
                    pause:          2000,
                    continuous:     false, 
                    numeric:        false,
                    numericId:      'controls'
                }; 

                var options = $.extend(defaults, options);  

                this.each(function() {  
                    var obj = $(this);              
                    var s = $("li", obj).length;
                    var w = $("li", obj).width(); 
                    var h = $("li", obj).height(); 
                    var clickable = true;
                    obj.width(w); 
                    obj.height(h); 
                    obj.css("overflow","hidden");
                    var ts = s-1;
                    var t = 0;
                    $("ul", obj).css('width',s*w);          

                    if(options.continuous){
                        $("ul", obj).prepend($("ul li:last-child", obj).clone().css("margin-left","-"+ w +"px"));
                        $("ul", obj).append($("ul li:nth-child(2)", obj).clone());
                        $("ul", obj).css('width',(s+1)*w);
                    };              

                    if(!options.vertical) $("li", obj).css('float','left');

                    if(options.controlsShow){
                        var html = options.controlsBefore;              
                        if(options.numeric){
                            html += '<ol id="'+ options.numericId +'"></ol>';
                        } else {
                            if(options.firstShow) html += '<span id="'+ options.firstId +'"><a href=\"javascript:void(0);\">'+ options.firstText +'</a></span>';
                            html += ' <span id="'+ options.prevId +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></span>';
                            html += ' <span id="'+ options.nextId +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></span>';
                            if(options.lastShow) html += ' <span id="'+ options.lastId +'"><a href=\"javascript:void(0);\">'+ options.lastText +'</a></span>';              
                        };

                        html += options.controlsAfter;                      
                        $(obj).after(html);                                     
                    };
    /**************************
    This section creates the numbered list that the user can click, clicking a numbered link pauses the slider
    *******************/    
        if(options.numeric){                                    
                        for(var i=0;i<s;i++){                       
                            $(document.createElement("li"))
                                .attr('id',options.numericId + (i+1))
                                .html('<a rel='+ i +' href=\"javascript:void(0);\">'+ (i+1) +'</a>')
                                .appendTo($("#"+ options.numericId))
                                .click(function(){                          
                                    animate($("a",$(this)).attr('rel'),true);
                                });                                                 
                        };                          
                    } else {
                        $("a","#"+options.nextId).click(function(){     
                            animate("next",true);
                        });
                        $("a","#"+options.prevId).click(function(){     
                            animate("prev",true);               
                        }); 
                        $("a","#"+options.firstId).click(function(){        
                            animate("first",true);
                        });             
                        $("a","#"+options.lastId).click(function(){     
                            animate("last",true);               
                        });             
                    };
/*The following code is my attempt to play and pause, the first created element is meant to stop the animation, but it just send it back to the first slide, the second created element, takes it to the second slide, I was hope one would pause and the other would play from the current slide****/
                    $(document.createElement("a"))
                        .attr('id', 'stop')
                        .html('<a>S</a>')
                        .appendTo($("#"+ options.numericId))
                        .click(function(){                          
                            //animate("first", true)
                            alert(defaults.continuous)
                            alert(defaults.auto)
                            animate(false)
                        });

                        $(document.createElement("a"))
                            .attr('id', 'stop')
                            .html('<a>P</a>')
                            .appendTo($("#"+ options.numericId))
                            .click(function(){                          
                                //animate("first", true)
                                alert(defaults.continuous)
                                alert(defaults.auto)
                                animate(true)
                            });

                    function setCurrent(i){
                        i = parseInt(i)+1;
                        $("li", "#" + options.numericId).removeClass("current");
                        $("li#" + options.numericId + i).addClass("current");
                    };

                    function adjust(){
                        if(t>ts) t=0;       
                        if(t<0) t=ts;   
                        if(!options.vertical) {
                            $("ul",obj).css("margin-left",(t*w*-1));
                        } else {
                            $("ul",obj).css("margin-left",(t*h*-1));
                        }
                        clickable = true;
                        if(options.numeric) setCurrent(t);
                    };

                    function animate(dir,clicked){
                        if (clickable){
                            clickable = false;
                            var ot = t;             
                            switch(dir){
                                case "next":
                                    t = (ot>=ts) ? (options.continuous ? t+1 : ts) : t+1;                       
                                    break; 
                                case "prev":
                                    t = (t<=0) ? (options.continuous ? t-1 : 0) : t-1;
                                    break; 
                                case "first":
                                    t = 0;
                                    break; 
                                case "last":
                                    t = ts;
                                    break; 
                                default:
                                    t = dir;
                                    break; 
                            };  
                            var diff = Math.abs(ot-t);
                            var speed = diff*options.speed;                     
                            if(!options.vertical) {
                                p = (t*w*-1);
                                $("ul",obj).animate(
                                    { marginLeft: p }, 
                                    { queue:false, duration:speed, complete:adjust }
                                );              
                            } else {
                                p = (t*h*-1);
                                $("ul",obj).animate(
                                    { marginTop: p }, 
                                    { queue:false, duration:speed, complete:adjust }
                                );                  
                            };

                            if(!options.continuous && options.controlsFade){                    
                                if(t==ts){
                                    $("a","#"+options.nextId).hide();
                                    $("a","#"+options.lastId).hide();
                                } else {
                                    $("a","#"+options.nextId).show();
                                    $("a","#"+options.lastId).show();                   
                                };
                                if(t==0){
                                    $("a","#"+options.prevId).hide();
                                    $("a","#"+options.firstId).hide();
                                } else {
                                    $("a","#"+options.prevId).show();
                                    $("a","#"+options.firstId).show();
                                };                  
                            };              

                            if(clicked) clearTimeout(timeout);
                            if(options.auto && dir=="next" && !clicked){;
                                timeout = setTimeout(function(){
                                    animate("next",false);
                                },diff*options.speed+options.pause);
                            };

                        };

                    };
                    // init
                    var timeout;
                    if(options.auto){;
                        timeout = setTimeout(function(){
                            animate("next",false);
                        },options.pause);
                    };      

                    if(options.numeric) setCurrent(0);

                    if(!options.continuous && options.controlsFade){                    
                        $("a","#"+options.prevId).hide();
                        $("a","#"+options.firstId).hide();              
                    };              

                });

            };

        })(jQuery);

Совершенно очевидно, что я далеко в своей попытке, я был бы очень рад, если бы кто-то мог подтолкнуть меня в правильном направлении.

Спасибо

1 Ответ

0 голосов
/ 04 февраля 2011

Добавьте зависающий слушатель либо для ссылок, либо для всего элемента, передаваемого ползунку, и когда пользователь нажимает или наводит курсор, вы можете сбросить тайм-аут автоматического продвижения. Когда они уйдут, вы можете снова установить тайм-аут и продолжить.

Примерно так будет работать на весь элемент:

obj.hover(function() {
    clearTimeout(timeout);
}, function() {
    timeout = setTimeout(function(){
        animate("next",false);
    }, 2000);
});

Вы можете поместить это в строку 211, и это должно сработать. Это то, что вы искали? Или вы хотите, чтобы он приостановился только после того, как они нажали на ссылку, а затем подождал, пока они покинут ссылки?

Если это так, вы можете использовать приведенный выше код, но с парой изменений:

  1. Избавиться от первого «clearTimeout (timeout)»; чтобы он не останавливался при наведении курсора на слайдер.
  2. Добавить глобальную переменную, изменив «var timeout»; в "var timeout, linkClickPausedSlider;".
  3. В функции «animate» установите linkClickPausedSlider = clicked.
  4. Измените код, который я вам дал, только на setTimeout, когда пользователь зависает, если linkClickPausedSlider == true, и установите для linkClickPausedSlider значение false, когда вы установите тайм-аут.

Там ... это должен быть исчерпывающий ответ. Надеюсь, это поможет вам. С Днем JQuerying!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...