本文详解在启用 `type="module"` 的 html 环境下,如何安全、可靠地通过 `onblur` 事件获取 `` 元素的值,并解决因模块作用域、执行时机及事件绑定方式不当导致的 `undefined` 或 `cannot access 'document'` 等常见错误。
在现代前端开发中,使用 type="module" 加载 JavaScript 是推荐实践,但它带来两个关键约束:模块默认处于严格模式且具有顶层作用域隔离,同时 模块脚本默认延迟执行(deferred) —— 即 DOM 尚未完全解析完成时,模块代码可能已开始运行(尤其当
1. 修改 HTML:移除内联 onblur,保留语义化结构
⚠️ 注意:type="input" 是无效属性,应改为 type="text"(或 type="number" 更合适)。
2. 更新 GetElement.
mjs(优化函数职责)
// GetElement.mjs
export function getFranchiseFee(inputElement) {
if (!inputElement || !(inputElement instanceof HTMLInputElement)) {
console.warn('Invalid input element passed to getFranchiseFee');
return NaN;
}
const value = inputElement.value.trim();
return value ? parseFloat(value) : 0;
}✅ 优势:函数只负责“解析值”,不耦合 DOM 查询逻辑,可复用、易测试。
3. 在 main.js 中安全绑定事件
// main.js
import { getFranchiseFee } from './GetElement.mjs';
// 确保 DOM 加载完成后再执行
document.addEventListener('DOMContentLoaded', () => {
const input = document.getElementById('franchiseFee');
if (!input) {
console.error('Input element with id "franchiseFee" not found');
return;
}
input.addEventListener('blur', (e) => {
const value = getFranchiseFee(e.target);
console.log('Franchise Fee (parsed):', value); // ✅ 正确输出数值
// 后续可触发计算、校验、更新 UI 等逻辑
});
});