开发者

Preventing SetInterval overlaps

I am using jqFancyTransitions.1.8 (http://workshop.rs/projects/jqfancytransitions/) and have the navigation enabled.

The problem I have is that if I spam click through the images (or simply click to early or too late), the effect goes crazy (especially on the curtain effect) - this is because the javascript intervals overlap and the offsets just go out of sync.

I have tried to edit the script to hide and reshow the navigation when a transition is not running, but I couldnt get this working properly, and the navigation would reshow at different intervals, maybe I was putting the code in the wrong place.

Can anyone help me insert $('#ft-buttons-slideshowHolder').show() && $('#ft-buttons-slideshowHolder').hide() in the right place to get this to work?

I was also wondering if anyone using this has had the same problem and constructed any hacks or fixes already, or if anyone is able to provide me with the assistance I require to make a quick fix happen!

Thank you SO community!!

(not my code, just beautified for easy assistance)...

/**
 * jqFancyTransitions - jQuery plugin
 * @version: 1.8 (2010/06/13)
 * @requires jQuery v1.2.2 or later 
 * @author Ivan Lazarevic
 * Examples and documentation at: http://www.workshop.rs/projects/jqfancytransitions

 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 **/
(function ($) {
    var opts = new Array;
    var level = new Array;
    var img = new Array;
    var links = new Array;
    var titles = new Array;
    var order = new Array;
    var imgInc = new Array;
    var inc = new Array;
    var stripInt = new Array;
    var imgInt = new Array;
    $.fn.jqFancyTransitions = $.fn.jqfancytransitions = function (options) {
        init = function (el) {
            opts[el.id] = $.extend({}, $.fn.jqFancyTransitions.defaults, options);
            img[el.id] = new Array();
            links[el.id] = new Array();
            titles[el.id] = new Array();
            order[el.id] = new Array();
            imgInc[el.id] = 0;
            inc[el.id] = 0;
            params = opts[el.id];
            if (params.effect == 'zipper') {
                params.direction = 'alternate';
                params.position = 'alternate';
            }
            if (params.effect == 'wave') {
                params.direction = 'alternate';
                params.position = 'top';
            }
            if (params.effect == 'curtain') {
                params.direction = 'alternate';
                params.position = 'curtain';
            }
            stripWidth = parseInt(params.width / params.strips);
            gap = params.width - stripWidth * params.strips;
            stripLeft = 0;
            $.each($('#' + el.id + ' img'), function (i, item) {
                img[el.id][i] = $(item).attr('src');
                links[el.id][i] = $(item).next().attr('href');
                titles[el.id][i] = $(item).attr('alt') ? $(item).attr('alt') : '';
                $(item).hide();
            });
            $('#' + el.id).css({
                'background-image': 'url(' + img[el.id][0] + ')',
                'width': params.width,
                'height': params.height,
                'position': 'relative',
                'background-position': 'top left'
            });
            $('#' + el.id).append("<div class='ft-title' id='ft-title-" + el.id + "' style='position: absolute; bottom:0; left: 0; z-index: 1; color: #fff; background-color: #000; '>" + titles[el.id][0] + "</div>");
            if (titles[el.id][imgInc[el.id]]) $('#ft-title-' + el.id).css('opacity', opts[el.id].titleOpacity);
            else $('#ft-title-' + el.id).css('opacity', 0);
            if (params.navigation) {
                $.navigation(el);
                $('#ft-buttons-' + el.id).children().first().addClass('ft-button-' + el.id + '-active');
            }
            odd = 1;
            for (j = 1; j < params.strips + 1; j++) {
                if (gap > 0) {
                    tstripWidth = stripWidth + 1;
                    gap--;
                } else {
                    tstripWidth = stripWidth;
                }
                if (params.links) $('#' + el.id).append("<a href='" + links[el.id][0] + "' class='ft-" + el.id + "' id='ft-" + el.id + j + "' style='width:" + tstripWidth + "px; height:" + params.height + "px; float: left; position: absolute;outline:none;'></a>");
                else $('#' + el.id).append("<div class='ft-" + el.id + "' id='ft-" + el.id + j + "' style='width:" + tstripWidth + "px; height:" + params.height + "px; float: left; position: absolute;'></div>");
                $("#ft-" + el.id + j).css({
                    'background-position': -stripLeft + 'px top',
                    'left': stripLeft
                });
                stripLeft += tstripWidth;
                if (params.position == 'bottom') $("#ft-" + el.id + j).css('bottom', 0);
                if (j % 2 == 0 && params.position == 'alternate') $("#ft-" + el.id + j).css('bottom', 0);
                if (params.d开发者_StackOverflow中文版irection == 'fountain' || params.direction == 'fountainAlternate') {
                    order[el.id][j - 1] = parseInt(params.strips / 2) - (parseInt(j / 2) * odd);
                    order[el.id][params.strips - 1] = params.strips;
                    odd *= -1;
                } else {
                    order[el.id][j - 1] = j;
                }
            }
            $('.ft-' + el.id).mouseover(function () {
                opts[el.id].pause = true;
            });
            $('.ft-' + el.id).mouseout(function () {
                opts[el.id].pause = false;
            });
            $('#ft-title-' + el.id).mouseover(function () {
                opts[el.id].pause = true;
            });
            $('#ft-title-' + el.id).mouseout(function () {
                opts[el.id].pause = false;
            });
            clearInterval(imgInt[el.id]);
            imgInt[el.id] = setInterval(function () {
                $.transition(el)
            }, params.delay + params.stripDelay * params.strips);
        };
        $.transition = function (el, direction) {
            if (opts[el.id].pause == true) return;
            stripInt[el.id] = setInterval(function () {
                $.strips(order[el.id][inc[el.id]], el)
            }, opts[el.id].stripDelay);
            $('#' + el.id).css({
                'background-image': 'url(' + img[el.id][imgInc[el.id]] + ')'
            });
            if (typeof (direction) == "undefined") imgInc[el.id]++;
            else if (direction == 'prev') imgInc[el.id]--;
            else imgInc[el.id] = direction;
            if (imgInc[el.id] == img[el.id].length) {
                imgInc[el.id] = 0;
            }
            if (imgInc[el.id] == -1) {
                imgInc[el.id] = img[el.id].length - 1;
            }
            if (titles[el.id][imgInc[el.id]] != '') {
                $('#ft-title-' + el.id).animate({
                    opacity: 0
                }, opts[el.id].titleSpeed, function () {
                    $(this).html(titles[el.id][imgInc[el.id]]).animate({
                        opacity: opts[el.id].titleOpacity
                    }, opts[el.id].titleSpeed);
                });
            } else {
                $('#ft-title-' + el.id).animate({
                    opacity: 0
                }, opts[el.id].titleSpeed);
            }
            inc[el.id] = 0;
            buttons = $('#ft-buttons-' + el.id).children();
            buttons.each(function (index) {
                if (index == imgInc[el.id]) {
                    $(this).addClass('ft-button-' + el.id + '-active');
                } else {
                    $(this).removeClass('ft-button-' + el.id + '-active');
                }
            });
            if (opts[el.id].direction == 'random') $.fisherYates(order[el.id]);
            if ((opts[el.id].direction == 'right' && order[el.id][0] == 1) || opts[el.id].direction == 'alternate' || opts[el.id].direction == 'fountainAlternate') order[el.id].reverse();
        };
        $.strips = function (itemId, el) {
            temp = opts[el.id].strips;
            if (inc[el.id] == temp) {
                clearInterval(stripInt[el.id]);
                return;
            }
            $('.ft-' + el.id).attr('href', links[el.id][imgInc[el.id]]);
            if (opts[el.id].position == 'curtain') {
                currWidth = $('#ft-' + el.id + itemId).width();
                $('#ft-' + el.id + itemId).css({
                    width: 0,
                    opacity: 0,
                    'background-image': 'url(' + img[el.id][imgInc[el.id]] + ')'
                });
                $('#ft-' + el.id + itemId).animate({
                    width: currWidth,
                    opacity: 1
                }, 1000);
            } else {
                $('#ft-' + el.id + itemId).css({
                    height: 0,
                    opacity: 0,
                    'background-image': 'url(' + img[el.id][imgInc[el.id]] + ')'
                });
                $('#ft-' + el.id + itemId).animate({
                    height: opts[el.id].height,
                    opacity: 1
                }, 1000);
            }
            inc[el.id]++;
        };
        $.navigation = function (el) {
            $('#' + el.id).append("<a href='#' id='ft-prev-" + el.id + "' class='ft-prev'>Prev</a>");
            $('#' + el.id).append("<a href='#' id='ft-next-" + el.id + "' class='ft-next'>Next</a>");
            $('#ft-prev-' + el.id).css({
                'position': 'absolute',
                'top': params.height / 2 - 15,
                'left': 0,
                'z-index': 1001,
                'line-height': '30px',
                'opacity': 0.7
            }).click(function (e) {
                e.preventDefault();
                $.transition(el, 'prev');
                clearInterval(imgInt[el.id]);
                imgInt[el.id] = setInterval(function () {
                    $.transition(el)
                }, params.delay + params.stripDelay * params.strips);
            });
            $('#ft-next-' + el.id).css({
                'position': 'absolute',
                'top': params.height / 2 - 15,
                'right': 0,
                'z-index': 1001,
                'line-height': '30px',
                'opacity': 0.7
            }).click(function (e) {
                e.preventDefault();
                $.transition(el);
                clearInterval(imgInt[el.id]);
                imgInt[el.id] = setInterval(function () {
                    $.transition(el)
                }, params.delay + params.stripDelay * params.strips);
            });
            $("<div id='ft-buttons-" + el.id + "'></div>").insertAfter($('#' + el.id));
            $('#ft-buttons-' + el.id).css({
                'text-align': 'right',
                'padding-top': 5,
                'width': opts[el.id].width
            });
            for (k = 1; k < img[el.id].length + 1; k++) {
                $('#ft-buttons-' + el.id).append("<a href='#' class='ft-button-" + el.id + "'>" + k + "</a>");
            }
            $('.ft-button-' + el.id).css({
                'padding': 5
            });
            $.each($('.ft-button-' + el.id), function (i, item) {
                $(item).click(function (e) {
                    e.preventDefault();
                    $.transition(el, i);
                    clearInterval(imgInt[el.id]);
                    imgInt[el.id] = setInterval(function () {
                        $.transition(el)
                    }, params.delay + params.stripDelay * params.strips);
                })
            });
        }
        $.fisherYates = function (arr) {
            var i = arr.length;
            if (i == 0) return false;
            while (--i) {
                var j = Math.floor(Math.random() * (i + 1));
                var tempi = arr[i];
                var tempj = arr[j];
                arr[i] = tempj;
                arr[j] = tempi;
            }
        }
        this.each(function () {
            init(this);
        });
    };
    $.fn.jqFancyTransitions.defaults = {
        width: 500,
        height: 332,
        strips: 10,
        delay: 5000,
        stripDelay: 50,
        titleOpacity: 0.7,
        titleSpeed: 1000,
        position: 'alternate',
        direction: 'fountainAlternate',
        effect: '',
        navigation: false,
        links: false
    };
})(jQuery);


I agree with Marcus - the code is in dire need of an overhaul and I will be looking for an alternative. I advise the same to anyone that comes across the same problem with the same library as this version is not exactly "stable"

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜