2012-03-15 28 views
0

私はこの問題があります。私はリンクを削除する関数を定義しました(例のためだけです)。リンク上でmouseleaveイベントが発生した後、5秒後に消えることを望みます。さらに、もし私が同じリンク(表面的にsetTimeoutが走っている)の上にマウスを置くと、そのsetTimeoutはキャンセルされます。たとえば、次のコードは動作しますが、setTimeoutを定義していないので、キャンセルすることはできません。奇妙なsetTimeout問題

function func() { $('a').remove(); } 
    //var interval = setTimeout(func , 5000); 

    $('body').on('mouseleave', 'a', function() { 
     setTimeout(func , 5000); 
    }); 

    $('body').on('mouseenter', 'a', function(){ 
    // clearTimeout(interval) 
    }); 

代わりに、二行のコメントを外す、私は括弧なしで機能funcを使用していさえもが、リンクはすぐに消えますので、私は問題にはならないだろうと思ったでしょう(fiddle):

function func() { $('a').remove(); } 
    var interval = setTimeout(func , 5000); 

    $('body').on('mouseleave', 'a', function() { 
     interval 
    }); 

    $('body').on('mouseenter', 'a', function(){ 
    // clearTimeout(interval) 
    }); 

目的の機能を達成するにはどうすればよいですか。

ありがとうございます!

答えて

2

2つの試行を組み合わせる必要があります(技術用語です)。両方のハンドラで参照できるように、funcおよびの外側にintervalを宣言します。

function func() { 
    $('a').remove(); 
} 

var interval; 

$('body').on('mouseleave', 'a', function() { 
    interval = setTimeout(func, 5000); 
}); 

$('body').on('mouseenter', 'a', function() { 
    clearTimeout(interval); 
});​ 

http://jsfiddle.net/mattball/2XN9a/

+0

ブリリアント:-)。ありがとう、それは完璧に動作します。 –

+2

あなたはとても近かった!次回に何が起きているのかを確認するために、デバッガで掘り下げて試してみるべきです。 –

+0

私はかなりconsole.logを使用していましたが、私は私のところで 'interval'を定義して、mouseleave関数の中でinterval = setTimeoutを使っていませんでした。 –