0

ここhttp://www.edhubdemo.com/wp/にある私のウェブサイトの 1 つに液体カルーセル スライダーをセットアップしました。スライダーは作品とクライアントの領域の下にあり、現在、ユーザーは次/前のボタンをクリックして作品をスクロールできます。ここでやりたいことは、スライダーが次の 4 セットの作品自体に移動するように、3 秒ごとに「クリック」機能をトリガーすることです。トリガー関数を使用してみましたが、正しく統合できなかったと思います。リキッド カルーセル JavaScript ファイル内のコードは次のとおりです。

(function($){
$.fn.liquidcarousel = function(options) {

var defaults = {
    duration: 10000
};
var options = $.extend(defaults, options);

return this.each(function() {
        var divobj = $(this);

        $(divobj).css('overflow', 'hidden');

        $('> .wrapper', divobj).css('overflow', 'hidden');
        $('> .wrapper', divobj).css('float', 'left');

        $('> .wrapper > ul', divobj).css('float', 'left');
        $('> .wrapper > ul', divobj).css('margin', '0');
        $('> .wrapper > ul', divobj).css('padding', '0');
        $('> .wrapper > ul', divobj).css('display', 'block');

        $('> .wrapper > ul > li', divobj).css('display', 'block');
        $('> .wrapper > ul > li', divobj).css('float', 'left');

        var visiblelis = 0;
        var totallis = $('> .wrapper > ul > li', this).length;
        var currentposition = 0;
        var additionalmargin = 0;
        var totalwidth = 0;

        $(window).resize(function(e){
            var divwidth = $(divobj).width();
            var availablewidth = divwidth;

            var heighest = 0;
            $('> .wrapper > ul > li', divobj).css("height", "auto");
            $('> .wrapper > ul > li', divobj).each(function () {
                if ( $(this).outerHeight() > heighest ) {
                    heighest = $(this).outerHeight();
                }
            });

            $(divobj).height(heighest);
            $('> .wrapper', divobj).height(heighest);
            $('> .wrapper > ul', divobj).height(heighest);
            $('> .wrapper > ul > li', divobj).height(heighest);

            var liwidth = $('> .wrapper > ul > li:first', divobj).outerWidth(true);
            var originalmarginright = parseInt($('> .wrapper > ul > li', divobj).css('marginRight'));
            var originalmarginleft = parseInt($('> .wrapper > ul > li', divobj).css('marginLeft'));
            totalwidth = liwidth + additionalmargin;

            previousvisiblelis = visiblelis;
            visiblelis = Math.floor((availablewidth / liwidth));

            if (visiblelis < totallis) {
                additionalmargin = Math.floor((availablewidth - (visiblelis * liwidth))/visiblelis);
            } else {
                additionalmargin = Math.floor((availablewidth - (totallis * liwidth))/totallis);
            }
            halfadditionalmargin = Math.floor(additionalmargin/2);
            totalwidth = liwidth + additionalmargin;

            if (visiblelis > previousvisiblelis  || totallis <= visiblelis) {
                currentposition -= (visiblelis-previousvisiblelis);
                if (currentposition < 0 || totallis <= visiblelis ) {
                    currentposition = 0;
                }
            }
            $('> .wrapper > ul', divobj).css('marginLeft', -(currentposition * totalwidth));

            if (visiblelis >= totallis || ((divwidth >= (totallis * liwidth)) && options.hidearrows) ) {
                if (options.hidearrows) {
                    $('> .prev', $(divobj).parents(".widget")).hide();
                    $('> .next', $(divobj).parents(".widget")).hide();

                    additionalmargin = Math.floor((divwidth - (totallis * liwidth))/totallis);
                    halfadditionalmargin = Math.floor(additionalmargin/2);
                    totalwidth = liwidth + additionalmargin;
                    $('> .wrapper > ul > li', divobj).css('marginRight', originalmarginright + halfadditionalmargin);
                    $('> .wrapper > ul > li', divobj).css('marginLeft', originalmarginleft + halfadditionalmargin);
                }
                $('> .wrapper', divobj).width(totallis * totalwidth);
                $('> ul', divobj).width(totallis * totalwidth);
                $('> .wrapper', divobj).css('marginLeft', 0);
                currentposition = 0;
            } else {
                $('.prev', $(divobj).parents(".widget")).show();
                $('.next', $(divobj).parents(".widget")).show();
                $('> .wrapper', divobj).width(visiblelis * totalwidth);
                $('> ul', divobj).width(visiblelis * totalwidth);
            }
        });

        $('.next', $(divobj).parents(".widget")).click(function(){

            if (totallis <= visiblelis) {
                currentposition = 0;
            } else if ((currentposition + (visiblelis*2)) < totallis) {
                currentposition += visiblelis;
            } else if ((currentposition + (visiblelis*2)) >= totallis -1) {
                currentposition = totallis - visiblelis;
            }
            $('> .wrapper > ul', divobj).stop();
            $('> .wrapper > ul', divobj).animate({'marginLeft': -(currentposition * totalwidth)}, options.duration);

        $('.prev', $(divobj).parents(".widget")).click(function(){
            if ((currentposition - visiblelis) > 0) {
                currentposition -= visiblelis;
            } else if ((currentposition - (visiblelis*2)) <= 0) {
                currentposition = 0;
            }
            $('> .wrapper > ul', divobj).stop();
            $('> .wrapper > ul', divobj).animate({'marginLeft': -(currentposition * totalwidth)}, options.duration);
        });

        $('.next', $(divobj).parents(".widget")).dblclick(function(e){
            e.preventDefault();
            clearSelection();
        });

        $('.prev', $(divobj).parents(".widget")).dblclick(function(e){
            e.preventDefault();
            clearSelection();
        });

        function clearSelection() {
            if (document.selection && document.selection.empty) {
                document.selection.empty();
            } else if (window.getSelection) {
                var sel = window.getSelection();
                sel.removeAllRanges();
            }
        }

        $(window).resize();
});

これは、次のボタンがクリックされたときにスライダーを前方に移動するコードの一部です。

$('.next', $(divobj).parents(".widget")).click(function(){

            if (totallis <= visiblelis) {
                currentposition = 0;
            } else if ((currentposition + (visiblelis*2)) < totallis) {
                currentposition += visiblelis;
            } else if ((currentposition + (visiblelis*2)) >= totallis -1) {
                currentposition = totallis - visiblelis;
            }
            $('> .wrapper > ul', divobj).stop();
            $('> .wrapper > ul', divobj).animate({'marginLeft': -(currentposition * totalwidth)}, options.duration);

これは、前のボタンがクリックされたときにスライダーを後方に移動させるコードの一部です。

$('.prev', $(divobj).parents(".widget")).click(function(){
            if ((currentposition - visiblelis) > 0) {
                currentposition -= visiblelis;
            } else if ((currentposition - (visiblelis*2)) <= 0) {
                currentposition = 0;
            }
            $('> .wrapper > ul', divobj).stop();
            $('> .wrapper > ul', divobj).animate({'marginLeft': -(currentposition * totalwidth)}, options.duration);
        });
4

2 に答える 2

0

.nextを使用してマウスクリックイベントをシミュレートしますcreateEvent("MouseEvents")

$('.next', $(divobj).parents(".widget")).each(function (idx, elm) {
    var ev = document.createEvent("MouseEvents");
    ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    elm.dispatchEvent(ev);
});

クラスは一意ではない.eachため、最初のクラスに対してのみ呼び出したい場合があります。

これは、毎秒繰り返す関数にすることができます3

(function (obj, waitFor) { // wrap to catch variables
    var repeatAction = function repeatAction() { // function to be given timeout (stored in variable
        obj.each(function (idx, elm) { // and named so it can reference itself; makes life easier);
            var ev = document.createEvent("MouseEvents");
            ev.initMouseEvent("click", true, false, self, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
            elm.dispatchEvent(ev);
        });
        window.setTimeout(repeatAction, waitFor); // re-invocation of itself
    };
    window.setTimeout(repeatAction, waitFor); // initial invocation
}($('.next', $(divobj).parents(".widget")), 3000)); // passing vars

編集:要求に応じて、この関数がコードに挿入されました。また、可能な限り構文を修正し (OP の構文にいくつかのエラーがありました)、「美化」しました。

于 2013-02-27T11:17:03.760 に答える
0
  • jQueryで要素を選択

    var next = $('.next', $(divobj).parents(".widget"));

  • 次に、3秒ごとにクリックを呼び出します

    setInterval(next.click, 3000);

ただし、このタスク (カルーセルをスライドさせる) 用の関数を作成し、クリックしてその関数を呼び出すのが最善です。次に、クリックをシミュレートする代わりに、その関数を直接呼び出すことができます。

于 2013-02-27T11:19:32.340 に答える