编写一个JS组件来说说call和apply的用法(3)
作者:ComPhilip 来源:经典论坛 发布时间:2008-11-23 17:11:00
接着看看
AddInvalidTypeEventHandler : function(handler){//添加非法数据类型处理函数
if (typeof(handler)!='function')
throw new Error('参数handler必须为函数');
this._invalidTypeHandler.Add(handler);
},
RemoveInvalidTypeEventHandler : function(handler){//移除非法数据类型处理函数
if (typeof(handler)!='function')
throw new Error('参数handler必须为函数');
this._invalidTypeHandler.Remove(handler);
},
AddOverflowEventHandler : function(handler){//添加溢出处理函数
if (typeof(handler)!='function')
throw new Error('参数handler必须为函数');
this._overflowHandler.Add(handler);
},
RemoveOverflowEventHandler : function(handler){//移除溢出处理函数
if (typeof(handler)!='function')
throw new Error('参数handler必须为函数');
this._overflowHandler.Remove(handler);
},
这4个函数其实是对外提供两个事件:InvalidType和Overflow。现在对Array类进行扩展的两个方法:Add和Remove在这里用上了。由于IE不完美支持DOM事件模型,我们只好自己实现。
我们可以把多个函数绑定到一个事件中,而不用将代码全部挤在一个函数体内。通过Add***,我们可以往事件添加处理函数,当事件发生时,会逐个调用这些函数。通过Remove***,我们可以移除这些处理函数。在这里,造器中的两个数组——_invalidTypeHandler 和 _overflowHandler——是用来存放函数指针(function是一个对象,它是一个引用类型)的。
然后我们看看_init的内部方法:
_init : function(controlId,min,max){ //创建DOM
this._dom = document.createElement('input');
this._dom.type = 'text';
this._dom.id = controlId;
this._dom.name = controlId;
this._dom.oNumTextBox = this;
this._dom.onblur = this._checkValue;//事件绑定
document.body.appendChild(this._dom);//放入网页中
}
我想除了倒数第二、三句:this._dom.oNumTextBox = this;this._dom.onblur = this._checkValue,大家都明白其他语句的作用。这个方法是创建一个文本框,设定id和name属性,构造器的controlId参数赋给id属性,其他JS代码可通过document.getElementById来获得这个文本框。
this._dom.oNumTextBox = this; 这条代码是将NumTextBox类的一个实例对象附加到新创建的文本框的oNumTextBox属性中,之所以添加这个属性,待会说明。this._dom.onblur是绑定文本框失去焦点的事件,处理函数为NumTextBox的_checkValue方法。也就是说,我们封装验证代码的入口就在这里。通过把_checkValue绑定到文本框的事件上,我们可以搞许多花样。看看_checkValue怎么写的。
_checkValue : function(ext){//检查数据
ext = ext ? ext : window.event;
var oNumTextBox = this.oNumTextBox;
if (this.value == "")
return;
if (isNaN(this.value)){
oNumTextBox._raiseInvalidTypeEvent.apply(oNumTextBox,[ext]);
return;
}
var value = this.value*1;
if (!(value>=oNumTextBox._min && value <=oNumTextBox._max))
oNumTextBox._raiseOverflowEvent.apply(oNumTextBox,[ext]);
},
第一句大家都很明白,旨在消灭IE和Gecko核心在事件模型的差异。大家要特别注意这个函数中this的指向。在类模型的其他方法中,this指向类实例,但这里的this却是指向类创建的文本框对象(id为controlId的文本框)?为什么呢?因为这个_checkValue函数在绑定文本框的onblur事件,当文本框失去焦点时,浏览器会调用这个_checkValue,并把它的函数上下文(this)改为触发事件的html对象(也就是文本框)。所以this指向文本框。我们把许多的逻辑放到那个类对象上,那么如何找到那个对象呢?在_init中我们把类对象附加在文本框的oNumTextBox属性中,那么我们就可以通过this.oNumTextBox来获取。如_checkVallue的第二行代码所示。接着开始验证数据。
如果没有数据,则忽略(一个return直接退出).如果数据不是合法的数值,如"asdf",则调用触发InvalidType事件。所谓的触发,触发的动作就是调用_raiseInvalidTypeEvent的方法。朋友们,先暂时一下,在讲apply之前,说说事件的顺序。调用触发invalidType事件的函数后,我们直接return。这说明了两件事,invalidType事件和Overflow事件只能同时发生其中一个,而且InvaidType先发生。看看上面的代码是如何实现的。


猜你喜欢
- 前言;Python是一种非常具有表现力的语言,它提供了不同的结构来简化开发人员的工作。 该列表是python提供的最受欢迎的数据结构之一。
- 在日常工作中;经常会遇到这样的需求:Oracle 数据表跟文本或者文件格式进行交互;即将指定文件内容导入对应的 Oracle 数据表中;或者
- 程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错。。。程序员的一生,始终伴随着一件事 - 调试(错误检测、异常处理)。反反复复
- 介绍An open source load testing tool.一个开源性能测试工具。define user behaviour wi
- 本文为大家分享了virtualenv建立多个Python独立虚拟开发环境,供大家参考,具体内容如下1、安装virtualenv:pip in
- 你知道吗?实际上Python早在20世纪90年代初就已经诞生,可是火爆时间却并不长,就小编本人来说,也是前几年才了解到它。据统计,目前Pyt
- pytorch forwod函数在父类中的调用问题背景最近在研究Detetron2的代码结构时,发现有些网络代码里面没有forward函数,
- 前言事务隔离级别的实现原理:简单来说就是各种锁机制和MVCC多版本并发控制我们学习知识的时候,需要了解知识点出现的原因,什么情况下能用到这个
- 前言Vuex 是一个专为 Vue.js 应用程序开发的 状态管理模式 。它借鉴了Flux、redux的基本思想,将共享的数据抽离到全局,同时
- Python之成为图像处理任务的最佳选择,是因为这一科学编程语言日益普及,并且其自身免费提供许多最先进的图像处理工具。本文主要介绍了一些简单
- 本文实例讲述了Python复制文件操作用法。分享给大家供大家参考,具体如下:这里用python实现了一个小型的自动发版本的工具。这个“自动发
- 如何制作一个安全的页面?随后,让我们来编程:manage.asp' 登录页面<%@ Language=VB
- 一、添加user到group第一种:user.groups.add(1) # add by id第二种:from django.contri
- 为你的网站,博客等添加rss聚合功能,给出rss.asp和rss.xml两种的聚合代码看过的朋友可帮忙顶哦,这些代码都是第一次发的,外面很多
- 这篇文章主要是把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护加密自己的代码,编译asp代码为dll组件我想这个是最好的保
- 尽管很多 NoSQL 数据库近几年大放异彩,但是像 MySQL 这样的关系型数据库依然是互联网的主流数据库之一,每个学 Python 的都有
- 下文分步骤给大家介绍的非常详细,具体详情请看下文吧。一、准备用两台服务器做测试:Master Server: 192.0.0.1/Linux
- 背景在微信分享开发的时候我们通常的流程是 <?php require_once "jssdk.php"; $jss
- 今天再为大家提供一种方法:不需要安装Excel也可以导入到我们的SQL Server数据库。首先用SQL Server自身的数据转换功能把E
- 这是一份来自网络的代码,经过了我的修改和验证。 首先我的运行环境是Python3.7,需要安装PyUserInput库。直接上代码