如何捕获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"],
})
相关推荐
当时只道寻常4 分钟前
Vue3 集成 NProgress 进度条:从入门到精通
前端·vue.js
kyriewen5 分钟前
React性能优化:从“卡成狗”到“丝般顺滑”的5个秘诀
前端·react.js·性能优化
米丘5 分钟前
Vue 3.x 单文件组件(SFC)模板编译过程解析
前端·vue.js·编译原理
helloweilei7 分钟前
Web Streams 简介
前端·javascript
悟空瞎说7 分钟前
Flutter热更新 Shorebird CodePush 原理、实现细节及费用说明
前端·flutter
didadida2628 分钟前
从“不存在”的重复请求,聊到 Web 存储的深坑
前端
xiaominlaopodaren9 分钟前
Three.js 渲染原理-透明渲染为什么这么难
前端
米丘10 分钟前
vue3.x 内置指令有哪些?
前端·vue.js
米丘11 分钟前
Vue 3.x 模板编译优化:静态提升、预字符串化与 Block Tree
前端·vue.js·编译原理
一川_12 分钟前
前端驱动工业报警:基于 WebSocket 与网关的三色蜂鸣灯实时报警系统实战
javascript·websocket