JS基础——事件对象event

事件为什么会是对象呢?先了解一下事件处理

一、事件处理

JS在事件处理函数中提供了事件对象,帮助处理鼠标和键盘事件。同时还可以修改一些事件的捕获和冒泡流的函数。

事件处理分为三部分:对象.事件处理函数=函数

document.onclick=function(){
    alert(this.value); //this代表着在该作用域中离它最近的对象。
}

以上事件处理中,document为对象,click是事件处理类型,onclick为事件处理函数。function()为匿名函数,用于触发后执行。

那么什么是事件对象呢?当我们触发document的click事件时,便会产生一个事件对象,这个对象中包含着这个事件的相关信息,包括导致事件的元素、事件的类型、以及其它与特定事件相关的信息等。这个对象是在执行事件时,浏览器通过函数传递过来的。

小例子:

	document.onclick=function(){
		alert(arguments.length); //浏览器会默认传递一个参数
		alert(arguments[0]);//[object MouseEvent],如果是keydown,则为[object KeyboardEvent]
	}

可以看出,事件处理中,浏览器已经默认将一个参数传递过来了。而在普通函数和匿名函数中,是不传递event对象的。

event对象的接收:

在W3C中可以直接接受event对象,如:

	input.onclick = function (evt) { //接受 event 对象,名称不一定非要 event
	    alert(evt); //MouseEvent,鼠标事件对象 IE不支持
	};

但是IE中,不支持直接接收,而是通过window.event来接收。

二、获取鼠标和键盘事件信息

1、鼠标事件

主要是在鼠标事件执行后,通过事件对象来获取相关事件的一些属性,比如左键还是右键。在按键时,是否按住了所规定的键值如ctrl,shift等常用键,或者鼠标点击的位置等相关信息。

通过clientX/Y来获取鼠标点击的在可视区域的横纵坐标,screenX/Y可获得在整个屏幕的横纵坐标。

关于修改键的一个小例子:

首先了解一下事件对象关于修改键的一些方法:

	window.onload=function(){
		document.onclick=function(evt){
			var e=evt||window.event; <span style="font-family:SimSun;">//跨浏览器兼容事件对象</span>
			alert(getKey(evt));
		};

	}
	function getKey(evt){
		var e=evt||window.event;
		var keys=[];  <span style="font-family:SimSun;">//创建一个数组,用来存放按下的键值</span>

		if(e.shiftKey) keys.push('shift');
		if(e.ctrlKey) keys.push('ctrl');
		if(e.altKey) keys.push('alt'); //单击+Alt和360快捷键冲突
		return keys;
	}

现在是不是对事件对象的功能有了一个大概的印象呢?看一下键盘事件

2、键盘事件

主要应用于按键时,获取按下各个键值的键码或字符编码。主要发生在keydown和keypress事件中

keycode:不区分大小写,与键盘上的键值位置一一对应。用于keydown和keyup事件

charcode:字符编码,区分大小写,其实返回的就是ASCII码。只支持keypress事件

三、事件流

事件流包括两种模式:冒泡和捕获。

1、冒泡:从里向外逐个触发。

2、捕获:从外向里逐个触发

事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候而层叠在你点击范围
, 并不是只有当前被点击的元素会触发事件 , 那么你点击其中一个元素的所有元素都会触发事件。而如果我们想要只触发其中一个事件时,此时就需要取消冒泡或捕获。现代浏览器默认都是冒泡类型,所以通常只需要取消冒泡即可。

如何取消?

	function stopPro(evt) {
		var e = evt || window.event;
		window.event ? e.cancelBubble = true : e.stopPropagation(); <span style="font-family:SimSun;">//兼容W3C和IE</span>
	}

四、事件对象中的this传递问题

以上是关于事件对象的一些基础,此外,还需注意在现代事件绑定中匿名函数通过call来进行对象冒充时,传递参数时,第一个参数默认传递给要冒充的事件对象,而从第二个参数开始才开始真正传递给实际要传递的参数。什么意思呢?看一个小例子:

1、事件绑定函数

	function addEvent(obj,type,fn){
		if ( typeof obj.addEventListener!='undefined'){ //W3C
			obj.addEventListener(type,fn,false);
		}else if(typeof obj.attachEvent!='undefined'){//IE
			obj.attachEvent('on'+type,function(){
				fn.call(123<span style="font-family:SimSun;">,456,789</span>); <span style="font-family:SimSun;">//利用对象冒充来解决this传递问题</span>
			});
		}
	}

2、调用

window.onload=function(){

    addEvent(document,'click',fn);

}

function fn(a,b){

    alert(this);//123,默认第一个参数为传递要冒充的对象,为123

    alert(a);//call中从第二个参数起赋值给函数的参数,456 

    alert(b);<span style="font-family:SimSun;">//789</span>
}

总结:事件对象即是事件触发时,浏览器传递给事件处理的一个对象,通过这个对象,我们可以获得相应时间处理的一些相关信息,以便于我们对接下来的操作做进一步处理。

时间: 2024-11-19 09:55:40

JS基础——事件对象event的相关文章

JS事件对象 (event)

#事件对象 (event) div.onclick = function(event){ console.log(event); let e = event||window.event;解决兼容性 } ##事件对象的属性 1)target 目标对象:e.target(获取触发事件的元素) 2)this 指向绑定的元素 ###鼠标相关的属性 1)相对于浏览器(文档显示区)的坐标:clientX.clientY 2) 相对于页面的坐标:pageX.pageY:如果有滚动条,会计算隐藏的坐标 3)相对

JavaScript:事件对象Event和冒泡

本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章 DOM操作详解 中已经讲过事件的概念.这里讲一下注册事件的两种方式,我们以onclick事件为例. 方式一:onclick 举例: <body> <button>点我</button> <script> var btn = document.getElementsByTagName("

jacascript 事件对象event

前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 在触发DOM上的某个事件时,会产生一个事件对象 event,这个对象中包含着所有与事件有关的信息.所有浏览器都支持 event 对象,但有兼容性问题. 获取事件对象 一般地,event 对象是事件程序的第一个参数.IE8及以下浏览器不支持: 另一种方法是直接使用 event 变量,firefox 浏览器不支持: 获取事件对象的常见兼容写法: <div id="box" style=&qu

javaScript中的事件对象event

事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包括了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的理解是事件源对象,即触发该事件的dom元素)等,以及一些与该事件相关的方法.取消事件默认行为preventDefault().组织事件继续冒泡或捕获stopPropagation()等等,这里我仅仅列举了,项目中我用到的属性和方法. 既然事件被触发.就随之产生了一个event对象.笔者在IE中測试了

js 基础知识 对象与数组

对象是一种无序属性的集合,每个属性都有自己的名字和值. 对象的创建有很多种,我在第一章已经说过了. 如何遍历一个对象: var x;var txt="";var person={fname:"Bill",lname:"Gates",age:56}; for (x in person)       //x其实是一个变量,代表的是person对象的属性{txt=txt + person[x];              //person[属性]  等

JS基础——事件绑定

上一篇博客JS事件对象中,老师问JS事件处理和VB中的事件处理有什么联系?先来解决一下这个问题.举个VB.net中事件处理的例子(JS敲久了,VB习惯的都不熟悉了,看来得经常回顾了): 1.事件处理VB VS JS Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MsgBox("helo!") MsgBox(sender.width) '弹出触发这个事件对象的宽度 Msg

事件对象event和计时器

事件对象:event 属性: srcElement事件源对象 keyCode 键盘按键Ascii码 window方法: 定时器: 1)setTimeout();//n毫秒后执行一次 2)setInterval();//每隔n秒执行一次 这两个方法都有个返回值,返回一个定时器id,可以定义一个变量接收 清除定时器方法: setTimeout()对应的是 clearTimeout(id); setInterval()对应的是 clearInterval(id); <html> <head&g

第43天:事件对象event

一.事件对象事件:onmouseover. onmouseout. onclickevent //事件的对象 兼容写法:var event = event || window.event; event常见属性,如下表: 属性 作用 data 返回拖拽对象的URL字符串(dragDrop) width 该窗口或框架的高度 height 该窗口或框架的高度 pageX 光标相对于该网页的水平位置(ie无) pageY 光标相对于该网页的垂直位置(ie无) screenX 光标相对于该屏幕的水平位置

js基础2js对象、运算符 date(),getHours();

js中的所有事物都是对象:字符串.数字.日期,等等: 在js中,对象是拥有属性和方法的数据 局部js变量 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量. 只要函数运行完毕,本地变量就会被删除 全局js变量 在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它. js变量的生存期 JavaScript 变量的生命期从它们