视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript函数绑定用法实例分析
2020-11-27 22:25:29 责编:小采
文档

本文实例讲述了JavaScript函数绑定。分享给大家供大家参考,具体如下:

Perface

如果让你实现这个页面和一些操作的,比如点击1、2、3等就在那个input text中显示,还有删除功能,拨打我们先不要管它,只是模拟而已。要是我刚开始做的话,我会这样做:

1. 用css、HTML布局那个界面

2. 用javascript的事件委托监听那个按钮的父节点的点击事件

但是如果我想用面向对象的思想做呢?我是用Ext做的,所以我想说的是它帮我封装了很多。可能一些没用过Ext的人不太了解我下面贴的代码,但是我会尽量解释清楚的!

Description

ContactTelPanel =Ext.extend(Ext.Panel, {
 //构造方法
 constructor : function(config) {
 Ext.apply(this, config);//直接把config对象的属性全复制到this对象中
 Parent = this.parent;
 var me = this;
 ContactTelPanel.superclass.constructor.call(this, {//用ContactTelPanel的父类也就是Ext.Panel的构造函数
 autoScroll : true,
 title : "拨打电话",//设置title,跟这篇文章的主体没关系,不要管他
 id : "contacttelpanel",
 bodyStyle : "padding: 30px 300px;",
 defaults : {//可以为该对象(ContactTelPanel)包含的组件(也就是在items配置选项)设置一些相同属性
 layout : "column",
 defaults : {
 xtype : "button",
 width : 50,
 height : 25,
 style : "margin:4px 15px",
 handler : this.press //为每个按钮都添加一个click的事件
 },
 bodyBorder : false
 },
 items : [ {//textfield组件
 height : 30,
 width : 250,
 xtype : "textfield",
 id : "tf",
 style : "margin-bottom:10px"
 }, {// 没有xtype就是默认为panel,下面也是,不然就不要纠结了,直接在这里想象成第一行按钮1、按钮2、按钮3
 items : [ {
 text : "1"
 }, {
 text : "2"
 }, {
 text : "3"
 } ]
 }, {// 这里是按钮4、按钮5、按钮6
 items : [ {
 text : "4"
 }, {
 text : "5"
 }, {
 text : "6"
 } ]
 }, {// 这里是按钮7、按钮8、按钮9 下同
 items : [ {
 text : "7"
 }, {
 text : "8"
 }, {
 text : "9"
 } ]
 }, {
 items : [ {
 text : "*"
 }, {
 text : "0"
 }, {
 text : "#"
 } ]
 }, {
 items : [ {
 text : "拨打",
 }, {
 text : "删除",
 } ]
 } ]
 });
 },
 press : function() {
 var text = this.text, textfield = Ext.getDom("tf");
 if (/[0-9*#]/.test(text)) {//在textfield中显示所点击按钮的数字
 textfield.value += text;
 } else if (this.text == "删除") {//删除功能
 textfield.value = textfield.value.slice(0, -1);
 } else if (this.text == "拨打") {//这个先不要管他
 Tel.telcall(textfield.value);
 }
 }
});

注:其实从上面可以知道ContactTelPanel是继承Ext.Panel,然后这个面板中有很多个键,每个键都监听click事件。确实在这里觉得自己敲得不是很好,应该是用事件委托来实现,因为你每个按钮都监听了click事件,太影响效率了。用事件委托我们可以指监听它的父节点的click事件就行了,然后根据事件流来判断目的对象并操作。本文重点还是监听事件里面handler : this.press这段代码中 。我遇见的问题就是如果我在press函数要用到这个类ContactTelPanel的一些属性,怎么办?

Idea

我在想,我要在press函数中用到这个类的属性,我直接在press用this对象来获取不就行了,但是我错了,比如你在press函数中console.dir(this),看chrome控制台出现的是什么?不幸的是它出现的是Button对象,它的this指针改了。确实有点麻烦,然后我就想了三个方法,如下:

Solution

1 在每个监听事件的函数中传参

代码:handler : this.press(this),然后在press函数体中写alert(arguments[0])

出现的情况:确实在这个页面加载的时候就弹出窗口是ContactTelPanel,但是你点击那些按钮的时候它没出现了

原因:this.press(this),这样子写javascript解析器会当作调用press函数,然后在你加载页面就执行了

2 在这个ContactTelPanel类中设置全局变量

代码:比如在第五行设置me = this,然后在press函数体中写alert(me)

出现的情况:确实可以在点击按钮的时候弹出窗口,成功了

缺点:污染全局变量,容易被别人无意篡改。比如我在引入这个页面的js后面再引用其他js的时候,在后面的js中设置var me = "monkindey",那么你再点击那个页面的按钮的时候它会弹出123,为不是ContactTelPanel对象

3 简单运用了闭包

代码:handler : function(){me.press(me)} 注:me就是ContactTelPanel对象,因为在function中this指针已经是button对象了,所以应该在function外面用me(或者其他变量名)保存this对象,即var me = this

出现的情况:这个当然是成功

4 用call来实现函数绑定

代码:handler : function(){ me.press.call(this,me);}

个人觉得:这个应该才是最好用的

另:前面一篇详解JavaScript函数绑定介绍了基于纯js的函数绑定技术,感兴趣的读者可对照一下二者的异同。

PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:

javascript事件与功能说明大全:
http://tools.jb51.net/table/javascript_event

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《JavaScript事件相关操作与技巧大全》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

下载本文
显示全文
专题