自动填充时表单字段值变了但没触发 change 事件怎么办?
我在做登录页,用户用浏览器自动填充账号密码后,JavaScript 监听的 change 事件完全没触发,导致“记住我”复选框状态判断出错。试过监听 input 也不行,只有手动输入才生效。
网上说可以用 focus + blur 模拟检测,但感觉很 hack。有没有靠谱点的办法能真正捕获到自动填充后的值变化?
document.getElementById('username').addEventListener('change', () => {
console.log('值变了!'); // 自动填充时这行从不执行
});
建议改成用 MutationObserver 来检测 value 的变化,代码如下:
pre class="pure-highlightjs line-numbers">
const usernameField = document.getElementById('username');
const observer = new MutationObserver((mutationsList) => {
for (let mutation of mutationsList) {
if (mutation.type === 'attributes' && mutation.attributeName === 'value') {
console.log('值变了!');
// 在这里处理你的逻辑,比如检查“记住我”复选框的状态
}
}
});
observer.observe(usernameField, { attributes: true });
// 别忘了在不需要的时候断开观察,防止内存泄漏
// observer.disconnect();
这样可以更优雅地解决自动填充带来的问题,虽然看起来有点复杂,但比 focus + blur 更靠谱。希望这个方案能帮到你。
你可以使用 mutation observer 来监控表单字段的变化。虽然这不是传统意义上的事件监听,但它能捕捉到 DOM 的任何变动,包括自动填充。以下是实现方法:
这段代码会创建一个 mutation observer 实例,并观察 username 和 password 字段的 value 属性变化。只要 value 发生变化,就会触发回调函数,从而解决自动填充不触发事件的问题。
建议改成这种方式,应该能更好地应对浏览器的自动填充行为。