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 Ajax 跨域访问的解决方案
Mar 12 Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
快速解决jQuery与其他库冲突的方法介绍
Jan 02 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
javascript中createElement的两种创建方式
May 14 Javascript
JavaScript继承学习笔记【新手必看】
May 10 Javascript
js+css3实现旋转效果
Jan 20 Javascript
js 两个日期比较相差多少天的实例
Oct 19 Javascript
详解Vue如何支持JSX语法
Nov 10 Javascript
vue-cli webpack 引入swiper的操作方法
Sep 15 Javascript
基于Koa2写个脚手架模拟接口服务的方法
Nov 27 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 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微信公众号开发之图片回复
2018/10/20 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
当前页禁止复制粘贴截屏代码小集
2013/07/24 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jQuery实现可拖动进度条实例代码
2017/06/21 jQuery
vue生成token并保存到本地存储中
2018/07/17 Javascript
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
python之yield表达式学习
2014/09/02 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
读书心得体会
2013/12/28 职场文书
元旦晚会策划方案
2014/02/18 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
初三开学计划书
2014/04/27 职场文书
综合实践活动总结
2014/05/05 职场文书
电子专业毕业生自荐信
2014/05/25 职场文书
如何写通讯稿
2015/07/22 职场文书
严以律己学习心得体会
2016/01/13 职场文书
《搭石》教学反思
2016/02/18 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书
win10+anaconda安装yolov5的方法及问题解决方案
2021/04/29 Python