惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
月光博客
月光博客
B
Blog RSS Feed
C
Check Point Blog
WordPress大学
WordPress大学
T
Tailwind CSS Blog
GbyAI
GbyAI
H
Help Net Security
Y
Y Combinator Blog
I
InfoQ
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
美团技术团队
博客园 - 三生石上(FineUI控件)
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
A
About on SuperTechFans
G
Google Developers Blog
爱范儿
爱范儿
F
Fortinet All Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
人人都是产品经理
人人都是产品经理

博客园 - 隴上煙雨劍

什么是交叉验证 一句话设计模式 代理模式 中介模式 桥接模式 吐槽一下依赖倒置这个糟糕的名字 适配器模式 设计模式之状态模式 设计模式之装饰器模式 mysql插入数据如果存在则忽略 Java已经不再是以前的java了 无法访问9200端口的ElasticSearch服务 Forbidden You don't have permission to access / on this server [转帖]快速激活最新JetBrains公司系列产品包括最新的phpstorm10 【转】CI去掉index.php VirtualBox在win8.1中无法安装64位虚拟机 多谢Mono Ubuntu14.04上面安装mono3.12版本 更新线上数据库时候的安全操作
自己手写一个js的双向绑定
隴上煙雨劍 · 2023-04-11 · via 博客园 - 隴上煙雨劍

今天研究了一下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>