2011-08-06 3 views
0

このコード(ツールチップの何らかの種類)は、IE、opera、chrome、safariでうまくいきます。しかし、Firefoxではそうではありません。 問題はclearTimeout()関数にあると思います。誰が何が間違っているか知っていますか?jquery clearTimeout()Firefoxでの誤動作

ありがとうございました!

$('.go_info').live("mouseenter", function(e){ 

    var q_tooltip_img = $(this).attr('id'); 
    tm = setTimeout(function(){ 
     $("#tooltip_"+q_tooltip_img).show(); 

     }, 1000); 
    tm_img = setTimeout(function(){ 
     $("#tooltip_img_"+q_tooltip_img).empty().html('<div class="PP_wait_loading"></div>'); 
     $("#tooltip_img_"+q_tooltip_img).load("PP_small_preview.php?ID="+q_tooltip_img); 
     }, 1000);  

}); 

$('.go_info').live("mouseleave",function(){ 
     clearTimeout(tm); 
     clearTimeout(tm_img); 
     var q_tooltip_img = $(this).attr('id'); 
     $("#tooltip_"+q_tooltip_img).hide(); 

}); 

このスクリプトは、マウスがgo_info divに入るとdivを表示させます。マウスがgo_info divを離れるとすぐに離れる必要があります。 これはすべてのブラウザでうまく動作しますが、FFからは除外されます。これはdivのちらつきを示しています。

+1

問題は何ですか?何がうまくいかない?何が起こると予想され、実際には何が起こるのですか? –

+0

'tm'と' tm_img'はグローバル変数でなければなりません。 –

+0

フェリックス、そうです、もっと具体的にする必要があります – joost

答えて

1

このコードは、tmtm_imgがグローバル変数であることを前提としています。また、ページ内にオブジェクトが1つしかないと仮定すると、クラスが.go_infoであると仮定します。そのクラスに複数のオブジェクトがある場合、複数のイベントハンドラがすべて同じグローバル変数を使用しようとしているため、間違っている可能性

$('.go_info').live("mouseenter", function(e){ 
    var q_tooltip_img = $(this).attr('id'); 
    var tm = setTimeout(function(){ 
     $("#tooltip_"+q_tooltip_img).show(); 
     }, 1000); 
    $(this).data("tm", tm); 
    var tm_img = setTimeout(function(){ 
     $("#tooltip_img_"+q_tooltip_img).empty().html('<div class="PP_wait_loading"></div>'); 
     $("#tooltip_img_"+q_tooltip_img).load("PP_small_preview.php?ID="+q_tooltip_img); 
     }, 1000);  
    $(this).data("tm_img", tm_img); 
}); 

$('.go_info').live("mouseleave",function(){ 
     clearTimeout($(this).data("tm")); 
     clearTimeout($(this).data("tm_img")); 
     var q_tooltip_img = $(this).attr('id'); 
     $("#tooltip_"+q_tooltip_img).hide(); 
}); 

他のものを:

コードのより安全なバージョンは、(変数はローカル変数とタイマーではなく、グローバル変数よりもDOMオブジェクトごとに永続的に保存されている今ある)このようなものになるだろうここに:

  1. あなたは私達にあなたのHTMLを示していないと、それはあなたがこの$("#tooltip_"+q_tooltip_img)作業の権利を作るのは非常に右のIDを持っていない可能性がありますので、あなたには、いくつかのID文字列操作を行っています。
  2. 全く同じ時間(1秒)で2つのタイムアウトを設定していますが、これは奇妙に見えます。なぜ2つのタイムアウトですか?なぜ1つだけを設定し、その両方の作業を行うのではないでしょうか?
  3. mouseleave関数にbreakpointまたはconsole.log()行を置いて、期待したときに呼び出され、$( "#tooltip _" + q_tooltip_img)オブジェクトが見つかったことを確認する必要があります。

this jsFiddleに見られるように、基本コンセプトはすべてが正しく行われればID操作で動作します。それでもわからない場合は、関連するHTMLを投稿することをお勧めします。

+0

これは理にかなっていますが、依然としてFF以外のすべてでのみ機能します。私はmouseleaveが問題を引き起こす可能性があることを感心しましたか? – joost

+0

mouseleave関数にブレークポイントまたはconsole.log()を配置しましたか?それは呼び出されているだけで働いていないのですか?それとも、まったく呼ばれていないのですか? – jfriend00

+0

私はいくつかの他の考えとそれが動作することを示すjsFiddleで私の答えを更新しました。 – jfriend00

関連する問題