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进行跨域请求
Jan 25 Javascript
js获取URL的参数的方法(getQueryString)示例
Sep 29 Javascript
jquery实现鼠标滑过小图时显示大图的方法
Jan 14 Javascript
基于javascript实现全国省市二级联动下拉选择菜单
Jan 28 Javascript
41个Web开发者必须收藏的JavaScript实用技巧
Jul 22 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
Nov 16 Javascript
学习vue.js中class与style绑定
Dec 03 Javascript
详解vue事件对象、冒泡、阻止默认行为
Mar 20 Javascript
利用js给datalist或select动态添加option选项的方法
Jan 25 Javascript
实战node静态文件服务器的示例代码
Mar 08 Javascript
Vuex mutitons和actions初使用详解
Mar 04 Javascript
详解vue 命名视图
Aug 14 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+java实现自动新闻滚动窗口
2006/10/09 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
实例讲解PHP表单
2020/06/10 PHP
window.dialogArguments 使用说明
2011/04/11 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
vue实现分页组件
2020/06/16 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
2016/04/13 Python
详谈python http长连接客户端
2017/06/12 Python
Python基于回溯法子集树模板解决旅行商问题(TSP)实例
2017/09/05 Python
python中logging库的使用总结
2017/10/18 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
关于tf.nn.dynamic_rnn返回值详解
2020/01/20 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
财务会计人员岗位职责
2013/11/30 职场文书
婚礼证婚人证婚词
2014/01/08 职场文书
大学生创业策划书
2014/02/02 职场文书
优秀党员获奖感言
2014/02/18 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
学前班幼儿评语大全
2014/12/29 职场文书