在事件中设置延迟

时间:2017-12-13 02:10:11

标签: javascript jquery

我的代码 -

hits.on('rowSelected', function (evt) {
    setTimeout(function() { alert('hi'); }, 5000); 
});

所以我有一个hits表。在该表中选择行时,将触发此事件。问题是我想要再次选择一行5秒钟。 IMO,这不起作用,因为每次选择一行时,表上的事件都会被触发,而不会给setTimeout时间延迟。

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我建议使用变量来存储元素是否已被点击。

在检查此变量的setTimeout()条件内运行if。单击元素后,更新变量,以便不再单击它。然后,一旦超时解决,再次启用单击。

这可以在以下内容中看到:



var hits = $("p");
var clickable = true; // It's clickable by default

hits.on('click', function(evt) {
  if (clickable) { // Check whether it can be clicked
    clickable = false; // Once clicked, don't allow further clicks
    setTimeout(function() {
      alert('hi');
      clickable = true; // Make it clickable again
    }, 5000);
  }
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>Click this paragraph.</p>
&#13;
&#13;
&#13;

希望这有帮助! :)

答案 1 :(得分:0)

我可以提出的最优雅的解决方案是使用按钮来模拟行为。

它的工作原理如下:

  1. 将命名事件处理程序(handler)绑定到该元素,并使用jQuery的one()仅执行一次。
  2. 在事件处理程序中,处理事件。
  3. 使用setTimeout()等待5秒钟,然后重新绑定事件处理程序以进行下一次执行。
  4. &#13;
    &#13;
    let button = $('#button');
    
    button.one('click', function handler() {
      console.log('clicked'); // handle event here
    
      setTimeout(() => $(this).one('click', handler), 5000);
    });
    &#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <button id="button">Click me!</button>
    &#13;
    &#13;
    &#13;

    这种方法有以下好处:

    • 不需要外部变量来保存事件处理程序的状态(即它是否处于活动状态)。
    • 不需要解除事件处理程序的绑定,因为每次它只绑定一次只执行一次。
    • 不会使用命名的事件处理程序污染外部作用域。