添加e.preventDefault后表单页面仍刷新、控制台无法输出输入值如何解决?
问题原因
- 事件绑定逻辑被包裹在
myCode函数中,若该函数没有被主动调用,submit事件监听不会生效,表单会执行默认提交行为导致页面刷新 - 若你的
<script>标签是动态插入到body中,执行逻辑时表单、输入框等DOM元素还未加载完成,getElementById会返回null,绑定事件时报错中断执行,e.preventDefault自然不会生效 - 若存在其他脚本同时监听表单submit事件、或form标签自带
onsubmit="return true"等配置,也会覆盖阻止默认行为的逻辑
解决步骤
- 调整代码执行逻辑,确保DOM元素加载完成后再绑定事件,可选两种写法:
// 写法1:去掉多余的函数包裹,script放在body末尾执行 const form = document.getElementById('form'); const names = document.getElementById('names'); const password = document.getElementById('password'); // 提前判空避免元素不存在报错 if(form && names && password) { form.addEventListener('submit', function(e){ e.preventDefault(); console.log('form submitted'); console.log(names.value); console.log(password.value); }); }
// 写法2:保留myCode函数,监听DOM加载完成后调用 document.addEventListener('DOMContentLoaded', myCode); function myCode(){ const form = document.getElementById('form'); const names = document.getElementById('names'); const password = document.getElementById('password'); if(!form || !names || !password) return; form.addEventListener('submit', function(e){ e.preventDefault(); console.log('form submitted'); console.log(names.value); console.log(password.value); }); }
- 检查form标签的属性,删除自带的
onsubmit配置,避免多逻辑冲突 - 如果是动态插入script标签,确保插入时机在所有表单相关DOM元素渲染完成之后,避免拿不到元素
排查技巧
改完后如果还是有问题,打开浏览器控制台看有没有报错,要是提示Cannot read properties of null (reading 'addEventListener')这类错误,就说明表单/输入框元素没被获取到,优先调整脚本执行时机即可解决。
内容的提问来源于stack exchange,提问作者Jyoti
相关产品推荐
相关产品推荐

