【问题标题】:Is it a bug for a checkbox's state to change before the click event handler fires? [duplicate]在单击事件处理程序触发之前更改复选框的状态是否是错误? [复制]
【发布时间】:2014-01-18 05:10:45
【问题描述】:

在回答另一个问题时,我遇到了一些我认为非常奇怪的行为,我想知道这是否应该被视为错误,或者它是否存在于规范中。

可以在jsFiddle 观察到这种行为。

给定以下输入复选框元素:

<input type="checkbox" id="check" />

如果您要应用以下单击事件处理程序(我们将在此处使用 jQuery 以保持示例简洁):

$('#check').on('click', function (e) {
    console.log(this.checked);
    return false; //This prevents the default action from occurring.
});

您会在开发者控制台中看到:

true

这里实际发生的是复选框的状态在它进入点击事件处理程序之前发生了变化。但是,如果单击事件处理程序阻止默认操作,则复选框的状态为 reverted

这对我来说似乎是一个错误。如果不阻止默认操作,我希望复选框的状态仅在单击事件处理程序之后更新。

这是一个错误吗?这是应该向不同的浏览器分销商报告的事情吗?

(我目前只在 Chrome 中测试过)

【问题讨论】:

  • @j08691 我在搜索中没有看到,谢谢。这些基本上是同义词,尽管我不同意那里接受的答案中表达的观点。虽然我了解这里正在进行的机制,并且可以想象一种可以按照观察到的方式实现它们的场景,但我不同意它们必须以这种方式实现。我觉得在处理完所有事件处理程序之后改变状态会更直观。即使使用事务系统,也只需在事务中交换评估顺序。

标签: javascript html checkbox browser-bugs


【解决方案1】:

我不认为这是一个错误,但是如果您仔细考虑一下,就会完全理解为什么控制台的输出是 True

在第一次单击复选框时,该值设置为 true。它仅在您通过return false; 语句打印到控制台后设置为 false。所以无论你尝试多少次,输出总是会说True

【讨论】:

  • 是的,这就是我说状态正在恢复的原因。我明白为什么它被还原了。机械师没有问题。更多的是我觉得有缺陷的过程。在我看来,状态的改变应该发生在所有点击事件处理程序都被处理之后。
  • @crush 但是为什么呢?默认复选框操作是在单击时将该复选框设置为 true。因此,默认操作优先于您的点击操作。这意味着发生默认操作,然后执行该对象的任何其他单击事件处理程序。我知道你说你了解机制,所以如果你看看这个:jsfiddle.net/TTAUL/5 有一个严格的操作顺序。
  • 你知道我们在谈论 performDefaultAction(); if (!performDefaultAction) revertDefaultAction()if (!performDefaultAction) return; performDefaultAction(); 我会说两者都有道理,但从用户的角度来看,后者更直观。
  • @crush 是的,我愿意。 stackoverflow.com/questions/1357118/… 这可能比我能解释得更好一些。所以你真的必须寻找能防止事件冒泡的东西。
  • 我不是在寻找解决办法。我质疑实施的意识形态。实施可能按预期工作,但这是我质疑的意图。我认为如果它以不同的方式工作会更好。我将在创建此问题时忽略的重复问题中对此进行扩展。感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多