【问题标题】:How to stop a function from running, or how to run a function only when a checkbox is checked on jQuery?如何停止函数运行,或者仅在 jQuery 上选中复选框时如何运行函数?
【发布时间】:2019-07-27 07:08:02
【问题描述】:

我试图仅在选中复选框时检测按键,但是在第一次激活复选框后,它总是运行其功能。

这是“我的”代码:

var keys = {};
$(":checkbox").click(function() {
    if(this.checked) {
        $(document).keydown(function (e) {
            e.preventDefault()
            keys[e.which] = true;
            printKeys(e);
    });

    $(document).keyup(function (e) {
        e.preventDefault()
        delete keys[e.which];
        printKeys(e);
    });
}

if(this.checked) 中的内容只有在选中复选框后才会执行,但之后它总是会检测到我的按键,无论复选框是否被选中。

【问题讨论】:

  • 每次单击复选框时,您都会添加一个事件处理程序。这意味着如果未选中该复选框,则事件处理程序将保留。如果您不希望它运行,请在未选中复选框时删除事件处理程序。或者,一直监听事件,只在勾选复选框时在事件监听器中做某事。

标签: jquery


【解决方案1】:

请阅读编辑,因为此解决方案不是非常理想

感谢 Heretic Monkey,我找到了一种解决方法,我只需要添加一个 else 语句,一旦取消选中复选框,就可以关闭 $(document) 事件处理程序,如下所示:

var keys = {};
$(":checkbox").click(function() {
    if(this.checked) {
      $(document).keydown(function (e) {
        e.preventDefault()
        keys[e.which] = true;
        printKeys(e);
      });

      $(document).keyup(function (e) {
        e.preventDefault()
        delete keys[e.which];
        printKeys(e);
      });
    } else {
      $(document).off();
    }
});

我不知道这是否是最佳解决方案,但它确实有效。

重要修改

正如 cmets 指出的,不建议关闭可能需要稍后执行的事件处理程序,另一种解决方法是始终侦听按键,但仅在选中复选框时才运行该函数,如下所示:

$(document).keydown(function (e) {
  console.log($(":checkbox").is(":checked"));
  if($(":checkbox").is(":checked")) {
    e.preventDefault();
    keys[e.which] = true;
    printKeys(e);
  }
});

$(document).keyup(function (e) {
  if($(":checkbox").is(":checked")) {
    e.preventDefault();
    delete keys[e.which];
    printKeys(e);
  }
});

【讨论】:

  • 我真的不建议打开和关闭事件。一旦您引入任何其他事件,您的off() 将停止所有其他事件处理程序,并且很难确定原因。
  • 如果您阅读了我的评论的其余部分,或者可能的重复,您会发现最好始终收听keydown,并且只有在选中该复选框时才执行某些操作。跨度>
  • 对不起,也许我不应该这么急于寻找答案并回答自己,无论哪种方式你建议总是收听事件但只执行一次复选框检查也有效,我想我会采用这种方法。
猜你喜欢
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多