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 相关文章推荐
js Flash插入函数免激活代码
Mar 31 Javascript
Jquery 滑入滑出效果实现代码
Mar 27 Javascript
关于文本框的一些限制控制总结~~
Apr 15 Javascript
详解强大的jQuery选择器之基本选择器、层次选择器
Feb 07 Javascript
基于jquery完美拖拽,可返回拖动轨迹
Mar 29 Javascript
THREE.JS入门教程(2)着色器-上
Jan 24 Javascript
JQuery伸缩导航练习示例
Nov 13 Javascript
javascript实现点击后变换按钮显示文字的方法
May 13 Javascript
js生成随机数的过程解析
Nov 24 Javascript
javascript类型系统_正则表达式RegExp类型详解
Jun 24 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
react如何快速设置文件路径别名
Apr 28 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 伪静态之IIS篇
2014/06/02 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
javascript import css实例代码
2008/07/18 Javascript
jquery 表单进行客户端验证demo
2009/08/24 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
python读写ini文件示例(python读写文件)
2014/03/25 Python
仅用50行代码实现一个Python编写的计算器的教程
2015/04/17 Python
Python爬取成语接龙类网站
2018/10/19 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python logging模块的使用详解
2020/10/23 Python
css3简单练习实现遨游浏览器logo的绘制
2013/01/30 HTML / CSS
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
《可爱的动物》教学反思
2014/02/22 职场文书
校庆接待方案
2014/03/18 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
力克胡哲观后感
2015/06/10 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
Redis IP地址的绑定的实现
2021/05/08 Redis
pytorch 如何使用batch训练lstm网络
2021/05/28 Python