如果已经有x个时间,如何激活mouseleave?

时间:2012-07-03 22:16:35

标签: javascript jquery

所以,我有这种情况,但是如果用户“mouseleave(s)”超过x时间,比如一秒,我只想做“做某事”。我应该如何实现呢?

$("#someElement, #someOtherElement").mouseleave(function() {
   // Do something.
});

后来我补充道:

    $('.popover3-test').popover({
        placement:'bottom',
        template: $('.popover2'),
        trigger: 'manual',

        }).mouseenter(function(e) {
        $(this).popover('show');

        $(".popover3-test, .popover2").each(function() {
            var t = null;

            $(this)
                .mouseleave(function() {
                    t = setTimeout(function() {
                        $('.popover2').hide();
                    }, 1000); // Or however many milliseconds
                })
                .mouseenter(function() {
                    if(t !== null)
                        clearTimeout(t);
                })
            ;
        });


});

3 个答案:

答案 0 :(得分:5)

setTimeout应该这样做:

$("#someElement, #someOtherElement").each(function() {
    var t = null;

    $(this)
        .mouseleave(function() {
            t = setTimeout(function() {
                // Do something.
            }, 1000); // Or however many milliseconds
        })
        .mouseenter(function() {
            if(t !== null) {
                clearTimeout(t);
                t = null;
            }
        })
    ;
});

编辑:如果您希望它可以使用它,只需删除.each

var t = null;

$("#someElement, #someOtherElement")
    .mouseleave(function() {
        t = setTimeout(function() {
            // Do something.
        }, 1000); // Or however many milliseconds
    })
    .mouseenter(function() {
        if(t !== null) {
            clearTimeout(t);
            t = null;
        }
    })
;

答案 1 :(得分:3)

$("#someElement, #someOtherElement").bind('mouseenter mouseleave', (function() {

    var timer;

    return function (e) {

       if(e.type === 'mouseleave') {
          timer = setTimeout(function () {
             //do something
          }, 1000);
       }  else {
          clearTimeout(timer);
       }

    };

}()));

编辑 - 可用于多个元素

$("#someElement, #someOtherElement").bind('mouseenter mouseleave', function (e) {

       var timer = $(this).data('timer');

       if(e.type === 'mouseleave') {
          timer = setTimeout(function () {
             //do something
          }, 1000);
       }  else {
          clearTimeout(timer);
       }

       $(this).data('timer', timer);    
    };

});

答案 2 :(得分:2)

这可能不会按原样运作,但会给你一些想法......

var elapsed = 0;
var timer = setInterval(function(){
  elapsed += 20;
  if( elapsed >= 1000 ) {
     doSomething();
     clearInterval(timer);
  }
}, 20 );
$('#some').mouseleave(timer);
$('#some').mouseenter(function(){clearInterval(timer);elapsed=0;});