【问题标题】:is(":hover") only working within a setInterval functionis(":hover") 仅在 setInterval 函数中工作
【发布时间】:2015-07-22 11:30:45
【问题描述】:

请看https://jsfiddle.net/cot33dxa/

setInterval(function() {
  if ($("#one").is(":hover")) {
    $("#one").css("background-color", "red");
  } else {
    $("#one").css("background-color", "");
  }
}, 0);

if ($("#two").is(":hover")) {
  $("#two").css("background-color", "blue");
} else {
  $("#two").css("background-color", "");
}
#one {
  width: 200px;
  height: 200px;
  background-color: yellow;
}
#two {
  width: 200px;
  height: 200px;
  background-color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="one"></div>
<div id="two"></div>

为什么对于 div 1,悬停检查工作正常,而在 div 2 中却不行?

我在使用if ($('#element:hover').length != 0)(取自ivo's solution)时遇到了同样的问题。

为此 JS 小提琴:https://jsfiddle.net/q8dfLc6s/

在更一般的意义上,我正在寻找最简单、最可靠的方法来了解鼠标是否在 JQuery 1.11.0 中的 div 上。就目前而言,除了这个 SetInterval 奇怪之外,我什至无法让布尔检查工作。

【问题讨论】:

  • 你为什么使用 setInterval 而不是 dom mouseover/enter/out/leave 事件 (jQuery hover) 或 :hover css 伪类(如果你只需要这个来做样式)?
  • 请在您的问题中发布您的代码。
  • 因为它在这里用于类似的问题stackoverflow.com/a/8981521/2472351 我试图对他的解决方案进行逆向工程,但不明白为什么布尔检查会在 setInterval 函数被分解后停止工作

标签: javascript jquery


【解决方案1】:

不要将您的代码移动到 setInterval 中: 您的第二个示例“不起作用”的原因是它仅在页面加载后才会执行。另一方面,setInterval 每隔 ~0 执行一次,它“有效”。

但是要实现您想要做的事情,请考虑使用 .hover(),因为它正在侦听将光标移入或移出选择器的实际事件,并且不会执行您的 else 阻止所有时间:

$(function() {
    $("#two").hover(function() {
        $("#two").css("background-color","blue");
    }, function() {
        $("#two").css("background-color","");
    });
});

jsfiddle

【讨论】:

    【解决方案2】:

    好问题!通过将代码放在 setInterval 中,您实际上是在 event loop 中镜像浏览器在后台执行的操作。

    通常应该避免这种行为,而是用实际事件代替。

    在 jQuery 中这看起来像:

    $('#element').on( 'hover', function (this, event) {
        $element = this;
        /*handle event*/
    });
    

    更多:https://api.jquery.com/on/

    编辑:您正在运行的代码最好使用 :hover 选择器在 CSS 中完成:

    #element {
        background-color: blue
    }
    
    #element:hover {
        background-color: red
    }
    

    【讨论】:

      【解决方案3】:

      第二个不起作用,因为它不在间隔计时器内,因此该代码仅在页面加载时运行

      改成

      setInterval(function () {
          if ($("#one").is(":hover")) {
              $("#one").css("background-color", "red");
          } else {
              $("#one").css("background-color", "");
          }
      
      
          if ($("#two").is(":hover")) {
              $("#two").css("background-color", "blue");
          } else {
              $("#two").css("background-color", "");
          }
      
      }, 0);
      

      我不知道你为什么需要这个,不要只使用悬停事件或悬停 css

      DEMO

      【讨论】:

        【解决方案4】:

        您的小提琴的问题是您的第二次检查超出了区间函数。试试这个:

        setInterval(function(){
            if($("#one").is(":hover")) {
                $("#one").css("background-color","red");
            }
            else {
                $("#one").css("background-color","");
            }
        
            if($("#two").is(":hover")) {
                $("#two").css("background-color","blue");
            }
            else {
                $("#two").css("background-color","");
            }
        
        },0);
        

        【讨论】:

        • 但是为什么我需要使用区间函数呢?例如,如果我在 mouseclick 事件中使用这个布尔逻辑,我会遇到同样的问题。
        • @Amalgam54 在点击事件中,你必须在你点击的东西上,所以你不能将鼠标悬停在其他东西上。
        • 因为布尔逻辑只执行一次。您需要像在其他问题中使用的那样使用 mouseleave 事件。
        • 哦,它在您的事件函数中不起作用?你能发布你的鼠标点击事件处理程序的代码吗?
        • @Tatermelon try jsfiddle.net/w953arn8 ,它似乎只有在你快速反复将鼠标移入和移出 div 时才有效
        猜你喜欢
        • 2012-09-21
        • 2021-03-08
        • 1970-01-01
        • 2018-03-01
        • 2020-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        相关资源
        最近更新 更多