在触发DOM上的某个事件时,会产生一个事件对象event。这个对象中包含着所有与事件有关的信息。包括导致事件的元素,事件的类型以及其他与特定事件相关的信息。

例如:

  • 鼠标操作点击事件时,事件对象中会获得鼠标的按键信息等,会提示按的哪一个键

获得鼠标按键属性button和which

鼠标左中右按键分别对应:在谷歌浏览器中   button:左键 0 右键 2 中键 1  ,which:左键 1 右键 3 中键 2

ie8及以下:左键 1 右键 2 中键 4,which属性不存在

  • 用户在操作键盘时,事件对象中会获得操作键盘的一切信息
  • 添加一个click事件,封装一个方法,简单的可以这么做(在这不引入之前的框架了)

//封装一个click事件(只能添加一次)
YY.fn.extend({
click: function ( callback ) {
// 要给 每一个 dom 元素添加 事件处理程序 callback
this.each(function () {
this.onclick = callback;
});
}
}); //添加多个click的事件(点击一次触发多个事件)
YY.fn.extend({
click: function ( callback ) {
// 要给 每一个 dom 元素添加 事件处理程序 callback
this.each(function () {
this.addEventListener( 'click', callback );
});
return this;
}
});
  • 同理其他事件也可这么实现,但是代码冗余,所以,在这进行了一次升级

// 事件模块
YY.fn.extend({
on: function ( type, callback ) { this.each( function () {
if ( this.addEventListener ) {//ie8不兼容addEventListener
this.addEventListener( type, callback );
} else {
this.attachEvent( 'on' + type, callback );//在这必须用on
}
});
return this; // 当前对象
},
off: function () {
this.each( function () {
this.removeEventListener( type, callback );
});
return this;
}
});

那么我们可以用以上工具函数,很轻松的可以封装一些方法了,如下

// 对一些常见事件的封装
// click, mouseover, mousemove, mousedown, mouseup, keydown, keyup
YY.each( ("click,mouseover,mouseout,mouseenter,mouseleave," +
"mousemove,mousedown," +
"mouseup,keydown,keyup" ).split(','), function ( i, v ) { YY.fn[ v ] = function ( callback ) {
return this.on( v, callback );
} }); // toggle 与 hover
YY.fn.extend({
hover: function ( fn1, fn2 ) {
return this.mouseover( fn1 ).mouseout( fn2 );
},
toggle: function () {
var args = arguments,//传入实参的个数
i = 0; return this.click(function ( e ) {//e是系统提供的
args[ i++ % args.length ].call( this, e );//在这里取余就是让每个实参都执行一次,此时this一直指向dom对象
}); }
});
  • onload事件的封装

var loadEvent = [];    //提供一个空数组存储函数
window.onload = function () {
for ( var i = 0; i < loadEvent.length; i++ ) {
loadEvent[ i ]();
}
}; // 构造函数
var YY = function YY ( selector ) {
return new YY.fn.init( selector );
};
// 核心原型
YY.fn = YY.prototype = {
constructor: YY,
selector: null,
length: 0,
init: function ( selector ) { //判断是否为函数,再把函数绑定到window.onload
if ( YY.isFunction( selector ) ) {
loadEvent.push( selector );//将函数都加入数组中
}
}, };
YY.fn.init.prototype = YY.prototype;

关于js封装框架类库之事件模块的更多相关文章

  1. 关于js封装框架类库之DOM操作模块(二)

    上一篇基本实现了框架结构,但是与真正能用上的项目框架比较还是存在很多不足,在这又做了些加强与优化 (function ( window, undefined ) { var arr = [], pus ...

  2. 关于js封装框架类库之DOM操作模块(一)

    在前端开发的过程中,javascript极为重要的一个功能就是对DOM对象的操作,而对其封装就是为了更好地进行DOM操作,提高浏览器的支持效率 现在给出一个案例:页面创建三个div,然后给其添加样式 ...

  3. 关于js封装框架类库之样式操作

    在js中,对样式的操作我们并不感到陌生,在很多框架中都是用极少的代码,实现更强大的功能,在这做出一些的总结.存在不足还望指出! 1.封装一个添加css的方法(这篇引用了前面的框架结构) 在 js 中 ...

  4. 关于js封装框架类库之属性操作

    在对DOM对象操作时,往往都要涉及到其属性的操作,为了提高开发效率,同时兼顾浏览器的性能,在这简单的封装了几个常见的属性.因为是模块化,在这只是引入了部分代码,其他代码在前几篇模块封装中有写.如有不足 ...

  5. 关于js封装框架类库之选择器引擎(二)

    在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 ...

  6. 关于js封装框架类库之选择器引擎(一)

    选择器模块之传统做法 var tag = function (tag){ return document.getElementsByTagName(tag); } var id = function ...

  7. 【JavaScript框架封装】使用原生js封装的类似于JQuery的框架及核心源码分享(多文件版本)

    这个版本的JQuery是对上一个版本的JQuery,使用了require.js进行了二次封装,基本上把前面的每一个框架封装成为一个单独的模块,最终的目录结构如下: 由于代码量和目录比较多,这个封装好的 ...

  8. JS封装动画框架,网易轮播图,旋转轮播图

    JS封装动画框架,网易轮播图,旋转轮播图 1. JS封装运动框架 // 多个属性运动框架 添加回调函数 function animate(obj,json,fn) { clearInterval(ob ...

  9. Node.js:events事件模块

    Nodejs的大部分核心API都是基于异步事件驱动设计的,所有可以分发事件的对象都是EventEmitter类的实例. 大家知道,由于nodejs是单线程运行的,所以nodejs需要借助事件轮询,不断 ...

随机推荐

  1. 基于Web的系统测试方法

    基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战.基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否 ...

  2. 异构数据源海量数据交换工具-Taobao DataX 下载和使用

    DataX介绍 DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换. 目前成熟的数据导入 ...

  3. cad画指定大小矩形

    指定基点后输入(@长度,宽度)回车 举例:如你要画个600*300的矩形 则输入@600,300回车

  4. Nand ECC校验和纠错原理及2.6.27内核ECC代码分析

    ECC的全称是Error Checking and Correction,是一种用于Nand的差错检测和修正算法.如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个 ...

  5. [原]基于CAS实现单点登录(SSO):cas client端的退出问题

    自从CAS 3.4就很好的支持了单点注销功能,配置也很简单. 之前版本因为在CAS服务器通过HttpClient发送消息时并未指定为POST方式,所以在CAS客户端的注销Filter中没有收到POST ...

  6. net-ldap for ruby openNebula ldap

    preface:ldap 主要概念及术语 OpenNebula issues:missing step to use LDAP as default driver cp -r /var/lib/one ...

  7. javascript 中 keyup、keypress和keydown事件

    keyup.keypress和keydown事件都是有关于键盘的事件 1. keydown事件在键盘的键被按下的时候触发,keyup 事件在按键被释放的时候触发    keydown.keypress ...

  8. uva 301 Transportation 铁路公司的阳谋 纯dfs暴力

    题目比较难理解. 给出铁路的容量和站点数,以及几笔订单,要求算出如何盈利最大. 咋一看想贪心,但无法确定是最优解啊. 于是用dfs做,就两种状况,选与不选,先开一个每个站点的当前人数数组,假设要选,然 ...

  9. C#高级编程三十天----泛型结构,泛型方法,泛型托付

    泛型结构 泛型结构和泛型类差点儿是一直的,仅仅是泛型结构没有继承的特性..NET平台提供的一个泛型结构是(可空类型)Nullablle<T>.可空类型的引入,主要是为了解决数据库语言中的数 ...

  10. 关于ECMAScript6一些知识

    ECMAScript 是当前 JavaScript 语言规范的最新标准,一般称为 es6, 但是因为 该标准规范是在 2015年6月份发布的,所以也叫作 ECMAScript 2015 let 变量声 ...