mousedown 上的复选框,mouseup 上取消选中

Checkbox on mousedown, uncheck on mouseup

我正在制作 jQuery 应用程序,其中有一个只有在 mouse/key/touch 被按下时才会被选中的复选框。选中 mousedown,取消选中 mouseup。

即使我使用 event.preventDefault(),如果鼠标按钮未按下,复选框仍处于选中状态,但空格键可以正常工作。

$(function() {
  var cb = $("input");
  cb
    .on("mousedown keydown", function(event) {
      event.preventDefault();
      cb.prop("checked", true);
    })
    .on("mouseup keyup", function(event) {
      event.preventDefault();
      cb.prop("checked", false);
    });
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type=checkbox autofocus>

我知道上面的代码需要一些工作才能在任何情况下(触摸等)正常工作,但它仅用于测试目的

问题是因为 click 事件在复选框上释放 mouseup 时触发,这迫使 checked 属性 变为 true。要修复此挂钩事件处理程序到 click 并简单地在其上调用 preventDefault()

另请注意,您可以向 on() 提供一个对象,该对象以您要挂钩的事件名称为键,而不是多次调用 on()

$(function() {
  var $cb = $("input");
  $cb.on({
    "mousedown keydown": function(e) {
      e.preventDefault();
      $cb.prop("checked", true);
    },
    "mouseup keyup": function(e) {
      e.preventDefault();
      $cb.prop("checked", false);
    },
    'click': function(e) {
      e.preventDefault();
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type=checkbox autofocus>

或者,正如@enapupe 在评论中指出的那样,您可以完全删除 mouseup 事件处理程序,让默认的 click 事件 运行 正常切换状态复选框:

$(function() {
  var $cb = $("input");
  $cb.on({
    "mousedown keydown": function(e) {
      e.preventDefault();
      $cb.prop("checked", true);
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type=checkbox autofocus>

两者都可以,这仅取决于您希望在抑制 click 事件时采取的行为