在专注于输入时按 enter 会触发同级按钮
Pressing enter while focused on input causes sibling button to fire
在 React 应用程序中,有一个带有一些按钮和输入的表单,如下所示:
<form>
<div>
{
['1', '10', '100'].map(val => (
<button onClick={() => console.log(val)}>
{val}
</button>
}
</div>
<div>
<input type='string' />
</div>
</form>
当焦点在输入字段上时,按 'Enter' 会触发第一个按钮 (console.log('1')
)。
这似乎与某些默认表单行为有关,因为将 <form>
元素更改为 <div>
,解决了该问题。
并且将 event.preventDefault()
添加到输入的 onKeyDown
处理程序也解决了这个问题,这表明涉及一些事件冒泡。
据我了解,当焦点位于表单中的输入字段时按 'Enter' 会导致表单提交,而事件冒泡应该只会触发父处理程序,所以这让我很困惑,第一个按钮是在兄弟元素中将被触发
对,没错,按钮元素里有type
属性-https://www.w3schools.com/jsref/prop_pushbutton_type.asp
此外,您会注意到默认的 type
属性 是 submit
,这意味着按下 enter
键时可以触发按钮。
我认为您可以通过将 type
属性 设置为 button
来解决问题,如下所示。
<button type="button" />
在 React 应用程序中,有一个带有一些按钮和输入的表单,如下所示:
<form>
<div>
{
['1', '10', '100'].map(val => (
<button onClick={() => console.log(val)}>
{val}
</button>
}
</div>
<div>
<input type='string' />
</div>
</form>
当焦点在输入字段上时,按 'Enter' 会触发第一个按钮 (console.log('1')
)。
这似乎与某些默认表单行为有关,因为将 <form>
元素更改为 <div>
,解决了该问题。
并且将 event.preventDefault()
添加到输入的 onKeyDown
处理程序也解决了这个问题,这表明涉及一些事件冒泡。
据我了解,当焦点位于表单中的输入字段时按 'Enter' 会导致表单提交,而事件冒泡应该只会触发父处理程序,所以这让我很困惑,第一个按钮是在兄弟元素中将被触发
对,没错,按钮元素里有type
属性-https://www.w3schools.com/jsref/prop_pushbutton_type.asp
此外,您会注意到默认的 type
属性 是 submit
,这意味着按下 enter
键时可以触发按钮。
我认为您可以通过将 type
属性 设置为 button
来解决问题,如下所示。
<button type="button" />