textarea的keyup事件属性未正常填充,JSON.stringify仅返回isTrusted
问题解析与解决办法
核心原因
你遇到的情况本质是DOM Event实例的属性特性导致的:
- DOM事件对象的大多数属性(比如
key、keyCode、target等)是访问器属性(getter/setter),而非可枚举的自有属性。 JSON.stringify()仅会序列化对象中可枚举的自有属性,所以这些访问器属性不会被包含在序列化结果里,只有isTrusted这种可枚举的属性会被保留。- 浏览器控制台的
console.log是特殊的:它输出的是对象的引用,当你在控制台展开对象时,才会实时读取所有属性的当前值,所以能看到完整的事件信息,但这并不代表调用console.log时那些属性就已经被填充完成。
验证方法
可以通过查看属性描述符确认这一点:
textarea.addEventListener('keyup', (ev) => { console.log(Object.getOwnPropertyDescriptor(ev, 'keyCode')); // 输出会显示 enumerable: false });
解决办法
如果需要序列化事件对象的关键信息,手动提取你需要的属性即可:
textarea.addEventListener('keyup', (ev) => { const serializedEvent = { key: ev.key, keyCode: ev.keyCode, targetValue: ev.target.value, isTrusted: ev.isTrusted // 按需添加其他需要的属性 }; console.log(JSON.stringify(serializedEvent)); });
内容的提问来源于stack exchange,提问作者maxbc
相关产品推荐
相关产品推荐

