jquery clearTimeout()仅限Firefox中的错误行为

时间:2011-08-06 17:32:26

标签: jquery

此代码(某种工具提示)在IE,Opera,chrome,safari中运行良好。但不是在Firefox中。 我认为问题出在clearTimeout()函数中。有谁知道出了什么问题?

谢谢!

$('.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 :(得分:1)

此代码假定tmtm_img是全局变量。它还假设页面中只有一个对象具有.go_info类,因为如果该类有多个对象,则多个事件处理程序都在尝试使用相同的全局变量,并且它们可能会混乱其他的。

更安全的代码版本就是这样的(变量现在是局部变量,定时器是按DOM对象而不是全局变量持久存储的):

$('.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();   
});

其他可能出错的事情:

  1. 您没有向我们展示您的HTML并且您正在进行一些id字符串操作,因此您可能没有正确的ID来使$("#tooltip_"+q_tooltip_img)正常工作。
  2. 您正在设置两个超时完全相同的时间(1秒),这似乎很奇怪。为什么两次超时?为什么不设置一个并在一个工作中做两件事呢?
  3. 你应该在mouseleave函数中放置断点或console.log()行,并确认它在你预期时被调用,并且它正在找到$(“#tooltip _”+ q_tooltip_img)对象。
  4. 正如您在this jsFiddle中所看到的,如果一切正确,基本概念将与ID操作一起使用。如果您仍然无法弄明白,我建议您发布相关的HTML。