簡體   English   中英

jQuery插件幫助…需要添加我自己的功能

[英]Jquery plugin help…need to add my own functionality

我正在嘗試將自己的功能添加到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);

很明顯,我的嘗試還很遙遠,如果有人能朝着正確的方向推動我,我將非常感激。

謝謝

為鏈接或傳遞給滑塊的整個元素添加一個懸停偵聽器,當用戶單擊或懸停時,您可以清除自動前進超時。 他們離開后,您可以重新設置超時時間並繼續。

這樣的事情將適用於整個元素:

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

您可以將其放在211行附近,它應該可以工作。 那是您要找的東西嗎? 還是您希望它僅在他們單擊鏈接后才暫停,然后等待他們離開鏈接?

如果是這樣,您可以使用上面的代碼,但要進行一些更改:

  1. 擺脫第一個“ clearTimeout(timeout);” 這樣當您將鼠標懸停在滑塊上時它不會暫停。
  2. 通過更改“ var timeout;”來添加全局變量; 更改為“ var timeout,linkClickPausedSlider;”。
  3. 在“動畫”功能中,設置linkClickPausedSlider =單擊。
  4. 將我給您的代碼更改為僅當linkClickPausedSlider == true時用戶懸停時才設置setTimeout,並在設置超時時將linkClickPausedSlider設置為false。

那里...應該是一個詳盡的答案。 希望這對您有所幫助。 快樂的jQuerying!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM