html input点动,JavaScript动态的改变input的value属性时,如何自动触发oninput、onchange事件?...

本文提供三种方案来监听JavaScript动态改变input元素值的事件。方案包括自定义setter、监听value属性变化及创建changeValueListener函数,后者允许为指定元素绑定多个回调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Stack Overflow】Event when input value is changed by JavaScript?

监听 js 动态 修改 input value 事件

function customInputSetter(){

var descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value");

var originalSet = descriptor.set;

// define our own setter

descriptor.set = function(val) {

console.log("Value set", this, val);

originalSet.apply(this,arguments);

}

Object.defineProperty(HTMLInputElement.prototype, "value", descriptor);

}

customInputSetter();

方案2

Here is a solution to hook the value property changed for all inputs:

var valueDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, "value");

HTMLInputElement.prototype.addInputChangedByJsListener = function(cb) {

if(!this.hasOwnProperty("_inputChangedByJSListeners")) {

this._inputChangedByJSListeners = [];

}

this._inputChangedByJSListeners.push(cb);

}

Object.defineProperty(HTMLInputElement.prototype, "value", {

get: function() {

return valueDescriptor.get.apply(this, arguments);

},

set: function() {

var self = this;

valueDescriptor.set.apply(self, arguments);

if(this.hasOwnProperty("_inputChangedByJSListeners")){

this._inputChangedByJSListeners.forEach(function(cb) {

cb.apply(self);

})

}

}

});

//Usage example:

document.getElementById("myInput").addInputChangedByJsListener(function() {

console.log("Input changed to \"" + this.value + "\"");

});

方案3

/**

* [changeValueListener 监听 js 修改 input 和 textarea 的 value。]

* @param {[HTMLElement]} element [具有 value 属性的 html 元素,如 input 和 textarea。]

* @param {Function} callback [回调,this 为 element,参数为当前值。]

* @return {[HTMLElement]} [element]

*/

function changeValueListener(element, callback) {

if (!Array.isArray(element.callbacks)) {

element.callbacks = [];

var valueDes = Object.getOwnPropertyDescriptor(element.constructor.prototype, "value");

Object.defineProperty(element, 'value', {

set: function(v) {

// console.log('set', v, this, arguments);

element.callbacks.forEach(function(callback) {

callback.call(this, v);

});

valueDes.set.apply(this, arguments);

},

get: function() {

// console.log('get', this, arguments);

return valueDes.get.apply(this, arguments);

}

});

}

element.callbacks.push(callback);

return element;

}

// 调用

var input = document.getElementById('foo');

changeValueListener(input, function(v) {

console.log('a callback', this, v);

});

// 支持绑定多个回调

changeValueListener(input, function(v) {

console.log('b callback', this, v);

});

### Input事件与Change事件的区别 #### 1. **触发机** `input`事件会在用户的每一次输入操作立即触发,比如键盘按键、粘贴内容或者通过拖放等方式更改输入框内的都会触发事件[^1]。而`change`事件则是在输入框失去焦(blur)并且其发生了变化的情况下才会触发[^2]。 #### 2. **适用场景** 由于`input`事件响应用户交互行为的特,它非常适合用来实现即反馈功能,例如自动完成建议列表、字符计数器等功能[^4]。相比之下,`change`事件更适用于那些只需要在最终确认数据后再处理的情况,如表单提交前验证邮箱地址格式是否正确等情形[^3]。 #### 3. **兼容性和局限性** 需要注意的是,在某些特定情况下,`input`事件可能存在一些局限性。例如,如果通过JavaScript代码直接修改元素的value属性,则不会引发该事件;另外,在较旧版本的Internet Explorer浏览器中可能需要依赖于`onpropertychange`作为替代方案来捕获类似的动态更新作。对于`change`事件而言,除了基本文本类型的<input>之外,还可以应用于<select>,<textarea>以及checkbox/radio按钮等多种HTML控件之上[^2]。 以下是两个简单示例分别展示如何使用这两种不同的事件: ```html <!-- 使用 input 事件 --> <script> function handleInput(event){ console.log("当前输入:", event.target.value); } </script> <input type="text" placeholder="请输入..." oninput="handleInput(event)"> <p>每当您键入新字符,控制台会打印最新状态。</p> <!-- 使用 change 事件 --> <script> function handleChange(event){ alert("最后的结果是:" + event.target.value); } </script> <input type="text" placeholder="编辑后移开光标..." onchange="handleChange(event)"> <p>只有当您结束编辑并让字段失焦弹窗显示结果。</p> ``` 以上代码片段清晰地展示了两者的行为差异。 #### 总结 综上所述,虽然二者都可用于检测<input>元素的变化情况,但它们之间存在显著的差异——前者侧重过程监控,后者关注终判定。因此开发者应依据具体需求合理选用合适的事件类型以优化用户体验效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值