Javascript 是否可以设置输入元素的更改前值

Javascript 是否可以设置输入元素的更改前值,javascript,javascript-events,Javascript,Javascript Events,我有一个带有onchange事件的输入元素。如果值不被接受,onchange事件会提醒用户,并将焦点返回到输入元素。 但是,如果用户单击元素外,onchange事件不会触发-这是可以理解的,因为用户没有做进一步的更改,但它引入了只验证一次的问题 我探索了一种可能的解决方案,将值重置为更改前的值,但为了允许用户更正输入的值,而不必再次键入整个内容,我希望尽可能避免这种情况 另一种可能性是将验证放在模糊事件中,但这会引入其他问题,例如如果聚焦其他元素,则会触发其他元素上的事件 因此,我的问题是,如果

我有一个带有onchange事件的输入元素。如果值不被接受,onchange事件会提醒用户,并将焦点返回到输入元素。 但是,如果用户单击元素外,onchange事件不会触发-这是可以理解的,因为用户没有做进一步的更改,但它引入了只验证一次的问题

我探索了一种可能的解决方案,将值重置为更改前的值,但为了允许用户更正输入的值,而不必再次键入整个内容,我希望尽可能避免这种情况

另一种可能性是将验证放在模糊事件中,但这会引入其他问题,例如如果聚焦其他元素,则会触发其他元素上的事件


因此,我的问题是,如果用户将输入值从“X”更改为“Y”,我是否可以将焦点返回到元素,将值保留为“Y”,但使其将“X”视为更改前的值,因此,如果用户将其更改回“X”,更改事件将不会随后触发,但如果他们将其保留为“Y”,并再次失去焦点,更改事件再次激发,就像从“X”更改为“Y”?

为什么不将字段标记为无效(使用CSS或jQuery添加标记),而不是使用警报?该字段将保持无效,直到用户将值更改为有效值,并且验证脚本删除无效标记

输入类型是否为文本?在这种情况下,我更喜欢使用onkeyup而不是onchange,这正是您所描述的原因


有时甚至这样也不起作用:当使用鼠标将文本粘贴到文本框中时,这不会捕获更改,因为没有按下键(但按住shift+insert或ctrl+v)。您可能希望将同一事件添加到onchange和onkeyup中,以覆盖所有基础。

无论我使用CSS、jQuery还是警报,都不是问题的真正原因。问题是,我必须将焦点返回到元素,不幸的是,这意味着后续更改事件将基于“新”值而不是原始值。用户提供表单元素焦点。用户更改值。值无效,并被标记为无效,而表单元素不会失去焦点。用户再次更改值。值被检查为有效,无效标记被删除。它是文本类型,并且只接受数值(使用onkeyup和onkeypress组合来抑制无效字符)。这不是问题所在。我的场景是,如果我想添加一个onchange事件来检查最终键入的数字是否在最小值和最大值之间(我显然不能使用onkeyup),我需要使用onchange,问题如前所述,即onchange将在第一时间触发,将焦点放回元素,但是,如果用户再次单击/签出,则不会再次触发。这是可能提交的表单的一部分吗?如果是这样,我会这样做:使用onkeyup事件设置文本框的样式(如Tim在回答中所建议的),或者在文本框后插入/删除消息。使用附加到forms onsubmit事件的单独事件阻止表单提交,并在用户忽略警告时发出警告。这是您问题的合理解决方案吗?重新阅读您的问题后,您是否希望文本框在任何阶段都保留无效值?是的,完全正确。这是一个自我验证的自定义控件。