写在前面:

所谓的双向绑定,无非是从界面的操作能实时反映到数据,数据的变更也能实时展现到界面。angular封装了双向绑定的方法,使双向绑定变得十分简单。但是在有些场景下(比如下面那个场景),不能使用angular来实现双向绑定,需要我们使用js来实现双向绑定。

需求场景:

写了一个点击事件,当点击的时候在后台赋值了,但是在页面视图上面没有显示出来,想到要使用双向绑定来实现这个功能。因为代码之前是用js和jq写的,引入angular的话,会导致之前的代码不能用。在网上参考了一篇文章之后做出来了这个功能

ps零碎知识点:楼主踩过坑了,引用angular写的话,不能再使用JQ写代码,楼主上次代码都删的差不多了,还不能使用,最后才发现是angular和JQ冲突了,所以最好不要混着使用。

实现效果:

实现效果

点击按钮的时候,在后台赋值,然后直接在页面中显示出来,在方框里面输入值,也可以实时反映到数据

ps:文末有demo链接,可以直接复制到本地试一试

应用:

比如实现一个在后台赋值,然后界面出现一个随机的选项,谁是卧底、狼人杀这类型的。


实现原生js过程中的三个步骤:

1.需要一个UI元素和属性相互绑定的方法(核心)

2.监视属性和UI元素的变化

3.需要让所有绑定的对象和元素都能感知到变化

实现思路:

我们使用数据特性来为HTML代码进行绑定,所有被绑定在一起的JavaScript对象和DOM元素都会订阅一个PubSub对象。只要JavaScript对象或者一个HTML输入元素监听到数据的变化时,就会触发绑定到PubSub对象上的事件,从而其他绑定的对象和元素都会做出相应的变化。

代码实现部分:

html代码部分:

1
2
3
4
5
6
7
8
9
10
11
<h1>原生js双向绑定及其应用</h1>
<div class="js-2-1section2 col-sm-10 col-xs-10">
<div><input type="text" data-bind-1="peopleName" id="text1"/>
<!--data-bind-1="peopleName" 原生js双向绑定的格式-->
</div>
<div><input type="text" data-bind-2="killName" id="text2" />
<button class="btn btn-primary" οnclick="randomGroup()">随机词组</button>
</div>
<p data-bind-1="peopleName"></p>
<p data-bind-2="killName"></p>
</div>

上面代码中data-bind-1=”peopleName” 比较重要,其他一些乱七八糟,用来实现效果的,可以不用管。

分析一下————data-bind-1=”peopleName”:

格式:data-bind-可以更改,只能是数字=”可以更改,相当于变量名”

ps:第一个地方只能更改数字,因为创建的是对象。这里的数字可以不按照顺序,我试了999都可以。

js代码双向绑定部分

js代码是封装好了的一个方法,可以按照前面几行的方式调用,代码里面有注释。

实际上以下这段代码已经实现了双向绑定,下面还有一个应用实例,感兴趣的可以看看。文末有demo链接,可以直接复制到本地试一试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
var DBind1 = new DBind( 1 );
var DBind2 = new DBind( 2 );//前面是变量,括号里面的是html那里填的数字
DBind1.set( "peopleName", '第一个' );
DBind2.set( "killName", '第二个' );//第一个是刚才html格式那里的变量名,第二个方框是赋值
function DataBinder( object_id ) {
// 创建一个简单的pubSub对象
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 = "data-bind-" + object_id,
message = object_id + ":input",
timeIn;
changeHandler = function( evt ) {
var target = evt.target || evt.srcElement, // IE8兼容
prop_name = target.getAttribute( data_attr );
if ( prop_name && prop_name !== "" ) {
clearTimeout(timeIn);
timeIn = setTimeout(function(){
pubSub.publish( message, prop_name, target.value );
},50);
}
};
// 监听事件变化,并代理到pubSub
if ( document.addEventListener ) {
document.addEventListener( "input", changeHandler, false );
} else {
// IE8使用attachEvent而不是addEventListenter
document.attachEvent( "oninput", changeHandler );
}
// pubSub将变化传播到所有绑定元素
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 = {
// 属性设置器使用数据绑定器pubSub来发布
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;
}

原生js双向绑定应用实例:

做了一个实现像谁是卧底中,随机抽取词汇,类似的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function randomGroup() {
var oGroup=[];//存放所有词汇的词组、
for(var i=0;i<20;i++){
oGroup[i]={};//设置数组中的每个元素都是一个对象
}
//一个一个定义他们状态的字符串,然后在下面赋值
oGroup[0].people="降龙十八掌";
oGroup[0].killer="九阴白骨爪";
oGroup[1].people="快乐大本营";
oGroup[1].killer="天天向上";
oGroup[2].people="零花钱";
oGroup[2].killer="生活费";
oGroup[3].people="爷爷";
oGroup[3].killer="姥爷";
oGroup[4].people="同学";
oGroup[4].killer="同桌";
oGroup[5].people="小沈阳";
oGroup[5].killer="宋小宝";
oGroup[6].people="成吉思汗";
oGroup[6].killer="努尔哈赤";
oGroup[7].people="谢娜张杰";
oGroup[7].killer="邓超孙俪";
oGroup[8].people="新年";
oGroup[8].killer="跨年";
oGroup[9].people="保安";
oGroup[9].killer="保镖";
oGroup[10].people="眉毛";
oGroup[10].killer="胡须";
oGroup[11].people="端午节";
oGroup[11].killer="中秋节";
oGroup[12].people="摩托车";
oGroup[12].killer="电动车";
oGroup[13].people="高跟鞋";
oGroup[13].killer="增高鞋";
oGroup[14].people="汉堡包";
oGroup[14].killer="肉夹馍";
oGroup[15].people="牛奶";
oGroup[15].killer="豆浆";
oGroup[16].people="唇膏";
oGroup[16].killer="口红";
oGroup[17].people="公交";
oGroup[17].killer="地铁";
oGroup[18].people="结婚";
oGroup[18].killer="订婚";
oGroup[19].people="面包";
oGroup[19].killer="蛋糕";
//词汇出自——————谁是卧底的词汇大全
var oGroupNum=Math.floor(Math.random()*20);//抽取一个随机数,随机数范围跟上面数组的长度是一致的
oPeople=oGroup[oGroupNum].people;
okiller=oGroup[oGroupNum].killer;//随机数的对应下标的状态字符串赋值给这个变量。
console.log(oPeople,okiller);
DBind1.set( "peopleName", oPeople );//将上面的状态字符串赋值给input框,。这一步将在界面中直接显示出来
DBind2.set( "killName", okiller );
}

demo地址

以上就是用原生js实现双向绑定及其应用的所有内容了,本文主要是分享给之前不知道的小伙伴们看的,或者需要此类资料的小伙伴们。

参考链接:

JavaScript 实现简单的双向数据绑定

Javascript实现简单的双向绑定

用原生js实现数据双向绑定

转载于:https://www.cnblogs.com/m2maomao/p/8317201.html

用原生 JS 实现双向绑定及应用实例相关推荐

  1. 原生js实现双向绑定数据,实现前端提交到后台

    问题 项目开发遇到一个问题,就是在提交到后台的时候遇到一个请求甲方数据,来实现在添加数据的时候,将请求到甲方的数据展示在前端页面,让甲方看到他到底添加了哪些数据.因此,使用到了双向绑定,来显示弹框中我 ...

  2. matlab 模拟心电图,使用原生js+canvas实现模拟心电图的实例

    从2015年2月转行进入IT行业,到现在也有将近两年的时间了,从最开始的java到现在的前端,前进的路上一直靠自己摸索,一路走到现在,前端大神是绝对谈不上的,最多算一只刚入门的菜鸟. 从最开始的懵懵懂 ...

  3. animate用法 js原生_原生JS封装animate运动框架的实例

    如下所示: div { width: 100px; height: 100px; background-color: pink; position: absolute; left: 0; top: 5 ...

  4. html实现两个箭头向左向右,原生JS实现左右箭头选择日期实例代码

    原生JS实现左右箭头选择日期实例代码 2019-01-07 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了原生JS实现左右箭头选择日期实例代码,编程之家小编觉得 ...

  5. JS实现双向绑定的几种方式

    记录JS三种双向绑定 1.第一种是通过Proxy数据代理来达到双向绑定的,这是Vue3更新的双向绑定方式. <!DOCTYPE html> <html lang="en&q ...

  6. 双向数据绑定原理(原生js实现双向数据绑定)

    html代码: <input type="text" id="a"> <div id="b"></div> ...

  7. html或原生js是单一对应绑定的,原生js数据绑定

    双向数据绑定是非常重要的特性 -- 将JS模型与HTML视图对应,能减少模板编译时间同时提高用户体验.我们将学习在不使用框架的情况下,使用原生JS实现双向绑定 -- 一种为Object.observe ...

  8. JS 监听绑定和取消事件

    1. 原生 JS 语言: 绑定:addEventListener(type, function, false) 取消: removeEventListener(type, function, fals ...

  9. 双向绑定 当obj的值修改时_JavaScript进阶之深入理解数据双向绑定

    前言 谈起当前前端最热门的 js 框架,必少不了 Vue.React.Angular,对于大多数人来说,我们更多的是在使用框架,对于框架解决痛点背后使用的基本原理往往关注不多,近期在研读 Vue.js ...

最新文章

  1. JavaWeb_响应和请求数据包
  2. 虚函数和作用域(C++ primer 第五版)P550
  3. Mysql数据库五大常用数据引擎
  4. 小米路由器添加扩展工具_小米正式发布miVela软件平台,与各方共同合作推进物联网发展...
  5. 前端学习(2087):v-on得修饰符使用案例
  6. 《团队名称》第八次团队作业:Alpha冲刺day5
  7. 不用写代码的可视化大屏,一口气把工具和方法都教给你
  8. debian安装什么mysql_安装多个mysql实例(debian版本)
  9. [转]paint,update和repaint三种awt方法
  10. [python] 在指定目录下找文件
  11. 偏微分方程数值解法pdf_天生一对,硬核微分方程与深度学习的联姻之路
  12. nc 二次开发_金蝶云星空(K3CLOUD)和用友NC对比
  13. clickhouse表引擎-合并树系列
  14. 非华为电脑使用EMUI10多屏协同教程
  15. 基于JavaScript网上商城开发设计 毕业设计-附源码261620
  16. 百度Q-T语义一致性比未获奖 (总结)
  17. Windows内存 之 任务管理器
  18. 数学建模:9 多元线性回归分析
  19. 《观止-微软创建NT和未来的夺命狂奔》 语录摘抄
  20. 突发!中国顶级程序员左耳朵耗子(陈皓)去世

热门文章

  1. GitHub 推出原生 iOS 和 Android 客户端
  2. Kong 1.0 GA 版本正式发布,微服务 API 网关
  3. 每隔一段时间执行php_用php脚本,你如何定时更新商品列表
  4. 华为怎么申请鸿蒙商标,华为已注册华为鸿蒙商标是怎么回事 华为鸿蒙商标注册...
  5. canvas读取图片,输入文字,调整文字属性,拖拽文字位置,并保存图片
  6. java 反射 动态编译_动态编译java源代码和反射调用问题
  7. 电脑系统如何锁定计算机,如何删除“解除计算机锁定”页面?
  8. nginx中文url php,使Nginx服务器支持中文URL的相关配置详解
  9. ppt课堂流程图_4个超实用的PPT制作技巧:开学提升备课质量,资深老师都在用
  10. mysql实现了四种通信协议_Mysql通信协议-阿里云开发者社区