【问题标题】:input[type=number] continuously increasing when clicking on arrows in Chrome and Edge在 Chrome 和 Edge 中单击箭头时输入 [type=number] 不断增加
【发布时间】:2020-12-12 01:33:20
【问题描述】:

我遇到以下问题:加载特定的 jQuery 库后,如果单击数字输入箭头,输入值会不断增加(或减少),直到焦点移到输入元素之外。

input 事件绑定到元素显示它一直在触发,这让我相信某些代码会一直在循环中设置element.value。但这并没有发生。

我已将问题追溯到在 mouseup 事件中调用 event.preventDefault()

见:

document.body.addEventListener('mouseup', (e) => {
    e.preventDefault();
});
<input type="number">

为什么会这样?

【问题讨论】:

  • 请包括所有相关代码在问题本身不仅在像jsfiddle这样的外部网站上。

标签: javascript html google-chrome microsoft-edge


【解决方案1】:

以下问题与jQuery无关。问题是代码正在做你想做的事。 在代码<input type="number" /> 中有 2 个事件。一是'mousedown',二是'mouseup'。

考虑以下示例:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_event_preventdefault2

上面的例子也是如此。

你正在做的是cancelling the 2nd part, ie mouseup,所以如果你做mousedowncancel mouseup,那么数字将:

  1. 如果你向上推,继续增加
  2. 如果按向下箭头继续减少

唯一令人惊讶的是,如果您将代码添加事件写入input 而不是body,这将是完全合理的,但无论如何似乎browser by default is increasing or decreasing number -- based on event-bubbling to body

注意:下面复制了这个问题,但没有添加任何 jQuery!

document.body.addEventListener('mouseup', (e) => {
  e.preventDefault();
});
<input type="number">

【讨论】:

  • 我同意,这是input[type=number] 的默认浏览器行为,现在更有意义了。禁用mouseup 将使其保持增加(并防止您停止释放鼠标),而禁用mousedown 将禁用增加...只是希望有更好的方法来了解元素的默认行为。谢谢。
【解决方案2】:

我无法通过搜索导致这些无限增加的输入的原因来查找信息。

只有在自己找到原因后,我才发现阻止默认 mousemove (https://stackoverflow.com/a/37521764/6849064) 时发生的类似错误。虽然,这似乎不再发生了。

看起来这是一个 Chrome(和 Edge)错误。但正如https://stackoverflow.com/a/65253876/6849064 所说,这实际上是默认行为,按照他所说的方式是有道理的。我本人未能在任何地方找到这种标准行为。解决问题的一种方法是停止将事件冒泡到文档,

document.querySelector('input').addEventListener('mouseup', (e) => {
    e.stopPropagation();
});

另一个是,嗯,不阻止默认行为。

【讨论】:

  • 感谢您发布此问题的解决方案。您可以将您的答案标记为已接受的答案。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2019-09-02
  • 2018-07-04
  • 2017-05-06
  • 2016-02-11
相关资源
最近更新 更多