防止“点击”事件多次触发+褪色问题

时间:2012-07-19 08:12:01

标签: javascript jquery html css gallery

早上的人们。我正在制作一个简单的jQuery画廊的问题。它允许用户通过一些按钮循环浏览一组图像,同时在计时器上旋转这些图像。我的问题是,用户能够多次点击该按钮,将淡入淡出的动画排队并反复重复,例如,用户点击按钮5次>相同的图像淡入/淡出5次>画廊移动到下一个图像。

我尝试过使用:

$('#homeGalleryImage li a').unbind('click');

触发click事件然后重新绑定:

$('#homeGalleryImage li a').bind('click');

完成后但这只是在按下一次按钮之后删除了点击事件而从未重新绑定到它?

我也尝试通过以下方式禁用按钮:

$('#homeGalleryImage li a').attr('disabled', true);

无济于事......?

还有一个次要问题,如果您在图片处于转换状态时设置了单击按钮,则下一个图像显示为“淡化”,就像不透明度已降低一样?非常奇怪......以下是按钮点击的代码:

var i = 1;
var timerVal = 3000;
$(function () {
    $("#homeGalleryControls li a").click(function () {
        var image = $(this).data('image');
        $('#galleryImage').fadeOut(0, function () {
            $('#galleryImage').attr("src", image);
        });
        $('#galleryImage').fadeIn('slow');
        $('.galleryButton').attr("src", "/Content/Images/Design/btn_default.gif");
        $(this).find('img').attr("src", "/Content/Images/Design/btn_checked.gif");
        i = $(this).data('index') + 1;
        if (i == 4) {
            i = 0;
        }
        timerVal = 0;
    });
});

以下是在计时器上循环显示图像的代码:

//Cycle through gallery images on a timer
window.setInterval(swapImage, timerVal);
function swapImage() {
    $('#galleryImage').fadeOut(0, function () {
        var imgArray = ["/Content/Images/Design/gallery placeholder.jpg", "/Content/Images/Design/1.jpg", "/Content/Images/Design/2.jpg", "/Content/Images/Design/3.jpg"];
        var image = imgArray[i];
        i++;

        if (i == 4) {
            i = 0;
        }

        $('#galleryImage').attr("src", image);
        $('#galleryImage').fadeIn('slow');
    });
    var currentButton = $('#homeGalleryControls li a img').get(i - 1);
    $('.galleryButton').attr("src", "/Content/Images/Design/btn_default.gif");
    $(currentButton).attr("src", "/Content/Images/Design/btn_checked.gif");
}

我意识到使用插件可能是一个更好的主意,但我对jQuery很新,我想学习一些东西,而不是使用一些现成的代码。

任何帮助都非常感谢。

三江源

2 个答案:

答案 0 :(得分:6)

您可以随时尝试向元素添加内容以取消点击事件吗?

例如

$(".element").click(function(e) {

    if ( $(this).hasClass("unclickable") ) {
        e.preventDefault();
    } else {

        $(this).addClass("unclickable");
        //Your code continues here
        //Remember to remove the unclickable class when you want it to run again.

    }

}):

在您的情况下,您可以尝试添加对点击的检查。

$('#homeGalleryImage li a').attr('data-disabled', "disabled");

然后在点击事件中

if ( $(this).attr("data-disabled" == "disabled") {
  e.preventDefault();
} else {
  //Ready to go here
} 

修改

这是一个工作示例,显示元素变得不可点击。 http://jsfiddle.net/FmyFS/2/

答案 1 :(得分:0)

如果您要确保已注册的事件仅触发一次,则应使用jQuery的one

  

.one(events [,data],handler)返回:jQuery

     

描述:将处理程序附加到元素的事件。每种事件类型的每个元素最多只能执行一次处理程序。

查看示例:

使用jQuery:https://codepen.io/loicjaouen/pen/RwweLVx

// add an even listener that will run only once
$("#click_here_button").one("click", once_callback);

使用vanilly JS:https://codepen.io/loicjaouen/pen/gOOBXYq

// add a listener that run only once
button.addEventListener('click', once_callback, {capture: true, once: true});