搜索
javascript - input和对象双向绑定的问题, 为什么这里没有陷入死循环?
天蓬老师
天蓬老师 2017-04-11 11:43:37
[JavaScript讨论组]

使用Object.defineProperty来做input元素和object的双向绑定, 一个简单的例子:

<input type='text' class='binding'>
// 定义data对象
window.data = {}
// 当input元素的值改变时改变data
 document.querySelector('input.binding').addEventListener('input', (e) => {
  data.inputVal1 = e.target.value
})
Object.defineProperty(data, 'inputVal1', {
    // 从input中读值
  get () {
    return document.querySelector('input.binding').value
  },
    // 改变时写入到input
  set (val) {
    document.querySelector('input.binding').value = val
  }
})

不过这里有个问题:
当我改变input的值时(不管是通过input.value写值还是直接输入), data.inputVal1setter都会触发, 反过来触发input.binding元素的input事件, 该事件又触发data.inputVal1setter...循环触发, 这里是个死循环啊
反过来改变data.inputVal1的值也有一样的问题: setter触发input事件, input事件又触发setter...
但是实际上这段双向绑定的代码工作得很好
这是为什么呢?

已解决

原因是使用input.value方法写值, 并不会触发元素的inputchange事件.
input事件: 当用户直接在文本域输入时触发;
change事件: 当文本域onblur并且值和focus前不一致时触发.
用于setter对于input是直接写值, 因此inputinput事件并没有被触发.

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号