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 相关文章推荐
禁用页面部分JavaScript方法的具体实现
Jul 31 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
javascript 闭包详解
Feb 15 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
Jul 18 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
Aug 27 Javascript
jquery判断密码强度的验证代码
Apr 22 Javascript
整理Javascript事件响应学习笔记
Dec 02 Javascript
jQuery实现磁力图片跟随效果完整示例
Sep 16 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
详解微信小程序图片地扯转base64解决方案
Aug 18 Javascript
JS出现404错误原理及解决方案
Jul 01 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
解析php常用image图像函数集
2013/06/24 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
AngularJs页面筛选标签小功能
2016/08/01 Javascript
JavaScript实现图片懒加载(Lazyload)
2016/11/28 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
JavaScript箭头函数_动力节点Java学院整理
2017/06/28 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
vue-cli 3 全局过滤器的实例代码详解
2019/06/03 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
视觉直观感受若干常用排序算法
2017/04/13 Python
python实现的二叉树定义与遍历算法实例
2017/06/30 Python
python实现图像识别功能
2018/01/29 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
深入浅析HTML5中的article和section的区别
2018/05/15 HTML / CSS
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
社会实践自我鉴定
2013/11/07 职场文书
新年晚会主持词
2014/03/24 职场文书
乡镇镇长个人整改措施
2014/10/01 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
500字小学生检讨书
2015/02/19 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python