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


Posted in Javascript onAugust 14, 2017

代码如下:

<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原生数据双向绑定实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
javascript测试题练习代码
Oct 10 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
jquery制作LED 时钟特效
Feb 01 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
Oct 28 Javascript
Angular 路由route实例代码
Jul 12 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
Vue cli+mui 区域滚动的实例代码
Jan 25 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
Vue两种组件类型:递归组件和动态组件的用法
Aug 06 Javascript
Angular CLI发布路径的配置项浅析
Mar 29 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 #jQuery
关于在mongoose中填充外键的方法详解
Aug 14 #Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 #Javascript
jQuery:unbind方法的使用详解
Aug 14 #jQuery
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 #Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 #Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
Aug 14 #Javascript
You might like
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
thinkphp的静态缓存用法分析
2014/11/29 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
2015/12/22 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
模仿百度三维地图的js数据分享
2011/05/12 Javascript
javascript中length属性的探索
2011/07/31 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
纯javascript代码实现计算器功能(三种方法)
2015/09/07 Javascript
jQuery实现手机自定义弹出输入框
2016/06/13 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
2017/08/31 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
[00:30]塑造者的传承礼包-戴泽“暗影之焰”套装展示视频
2014/04/04 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
python实现批量按比例缩放图片效果
2018/03/30 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
2019/12/31 Python
python实现图片转字符画
2021/02/19 Python
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
Prototype是怎么扩展DOM的
2014/10/01 面试题
酒店拾金不昧表扬信
2014/01/18 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
社区志愿者活动总结
2014/06/26 职场文书
安全保证书格式
2015/02/28 职场文书
工作会议简报
2015/07/20 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏