
在 html 表单的 `onsubmit="..."` 内联事件处理器中,若需访问原生事件对象(如调用 `preventdefault()`),必须显式将 `event` 作为参数传入函数,否则形参将为 `undefined`。
当使用内联 JavaScript 绑定表单提交事件时,浏览器会自动创建并触发 submit 事件,但不会自动将事件对象注入到你的函数调用中。你写的 onsubmit="usernamePasswordLogin();" 相当于不带任何参数地调用函数,因此函数形参 x 始终是 undefined。
✅ 正确做法是在 HTML 中显式传入全局 event 对象:
对应 JavaScript:
function usernamePasswordLogin(e) {
e.preventDefault(); // 阻止表单默认提交行为
console.log('event object:', e);
console.log('target form:', e.target); // 即 #fm1 元素
}⚠️ 注意事项:
- event 是浏览器提供的全局只读变量(在事件处理上下文中可用),仅在内联 handler(如 onsubmit="...")中可直接引用;
- 更推荐的现代写法是分离 HTML 与 JS,使用 addEventListener:
document.getElementById('fm1').addEventListener('submit', function(e) {
e.preventDefault();
console.log('Event handled cleanly via addEventListener');
});这种方式更易维护、支持事件委托、避免全局污染,且无需手动传参 —— 浏览器自动将事件对象作为第一个参数传入回调函数。
? 小结:内联 onsubmit 中想拿到事件对象,必须写 onsubmit="fn(event)";但出于可维护性与最佳实践,应优先采用 addEventListener 方式绑定事件。










