为什么javascript将1添加到setInterval id?

时间:2011-03-30 09:58:35

标签: javascript jquery

$('#interviehover').hover(function(){
            IntervalId = setInterval(sec, 500)
            alert(IntervalId)
        });
        $('#interviehover').mouseout(function(){
            clearInterval(IntervalId)
            alert(IntervalId )
        });

在mouseout事件触发后,我获得IntervalId并添加1;例如,在悬停时它会警告12059,但在鼠标输出12060上?

谢谢!

4 个答案:

答案 0 :(得分:2)

问题是你使用'悬停'而不是'鼠标悬停'。 鼠标悬停和鼠标移动似乎都会触发悬停:

$('#interviehover').mouseover(function() {
    IntervalId = setInterval(sec, 500);
    alert("hover:"+IntervalId);
});
$('#interviehover').mouseout(function() {
    clearInterval(IntervalId);
    alert("mouseout:"+IntervalId);
});

悬停的签名有2个函数,一个用于mouseenter,一个用于mouseleave:

.hover( handlerIn(eventObject), handlerOut(eventObject) )

答案 1 :(得分:1)

在您的示例中setInterval可能被多次调用,因此IntervalId的值将被覆盖。

请勿将alerthover / mouseout结合使用,尤其是在调试时。出现的警报窗口将导致意外触发这些事件。

不要使用可以覆盖的全局变量,或者可以多次执行setInterval,并且只能清除最后一个。

hover()有两个参数,一个用于mouseover事件,一个用于mouseout事件。要么不使用hover()并设置mouseovermouseout,要么不使用mouseout并使用hover的两个参数。

答案 2 :(得分:0)

您看到错误,因为当您只传递一个函数时,您的悬停功能会运行两次。

您可以将其更改为两个参数,然后它将停止您所看到的内容:

var IntervalId;
$('#interviehover').hover(function() {

    IntervalId = setInterval(sec, 500)
    $('#result').append('Starting with ID: '+ IntervalId +'<br/>');
}, function() {
    clearInterval(IntervalId)
    $('#result').append('Cleared ID: '+ IntervalId +'<br/>');
});

function sec() {
    $('#result').append('Running with ID: '+ IntervalId +'<br/>');
}

看看上面的working here

答案 3 :(得分:0)

正如您在查看jquery悬停方法时所看到的那样:

hover: function( fnOver, fnOut ) {
    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}

如果只提供了1个功能,它会将它用于进入和离开。 进入时,它会设置一个计时器。然后当你离开时,它再次设置一个新的计时器。 第二个计时器ID可能是第一次+ 1 虽然它被指定为“独特”,但很有可能它被实现为增量(因为它也是唯一的)