jQuery:在某个动作中绑定会导致多次执行

时间:2011-09-21 14:30:28

标签: jquery events keypress

好的,我刚刚要求解除特定的按键事件。我现在用命名空间事件解决了这个问题。但是我遇到了另一个问题......下面的函数在animate()显示div之后绑定了一个按键事件。它工作得很好,但是按键事件似乎计算时间,函数执行...在我的情况下,myFnc()在点击链接时执行...所以当我点击链接时keypress.f事件被触发一次......但是当我按下键之前多次点击链接时,按键事件也执行了一次以上虽然我只按了一次键....所以fadeToggle()一次按键执行5次,当功能执行5次之前通过5次点击...有没有人理解我的意思,可以帮助我吗?

function myFnc() {
        $('#somediv').animate({    
            height: 'toggle'              
        }, 600, function() { 

            $(document).bind('keypress.f', function(event) {

                if($('#secret').is(':visible')) {  

                    if ( event.which == 102 ) {
                        $('.content-2').fadeToggle();
                        $('.content-284').fadeToggle();
                    }
                }
                else {                        
                    $(document).unbind('keypress.f');                        
                }
            });

        });

}

3 个答案:

答案 0 :(得分:0)

使用.is() method:animated selector仅在当前未进行动画时应用动画..(如果在动画进行过程中多次点击该问题

function myFnc() {
    var $somediv = $('#somediv');
    if (!$somediv.is(':animated')) {
        $somediv.animate({
            height: 'toggle'
        }, 600, function() {

            $(document).bind('keypress.f', function(event) {

                if ($('#secret').is(':visible')) {

                    if (event.which == 102) {
                        $('.content-2').fadeToggle();
                        $('.content-284').fadeToggle();
                    }
                }
                else {
                    $(document).unbind('keypress.f');
                }
            });

        });
    }
}

另一个解决方案是在绑定新的按键之前始终取消绑定按键。

$(document).unbind('keypress.f');
$(document).bind('keypress.f', function(event) {...});

这种情况总是只有一个......

答案 1 :(得分:0)

你可以用

之类的东西来解决这个问题
var bound_keypress_f = false;

function myFnc() {
        $('#somediv').animate({    
            height: 'toggle'              
        }, 600, function() { 
            if (!bound_keypress_f) {
                $(document).bind('keypress.f', function(event) {

                    if($('#secret').is(':visible')) {  
                        if ( event.which == 102 ) {
                            $('.content-2').fadeToggle();
                            $('.content-284').fadeToggle();
                        }

                        bound_keypress_f = true;
                    }
                    else {                        
                        $(document).unbind('keypress.f');                        

                        bound_keypress_f = false;
                    }
                });
            }
        });
}

答案 2 :(得分:0)

您正在绑定5个keypress.f事件(每次单击链接时绑定一个事件)。您可以通过几种不同的方式解决这个问题:

1)在绑定keypress.f事件之前取消绑定所有keypress.f事件。

2)在页面加载时绑定keypress.f事件,并在函数的开头添加if(标志)。只要单击链接,将标志设置为true。如果您不希望keypress.f触发该函数,请将该标志设置为false。