今天研究了一下JS的双向绑定。
发现这东西最核心的是浏览器内置的Object.defineProperty方法或者Object.defineProperties,前者只能定义对象的一个属性与相应的元素进行绑定,后者可以定义一组进行绑定。
不废话了,直接上代码:
// 代码的效果:定时修改对象中的message属性值,然后页面的H1会自动跟着变; 当然你也可以通过修改input对话框中的值的方式来进行(addEventListener中可以指定要监听的时间类型,一般用input,不过你可以改成click会有新发现哦,哈哈)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<input name="message" type="text" value="aaa" />
<h1></h1>
<div id="msgH1" name="msgH1">msgH1</div>
<button name="zhangsan"></button>
<script>
function fnMakeBindObject() {
let obj = {}
// let message=null
// Object.defineProperties(obj, {
// message: {
// get: function () {
// return message
// },
// set: function (newValue) {
// console.log("set", newValue)
// message = newValue
// window.document.querySelector("h1").innerText = newValue
// }
// }
// });
let inputs = document.getElementsByTagName("input")
for (let i = 0; i < inputs.length; i++) {
let input = inputs[i]
let name = input.getAttribute("name")
Object.defineProperty(obj, name, {
get: function () {
return input.value
},
set: function (newValue) {
console.log("set", newValue)
input.value = newValue
window.document.querySelector("h1").innerText=newValue
}
})
}
return obj
}
let obj = fnMakeBindObject()
obj.message = "bbb"
obj.message = "ddd"
obj.message="ccc"
window.document.querySelector("input").addEventListener("click", function (e) {
obj.message = e.target.value
})
//写一个定时器,定时将当前时间更新到obj.message上面
setInterval(function () {
obj.message = new Date().toLocaleTimeString()
console.log(obj.message)
}, 1000)
</script>
</body>
</html>