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增删改查(IE下)操作实现代码
Jan 30 Javascript
javascript Array.prototype.slice使用说明
Oct 11 Javascript
js模拟select下拉菜单控件的代码
May 08 Javascript
JS实现点击链接取消跳转效果的方法
Jan 24 Javascript
javascript中定义私有方法说明(private method)
Jan 27 Javascript
JavaScript获取网页表单action属性的方法
Apr 02 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
Oct 22 Javascript
JS去除空格和换行的正则表达式(推荐)
Jun 14 Javascript
jsonp跨域请求实现示例
Mar 13 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
Jan 16 Javascript
JavaScript canvas实现雨滴特效
Jan 10 Javascript
webpack介绍使用配置教程详解webpack介绍和使用
Jun 25 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代码
2007/03/03 PHP
php在线生成ico文件的代码
2007/10/09 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
探讨GDFONTPATH能否被winxp下的php支持
2013/06/21 PHP
php自动更新版权信息显示的方法
2015/06/19 PHP
PHP导入导出Excel代码
2015/07/07 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
微信小程序之swiper轮播图中的图片自适应高度的方法
2018/04/23 Javascript
jQuery实现的老虎机跑动效果示例
2018/12/29 jQuery
axios异步提交表单数据的几种方法
2019/08/11 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
Python字符遍历的艺术
2008/09/06 Python
python 获取本机ip地址的两个方法
2013/02/25 Python
构建Python包的五个简单准则简介
2015/06/15 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Django和Flask框架优缺点对比
2019/10/24 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
Python多线程多进程实例对比解析
2020/03/12 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
教师实习的自我鉴定
2013/10/26 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
关于旷工的检讨书
2014/02/02 职场文书
优秀学生获奖感言
2014/02/15 职场文书
《莫泊桑拜师》教学反思
2016/02/22 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers