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制作连动下拉列表框
Jun 25 Javascript
js获得鼠标的坐标值的方法
Mar 13 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
Apr 07 Javascript
jquery默认校验规则整理
Mar 24 Javascript
jQuery取得iframe中元素的常用方法详解
Jan 14 Javascript
node.js express安装及示例网站搭建方法(分享)
Aug 22 Javascript
用js写的一个路由(简单实例)
Sep 24 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 Javascript
详解小程序如何避免多次点击,重复触发事件
Apr 08 Javascript
一些手写JavaScript常用的函数汇总
Apr 16 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
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
第1次亲密接触PHP5(1)
2006/10/09 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
PHP实现浏览器格式化显示XML的方法示例
2019/01/22 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
基于Jquery的标签智能验证实现代码
2010/12/27 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
js兼容的placeholder属性详解
2013/08/18 Javascript
jquery+CSS3实现淘宝移动网页菜单效果
2015/08/31 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
jquery延迟对象解析
2016/10/26 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
在nginx上部署vue项目(history模式)的方法
2017/12/28 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python3使用requests发闪存的方法
2016/05/11 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
Django封装交互接口代码
2020/07/12 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
美国翻新电子产品商店:The Store
2019/10/08 全球购物
医院合作协议书
2014/08/19 职场文书
检讨书范文300字
2015/01/28 职场文书
高中生综合素质自我评价
2015/03/06 职场文书
2015年防汛工作总结
2015/05/15 职场文书
简单谈谈Python面向对象的相关知识
2021/06/28 Python