简体   繁体   English

如何将setTimeout和clearTimeout设置为在同一按钮上起作用

[英]How do I set setTimeout and clearTimeout to function on the same button

Here is my code 这是我的代码

$('#btnDelete').unbind().click(function(){
    var time = setTimeout(function() {
        $.ajax({
            type: 'ajax',
            method: 'get',
            async: false,
            url: '<?php echo base_url() ?>main/delete',
            data: {id:id},
            dataType: 'json',
            success: function(response){
                if(response.success){
                    showNews();
                } else {
                    alert('Error');
                }
            },
            error: function(){
                alert('Error deleting')
            }
        });
    }, 10000);
});

Where can i place the clearTimeout() function so that each time i click the same button the timer resets? 我在哪里可以放置clearTimeout()函数,以便每次单击同一按钮时计时器都会重置? Thanks! 谢谢!

Try this: 尝试这个:

  var time;
  $('#btnDelete').unbind().click(function() {
    if (time) {
      clearTimeout(time);
      time = null;
    }
    time = setTimeout(function() {
      $.ajax({
        type: 'ajax',
        method: 'get',
        async: false,
        url: '<?php echo base_url() ?>main/delete',
        data: {
          id: id
        },
        dataType: 'json',
        success: function(response) {
          if (response.success) {
            showNews();
          } else {
            alert('Error');
          }
        },
        error: function() {
          alert('Error deleting')
        }
      });
    }, 10000);
  });

Make time as a global variable or accessible outside the click handler. time作为全局变量或在点击处理程序之外可以访问。 Check the value of time, if it has any value then reset it else your normal code will work. 检查时间值,如果有任何值,则将其重置,否则您的常规代码将起作用。

Use a data attribute to hold the state of the timer. 使用数据属性保存计时器的状态。 You can use the data attribute to determine if you need to cancel it. 您可以使用data属性来确定是否需要取消它。 You store the timeout id into the data attribute and on the click you check for it. 您将超时ID存储到data属性中,然后单击以对其进行检查。

$('#btnDelete').unbind().click(function(){
   var btn = $(this);  // reference the button that was clicked
   if (btn.data("timer")) {  // determine if it was already clicked
      window.clearTimeout(btn.data("timer"))  // cancel the timeout
      btn.data("timer", null);  // toggle it to not being used
   } else {
     var time = setTimeout(function() {
       btn.data("timer", null);  // reset it if you want
       /* your code here */
     }, 10000)
     btn.data("timer", time);  // store the timeout id for next click
   }
});

if you want it to restart than do not do the else and there is no need to set the data attribute to null since you will overwrite it. 如果您要重新启动它,则不要执行else,并且不需要将data属性设置为null,因为您将覆盖它。

$('#btnDelete').unbind().click(function(){
   var btn = $(this);
   if (btn.data("timer")) {
      window.clearTimeout(btn.data("timer"))
   }
   var time = setTimeout(function() {
       btn.data("timer", null);  // reset it if you want
       /* your code here */
   }, 10000)
   btn.data("timer", time);
});

Example running on multiple buttons 在多个按钮上运行的示例

 $('.btn-delete').unbind().click(function(){ var btn = $(this); // reference the button that was clicked if (btn.data("timer")) { // determine if it was already clicked window.clearTimeout(btn.data("timer")) // cancel the timeout btn.data("timer", null); // toggle it to not being used } else { var time = setTimeout(function() { btn.data("timer", null); // reset it if you want btn.text((new Date()).toLocaleString()) }, 3000) btn.data("timer", time); // store the timeout id for next click } }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button class="btn-delete">Delete 1</button> <button class="btn-delete">Delete 2</button> <button class="btn-delete">Delete 3</button> <button class="btn-delete">Delete 4</button> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM