如何捕获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"],
})
相关推荐
小小小小宇13 小时前
Vue `import` 为什么可以异步加载
前端
WMYeah13 小时前
【无标题】
前端·rust·抽奖程序·跨平台抽奖程序
Unbelievabletobe13 小时前
免费外汇api的响应时间在不同时段下的波动分析
大数据·开发语言·前端·python
大哥,带带弟弟13 小时前
Grafana 前端嵌入与 JWT 鉴权实战
前端·grafana
小小小小宇13 小时前
前端 V8 引擎垃圾回收机制与内存问题排查
前端
前端老石人13 小时前
CSS 值定义语法
前端·css
sheeta199814 小时前
Vue 前端基础笔记
前端·vue.js·笔记
小小小小宇14 小时前
GitLab + GitLab Runner + Qiankun 微前端 + Nginx + Node 中间件 前端开发机从零搭建 CI/CD 全流程
前端
前端那点事14 小时前
别再写垃圾组件!Vue3 如何设计「真正可复用」的高质量通用组件
前端·vue.js
卷帘依旧14 小时前
JavaScript 中的 Symbol
前端·javascript