js动态改变input的value值时如何自动触发input、change事件?
如页面上有如下input:
<input type="text" id="demo"/>
给input加上事件:
var input = document.getElementById('demo');input.addEventListener('oninput', function(){
console.log('oninput event ');
}, false);
input.addEventListener('onchange', function(){
console.log('onchange event');
}, false);
现在我用JavaScript动态的设置input的值:
document.getElementById('demo').value = 'value change';
会发现oninput和onchange事件都没有自动触发,但输入框的值却已经变化了。如果想要触发事件,则必须手动触发才行。
要想设置value值得时候,自动触发一些事件有没有对应的解决办法呢?
···回复:
lerte 说的对,数据双向绑定,不过不用框架也行,只要知道原理;楼主的问题实际上是:
改变了一个对象的属性,怎么去自动触发一个程序,或者访问一个属性,怎么去自动触发一个程序
实际上,可以新建另一个访问器属性 _value ,把原来 js 对 value 的操作改为对 _value 属性的操作,这样访问 _value 时,会自动调用 get 函数获取 value 的值,设置 _value 属性时,会自动调用 set 函数设置 value 属性的值,你可以将你的程序绑定在 get/set 函数中,这样就可以监听 js 修改 value 数据的变化;
如果直接设置 value 属性为 访问器属性,结果会造成,用户在页面修改了 value,不会调用 set 函数,所以 想了上面的中介 _value,此处感谢@叫我小蓝就行了 的提醒。
题主的案例:
js:
window.onload = function() { let input = document.getElementById('demo');
function oninputCallback() {
console.log('oninput event ');
}
function onchangeCallback() {
console.log('onchange event');
}
input.addEventListener('oninput', oninputCallback, false);
input.addEventListener('onchange', onchangeCallback, false);
Object.defineProperty(input, '_value', {
configurable: true,
set: function(value) {
this.value = value;
oninputCallback();
onchangeCallback();
},
get: function() {
return this.value;
}
});
};
html:
<body> <input type="text" id="demo"/>
</body>
效果
再给个例子,根据数据类型的变化,自动修改类名,demo
js:
window.onload = function() {let bonusDiv = document.getElementById('bonusDiv');
Object.defineProperty(bonusDiv, 'data-type', {
configurable: true,
set: function(value) {
switch (value) {
case 'x1':
this.className = 'red';
break;
case 'x2':
this.className = 'blue';
break;
case 'x3':
this.className = 'purple';
break;
}
}
});
};
html:
<div id="bonusDiv" ></div>
效果:
以上是 js动态改变input的value值时如何自动触发input、change事件? 的全部内容, 来源链接: utcz.com/a/17090.html