如何实现仅Enter键keyup时提交表单 解决事件不生效问题
失效原因
你的自定义逻辑没生效,核心是两个问题:
- 内联事件绑定写法错误:
onkeyup="keypressHandler"只写了函数名,既没有实际调用函数,也没传入事件对象,按键松开时根本不会执行你写的判断逻辑。 - 用了已被Web标准废弃的
keyCode属性,部分新版本浏览器中无法正确获取键值。
正确写法
直接修改内联事件的调用方式,传入事件对象,同时用兼容性更好的按键判断逻辑:
<input id="filter_package_byidphrase" asp-for="@Model.FilterByPackageIdPhrase" class="package_list_list_filter_controll_input" onkeyup="keypressHandler(event)"> <script type="text/javascript"> function keypressHandler(e) { // 同时兼容新旧标准判断是否按下回车键 if(e.key === 'Enter' || e.keyCode === 13) { e.preventDefault(); // 提交对应表单,提前确认页面上表单id确实是filterform document.getElementById('filterform').submit(); // 如果项目里引入了jQuery,也可以替换成 $('#filterform').submit(); } } </script>
更推荐的分离式写法
如果不想把JS逻辑写在标签属性里,可以用事件绑定的方式分离结构和逻辑,后续维护更方便:
<!-- 移除input上的onkeyup属性 --> <input id="filter_package_byidphrase" asp-for="@Model.FilterByPackageIdPhrase" class="package_list_list_filter_controll_input"> <script type="text/javascript"> const searchInput = document.getElementById('filter_package_byidphrase'); searchInput.addEventListener('keyup', function(e) { if(e.key === 'Enter') { e.preventDefault(); // 如果输入框本身就在目标表单内部,也可以直接写 this.form.submit(),不用硬编码表单id document.getElementById('filterform').submit(); } }) </script>
注意:如果输入框本身就在表单内部,回车键默认就会触发表单提交,不需要额外绑定keyup事件;如果出现默认提交行为和自定义逻辑冲突的情况,再用
e.preventDefault()阻止默认行为即可。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

