JS原生数据双向绑定实现代码

发布时间 - 2026-01-11 02:46:50    点击率:

代码如下:

<span style="font-family:Times New Roman;font-size:14px;" deep="7"><!DOCTYPE html> 
<html lang="en"> <head> 
  <meta charset="UTF-8"> 
  <title>Demo</title> 
  <script> 
    function DataBinder( object_id ) { 
      // Create a simple PubSub object 
      var pubSub = { 
            callbacks: {}, 
            on: function( msg, callback ) { 
              this.callbacks[ msg ] = this.callbacks[ msg ] || []; 
              this.callbacks[ msg ].push( callback ); 
            }, 
            publish: function( msg ) { 
              this.callbacks[ msg ] = this.callbacks[ msg ] || []; 
              for ( var i = 0, len = this.callbacks[ msg ].length; i < len; i++ ) { 
                this.callbacks[ msg ][ i ].apply( this, arguments ); 
              } 
            } 
          }, 
          data_attr = "bind-" + object_id, 
          message = object_id + ":input", 
          timeIn; 
          changeHandler = function( evt ) { 
            var target = evt.target || evt.srcElement, // IE8 compatibility 
                prop_name = target.getAttribute( data_attr ); 
            if ( prop_name && prop_name !== "" ) { 
              clearTimeout(timeIn); 
              timeIn = setTimeout(function(){ 
                pubSub.publish( message, prop_name, target.value ); 
              },50); 
            } 
          }; 
      // Listen to change events and proxy to PubSub 
      if ( document.addEventListener ) { 
        document.addEventListener( "input", changeHandler, false ); 
      } else { 
        // IE8 uses attachEvent instead of addEventListener 
        document.attachEvent( "oninput", changeHandler ); 
      } 
      // PubSub propagates changes to all bound elements 
      pubSub.on( message, function( evt, prop_name, new_val ) { 
        var elements = document.querySelectorAll("[" + data_attr + "=" + prop_name + "]"), 
            tag_name; 
        for ( var i = 0, len = elements.length; i < len; i++ ) { 
          tag_name = elements[ i ].tagName.toLowerCase(); 
          if ( tag_name === "input" || tag_name === "textarea" || tag_name === "select" ) { 
            elements[ i ].value = new_val; 
          } else { 
            elements[ i ].innerHTML = new_val; 
          } 
        } 
      }); 
      return pubSub; 
    } 
    function DBind( uid ) { 
      var binder = new DataBinder( uid ), 
      user = { 
        // ... 
        attributes: {}, 
        set: function( attr_name, val ) { 
          this.attributes[ attr_name ] = val; 
          // Use the `publish` method 
          binder.publish( uid + ":input", attr_name, val, this ); 
        }, 
        get: function( attr_name ) { 
          return this.attributes[ attr_name ]; 
        }, 
        _binder: binder 
      }; 
      // Subscribe to the PubSub 
      binder.on( uid + ":input", function( evt, attr_name, new_val, initiator ) { 
        if ( initiator !== user ) { 
          user.set( attr_name, new_val ); 
        } 
      }); 
      return user; 
    } 
  </script> 
</head> 
<body> 
<input type="text" bind-1="name" /> 
<span bind-1="name"></span> 
<script> 
  var DBind = new DBind( 1 ); 
  DBind.set( "name", "" ); 
</script> 
</body> 
</html>
</span> 

效果示例:

总结

以上所述是小编给大家介绍的JS原生数据双向绑定实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # 原生数据双向绑定  # js双向绑定  # javascript实现数据双向绑定的三种方式小结  # Vue.js每天必学之数据双向绑定  # 轻松实现javascript数据双向绑定  # 深入学习AngularJS中数据的双向绑定机制  # 浅谈AngularJs 双向绑定原理(数据绑定机制)  # Vue.js第一天学习笔记(数据的双向绑定、常用指令)  # 深入理解Angularjs向指令传递数据双向绑定机制  # AngularJS学习笔记(三)数据双向绑定的简单实例  # 实例剖析AngularJS框架中数据的双向绑定运用  # js实现数据双向绑定(访问器监听)  # 小编  # 在此  # 给大家  # 所述  # 绑定  # 给我留言  # 感谢大家  # 疑问请  # 有任何  # pubSub  # var  # object  # callback  # msg  # callbacks 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 手机软键盘弹出时影响布局的解决方法  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  Python面向对象测试方法_mock解析【教程】  如何为不同团队 ID 动态生成多个“认领值班”按钮  Python高阶函数应用_函数作为参数说明【指导】  HTML 中动态设置元素 name 属性的正确语法详解  javascript读取文本节点方法小结  Laravel如何实现API资源集合?(Resource Collection教程)  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  高性价比服务器租赁——企业级配置与24小时运维服务  简历在线制作网站免费版,如何创建个人简历?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何用美橙互联一键搭建多站合一网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何在自有机房高效搭建专业网站?  Laravel如何使用Eloquent进行子查询  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何发送系统通知?(Notification渠道示例)  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  JavaScript如何实现路由_前端路由原理是什么  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  JavaScript如何操作视频_媒体API怎么控制播放  浅谈redis在项目中的应用  如何在建站主机中优化服务器配置?  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  EditPlus中的正则表达式实战(6)  Python文件操作最佳实践_稳定性说明【指导】  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  如何用腾讯建站主机快速创建免费网站?  JavaScript如何实现继承_有哪些常用方法  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  常州企业网站制作公司,全国继续教育网怎么登录?  MySQL查询结果复制到新表的方法(更新、插入)  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  简单实现Android文件上传  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  C++时间戳转换成日期时间的步骤和示例代码  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程