如何捕获input hidden的 value变更

最近开始工作了。手里事情比较多。 遇到这个挺有代表性的问题。

背景

  • onChange 事件触发的机制,当input表单控件发生变化时,并且 input 触发失焦,则会触发 Change 事件。

像Onchage 标准文档描述,显然 不符合这个标准。 本文主要讨论, input type = hidden 元素,当value 发生变更时,如何捕获值的变更。

解决方案

IE9 及以下 IE 类浏览器

虽然onChange 事件无法触发, 但是旧的 IE 浏览器,是有自己的私有事件 onpropertychange 。 这个事件是在表单控件所以属性发生变化时候触发。 当然可以做为value 变更的替代来使用。可惜限制条件特别多。

其他浏览器

根据过往经验, 我们在通过js 修改 input hidden 的值的时候,同步触发一下事件,是比较合理的解决方案。 示例代码如下:

ini 复制代码
// DOM 
// <input type="hidden" id="hidden-input" onchange="console.log('hello world')">
	
// script 
document.getElementById("hidden-input").value = "new value";
document.getElementById("hidden-input").onchange();

通过 MutationObserver 解决

像传统的解决方案,每次赋值手动触发一下。 显得很不优雅。

在IE 11以上 及 chrome 等现代浏览器,我们可以比较优雅的解决这个问题。

示例解决代码:

javascript 复制代码
var obsever = new MutationObserver(function(mutations, obsever) {
			    mutations.forEach((mutation) => {
					switch (mutation.type) {
						case "attributes":
							switch (mutation.attributeName) {
								case "value":
									obsever.dispatch(new UIEvent('change'))
								break;
							}
						break;
					}
				});
			});
obsever.observe(document.getElementsById('hidden-input'), {
	attributeFilter: ["value"],
})
相关推荐
接着奏乐接着舞11 小时前
sse 两种调用方式
前端·javascript·vue.js
不会敲代码116 小时前
手写 Mini React:从 JSX 到虚拟 DOM 再到 render,搞懂 React 底层原理
前端·javascript·react.js
kyriewen18 小时前
你的代码仓库变成“毛线团”了?Monorepo 用 Turborepo 拆成“乐高积木”
前端·javascript·面试
身如柳絮随风扬18 小时前
你知道什么是 Ajax 吗?—— 从入门到原理,一篇彻底搞懂
前端·ajax·okhttp
旷世奇才李先生18 小时前
Vue3\+TypeScript 2026实战——企业级前端项目架构搭建与性能优化全指南
前端·架构·typescript
Beginner x_u19 小时前
前端八股整理(工程化 02)|CommonJS/ESM、Webpack Loader/Plugin 与Vite 对比
前端·webpack·node.js·plugin·loader
openKaka_19 小时前
createRoot 到底创建了什么:FiberRootNode 和 HostRootFiber 的初始化过程
前端·javascript·react.js
习明然19 小时前
UniApp开发体验感受总结
前端·uni-app
刀法如飞20 小时前
Claude Code Skills 推荐:2026年最值得安装的10个AI技能
前端·后端·ai编程
阿豪只会阿巴21 小时前
【没事学点啥】TurboBlog轻量级个人博客项目——项目介绍
javascript·python·django·html