【问题标题】:Javascript "while hovered" loopJavascript“悬停时”循环
【发布时间】:2010-11-24 09:58:32
【问题描述】:

谁能帮我解决这个问题...我有一个按钮,当它悬停时会触发一个动作。但只要按钮悬停,我希望它一直重复。

我很感激任何解决方案,无论是在 jquery 还是纯 javascript 中 - 这是我的代码此时的样子(在 jquery 中):

var scrollingposition = 0;

$('#button').hover(function(){
++scrollingposition;
    $('#object').css("right", scrollingposition);
    });

现在我怎样才能把它放到某种while循环中,以便#object在#button悬停时逐像素移动,而不仅仅是当鼠标进入它时?

【问题讨论】:

标签: javascript jquery hover


【解决方案1】:

好的......答案又一次尝试:

$('myselector').each(function () {
  var hovered = false;
  var loop = window.setInterval(function () {
    if (hovered) {
      // ...
    }
  }, 250);

  $(this).hover(
    function () {
      hovered = true;
    },
    function () {
      hovered = false;
    }
  );
});

250 表示任务每四分之一秒重复一次。您可以减少此数字以使其更快,或增加它以使其更慢。

【讨论】:

  • 很高兴它对您有用。我对这个解决方案不是 100% 满意,因为我确信必须有一个更干净的解决方案......这个解决方案的循环一直在运行(即使没有悬停),它为每个元素设置了一个新循环在选择器中。所以如果有人有更好的东西,请提出建议。
  • @NathanMacInnes:你的代码是一个好的开始,所以我赞成它。但是我发布了一个更正,不要重复调用该函数(不悬停元素时不需要):stackoverflow.com/a/14284748/517705.
【解决方案2】:

Nathan's answer 是一个好的开始,但是你也应该在鼠标离开元素(mouseleave 事件)时使用window.clearInterval 来取消使用@987654324 设置的重复动作@,因为这样“循环”只有在鼠标指针进入元素时才会运行(mouseover事件)。

这是一个示例代码:

  function doSomethingRepeatedly(){
    // do this repeatedly when hovering the element
  }

  var intervalId;

  $(document).ready(function () {

    $('#myelement').hover(function () {
      var intervalDelay = 10;
      // call doSomethingRepeatedly() function repeatedly with 10ms delay between the function calls
      intervalId = setInterval(doSomethingRepeatedly, intervalDelay);
    }, function () {
      // cancel calling doSomethingRepeatedly() function repeatedly
      clearInterval(intervalId);
    });

  });

我在 jsFiddle 上创建了一个示例代码,它演示了如何使用上面显示的代码从左到右滚动元素的背景图像,然后在 hover 上向后滚动:

http://jsfiddle.net/Sk8erPeter/HLT3J/15/

【讨论】:

    【解决方案3】:

    如果是动画,您可以在中途“停止”动画。所以看起来你正在向左移动一些东西,所以你可以这样做:

    var maxScroll = 9999;
    $('#button').hover(
        function(){ $('#object').animate({ "right":maxScroll+"px" }, 10000); },
        function(){ $('#object').stop(); } );
    

    【讨论】:

    • 这不是一个好方法,因为您的速度将无处不在。例如,如果我们悬停一点开始,我们的速度是 9999/10000(大约 1px/ms),如果我们出来再次悬停,假设我们第一次滚动到一半,现在我们在 4999/1000,或 0.5px/ms...您的持续时间需要根据剩余的行驶距离来计算,否则它将与它成正比,并且总是在变化。
    • 嗨,感谢大家提供有用的答案,我仍然需要一点才能使它真正起作用:内森,虽然您的解决方案对我来说非常有意义,但由于某种原因它不起作用,但会阻塞(“此页面上的脚本太忙或没有响应 - 托马斯,您的解决方案有效,除了尼克指出的速度问题,但对我来说,它的表现不同,对象在悬停时不断加速,当我悬停时再回来,它又开始变慢并加快速度......有没有人知道如何推动这些解决方案发挥作用?非常感谢大家投入的时间
    【解决方案4】:
    var buttonHovered = false;
    $('#button').hover(function () {
      buttonHovered = true;
      while (buttonHovered) {
        ...
      }
    },
    function () {
      buttonHovered = false;
    });
    

    如果您想对多个对象执行此操作,最好让它比全局变量更面向对象。

    编辑: 认为处理多个对象的最佳方法是将其放在 .each() 块中:

    $('myselector').each(function () {
      var hovered = false;
      $(this).hover(function () {
        hovered = true;
        while (hovered) {
          ...
        }
      },
      function () {
        hovered = false;
      });
    });
    

    编辑2: 或者你可以通过添加一个类来做到这一点:

    $('selector').hover(function () {
      $(this).addClass('hovered');
      while ($(this).hasClass('hovered')) {
        ...
      }
    }, function () {
      $(this).removeClass('hovered');
    });
    

    【讨论】:

    • 嗨,Nathan,是的,我需要在多个对象上使用它,如果有办法可以与我分享,我将不胜感激 - 我来自 php、javascript 新手...谢谢
    【解决方案5】:
    var scrollingposition = 0;
    
    $('#button').hover(function(){
        var $this = $(this);
        var $obj = $("#object");
        while ( $this.is(":hover") ) {
            scrollingposition += 1;
            $obj.css("right", scrollingposition);
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多