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 XML操作 封装类
Jul 01 Javascript
jquery $.fn $.fx是什么意思有什么用
Nov 04 Javascript
javascript实现获取浏览器版本、操作系统类型
Jan 29 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
Dec 27 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
Feb 21 Javascript
Node实战之不同环境下配置文件使用教程
Jan 02 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
vue-cli3 karma单元测试的实现
Jan 18 Javascript
js根据需要计算数组中重复出现某个元素的个数
Jan 18 Javascript
vue-cli 3.x配置跨域代理的实现方法
Apr 12 Javascript
jQuery事件委托代码实践详解
Jun 21 jQuery
vue之封装多个组件调用同一接口的案例
Aug 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
Search Engine Friendly的URL设计
2006/10/09 PHP
windows xp下安装pear
2006/12/02 PHP
PHP读取目录下所有文件的代码
2008/01/07 PHP
php empty() 检查一个变量是否为空
2011/11/10 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
javascript中Number对象的toString()方法分析
2014/12/20 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
p5.js临摹动态图形实现方法详解
2019/10/23 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
浅谈Python中的私有变量
2018/02/28 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
Python模块 _winreg操作注册表
2020/02/05 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
项目经理任命书
2014/06/04 职场文书
中文专业自荐书
2014/06/29 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
离婚财产分配协议书
2014/10/21 职场文书
公司保密管理制度
2015/08/04 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android