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 相关文章推荐
jQuery1.6 使用方法一
Nov 23 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
Feb 04 Javascript
js判断上传文件类型判断FileUpload文件类型代码
May 20 Javascript
jQuery的context属性用法实例
Dec 27 Javascript
javascript实现带节日和农历的日历特效
Feb 01 Javascript
跟我学习javascript的arguments对象
Nov 16 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 Javascript
有关文件上传 非ajax提交 得到后台数据问题
Oct 12 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
通过layer实现可输入的模态框的例子
Sep 27 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
咖啡与水的关系
2021/03/03 冲泡冲煮
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
WebQQ最新登陆协议的用法
2014/12/22 PHP
ASP中用Join和Array,可以加快字符连接速度的代码
2007/08/22 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
2016/01/28 Javascript
jQuery选择器基础入门教程
2016/05/10 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
小程序红包雨的实现示例
2019/02/19 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
python写入xml文件的方法
2015/05/08 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python3实现购物车功能
2018/04/18 Python
python递归法解决棋盘分割问题
2019/07/17 Python
Python 求向量的余弦值操作
2021/03/04 Python
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
学前教育教师求职自荐信
2013/09/22 职场文书
小学教育毕业生自荐信
2013/11/18 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
实习老师离校感言
2014/02/03 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
学生打架检讨书
2014/10/20 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
导游词之天津盘山
2019/11/01 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript
python​格式化字符串
2022/04/20 Python
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android