首页 > 其他分享 >自己手写一个js的双向绑定

自己手写一个js的双向绑定

时间:2023-04-11 22:25:49浏览次数:32  
标签:function obj 绑定 js let input 手写 message newValue

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


标签:function,obj,绑定,js,let,input,手写,message,newValue
From: https://www.cnblogs.com/yanyuge/p/17307999.html

相关文章

  • 微信小程序开发——getLocation:fail the api need to be declared in the requiredPr
    getLocation:failtheapineedtobedeclaredintherequiredPrivateInfosfieldinapp.json/ext.json异常解析:app.json中没配置requiredPrivateInfos参数,按下边示例代码配置即可。示例代码:{..."permission":{"scope.userLocation":{"desc&qu......
  • js 8种数据类型
    1、ES6之前共6种:number\string\Boolean\null\undefined\object;ES6增加symbol:这种类型的对象永不相等,可以解决属性名冲突的问题,做为标记。ES11增加bigint:写法:1234555n,是指安全存储、操作大整数(不可用于浮点数操作);2、增加bigint的原因:解决number大整数精度丢失问题;J......
  • JS上下文和作用域链
    开发中我们可能会不小心将写多个相同名称的变量,也经常会写一个递归调用的方法,上述示例中程序执行顺序如下图,程序会按照顺序执行第一个子元素内部所有的程序,当最底层执行结束后,会逐渐抛出返回值,然后执行第二个子元素的程序 要解释清楚上述原因,除了JS的单线程顺序执行外,还需要......
  • 【Spring MVC】简单数据绑定
    实体类:  spring-mvc.xml<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:......
  • js如何引入高德地图API?
    准备 成为开发者并创建key1、登录控制台登录 高德开放平台控制台,如果没有开发者账号,请 注册开发者。2、创建key进入应用管理,创建新应用,新应用中添加 key,服务平台选择 Web端(JS API)。 3、获取key和密钥创建成功后,可获取 key 和安全密钥。快速上手1、H......
  • js复制内容到粘贴板
    copyOrderNo(orderNo){navigator.clipboard.writeText(orderNo).then(()=>{this.$message.success('已复制订单号')});},copyOrderNo(orderNo){varinput=document.createElement('input')//创......
  • 【学习笔记】JS+VUE
    JSJS教程HTML定义了网页的内容CSS描述了网页的布局JavaScript控制了网页的行为简介1、什么是JS?JavaScript是一种轻量级的编程语言。JavaScript是可插入HTML页面的编程代码。JavaScript插入HTML页面后,可由所有的现代浏览器执行。2、JS有哪些作用?直接写入H......
  • 直播平台源代码,js 时间戳转为日期格式
    直播平台源代码,js时间戳转为日期格式js把时间戳转为普通日记格式第一种 functiongetLocalTime(nS){     returnnewDate(parseInt(nS)*1000).toLocaleString().replace(/:\d{1,2}$/,'');   } ​第二种 functionadd0(m){returnm<10?'0'+m:m}func......
  • js检测页面关闭事件
    window.onbeforeunload=onbeforeunload_handler;window.onunload=onunload_handler;//页面关闭之前触发,在onunload事件之前触发,可以禁止onunload事件的触发functiononbeforeunload_handler(){varwarning="确认退出?";debugger......
  • ExtJS 轮播图UI组件(Carousel)
    ExtJS教程汇总:https://www.cnblogs.com/cqpanda/p/16328016.html转载请注明出处:https://www.cnblogs.com/cqpanda/p/17177307.html更新记录2023年4月11日发布。Carousel组件(MordenToolkit)基本使用{xtype:'carousel',width:500,height:300,item......