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 相关文章推荐
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
Mar 05 Javascript
30分钟就入门的正则表达式基础教程
Feb 25 Javascript
侧栏跟随滚动的简单实现代码
Mar 18 Javascript
JavaScript全排列的六种算法 具体实现
Jun 29 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
Aug 06 Javascript
利用angularjs1.4制作的简易滑动门效果
Feb 28 Javascript
原生JS 购物车及购物页面的cookie使用方法
Aug 21 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
vue-quill-editor富文本编辑器简单使用方法
Sep 21 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
PHP在引号前面添加反斜杠(PHP去除反斜杠)
2013/09/28 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
深入理解JSON数据源格式
2014/01/10 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
ionic3 懒加载
2017/08/16 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
Python如何读取、写入CSV数据
2020/07/28 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
结婚典礼证婚词
2014/01/11 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
事业单位考核材料
2014/05/21 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
软环境建设心得体会
2014/09/09 职场文书
党校毕业个人总结
2015/02/28 职场文书
护林员个人总结
2015/03/04 职场文书
2015年资料员工作总结
2015/04/25 职场文书
生日赠语
2015/06/23 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书