`
duobility
  • 浏览: 17923 次
  • 性别: Icon_minigender_1
  • 来自: 钓鱼岛
最近访客 更多访客>>
社区版块
存档分类
最新评论

笔记:JS权威指南17章—事件和事件属性

 
阅读更多

目前使用的3中完全不同的不兼容的事件处理模型:
1.原始事件模型:通常非正式把它看作0级DOM API的一部分内容。尽管它的特性有限,但所有启用Javascript的浏览器都支持它,因此具有可移植性。
2.标准事件模型:2级DOM标准对它进行了标准化,除IE外的所有浏览器都支持他。
3.Internet Explorer事件模型:最初由IE4引入。具有标准事件模型的许多高级特性,但不具有全部特性。

把一个元素设置为多个文档元素的事件句柄:

//在链接前请求用户的确认
function confirmLink() {
	return confirm("您确认要访问“ + this.href + ” 吗?");
}
function confirmAllLinks() {
	for(var i = 0; i < document.links.length; i++) {
		document.links[i].onclick = confirmLink;
	}
}



假定对象o,具有mymethod方法,可以用下面代码注册一个事件句柄

button.onclick = o.mymethod


这个语句使button.onclick引用与o.mymethod相同的函数。现在这个函数既是o的方法,也是button的方法。当浏览器触发这个事件句柄时,它将把该函数作为button对象的方法调用,而不是作为o对象的方法调用。关键字this引用Button对象,而不是引用对象o。不要认为可以让浏览器把一个事件句柄作为其他对象的方法调用。如果想这样做,必须直接调用

button.onclick = function() { o.mymethod(); }

 

 

 

列表显示了所有事件模块、以及它定义的事件接口和它支持的事件类型。

模块名

事件接口

事件类型

HTMLEvents

Event

abort blur change erro focus load resrt resize scroll select submit unload

MouseEvents

MouseEvents

click mousedown mousemove mouseover mouseup

UIEvents

UIEvent

DOMActivate DOMFocusln DOMFocusOut

Event HTMLEvent 模块定义的事件类型使用 Event 接口。其他事件类型都使用该接口,即所有事件对象都实现了 Event 接口,并提供了适用于所有事件类型的详细信息。 Event 接口定义了如下属性:

type

发生事件的类型。该属性的值是事件类型名(如: ’click’ ’mouseover’

target

发生事件的节点,可能与 currentTarget 不同

currentTarget

当前正在运行事件句柄的节点。如果在传播过程的捕捉阶段或起泡阶段处理事件,这个属性的值就与 target 属性的值不同。

eventPhase

一个数字,指定当前所处的事件传播过程的阶段。它的值为常量: Event.CAPTURE_PHASE, Event_AT_TARGET, Event.BUBBLING_PHASE

timestamp

一个 Date 对象,声明事件何时发生

bubble

布尔值,声明该事件是否在文档树中起泡

cancelabel

布尔值,声明该事件是否具有能用 preventDefault() 方法取消的默认动作

Event 接口还定义了 stopPropagation() preventDefault() 方法,所有事件对象都实现了它们。调用 stopPropagation() 方法可以阻止事件从当前正在处理它的节点传播。调用 preventDefault() 方法阻止浏览器执行与该事件默认的相关动作。

 

UIEvent UIEvent 接口是 Event 的子接口(拥有 Event 接口定义的属性)、是 MouseEvent 接口的父接口。

view 属性:发生时间的 Window 对象

detail 属性:对于 click 事件、 mousedown 事件和 mouseup 事件,这个字段代表点击的次数, 1 代表点击一次、 2 代表双击、 3 代表点击三次。对于 DOMActivate 事件,这个字段的值为 1 ,表示正常激活, 2 表示超级激活(如双击鼠标或同时按下 shift enter

 

MouseEvent :继承 Event 接口和 UIEvent 接口的所有属性和方法,此外还定义了如下属性

button

声明在 mousedown mouseup click 事件中,哪个鼠标键改变了状态。 0 表示左键, 1 表示中间键, 2 表示右键。

altKey,ctrlKey,metaKey,shiftKey

4 个布尔值声明在鼠标事件发生时,是否按住了 alt 键, ctrl shift meta

clientX,clientY

声明鼠标指针相对于客户区或浏览器窗口的 X 坐标和 Y 坐标。这 2 个属性不考虑滚动,如果事件发生在窗口的顶部,无论文档滚动了多元, clientY 都是 0

screenX, screenY

声明鼠标指针相对于用户显示器的左上角的 X 坐标和 Y 坐标

relatedTarget

对于 mouseover 事件,它是鼠标移到目标上是所离开的那个节点

对于 mouseout 事件,它是离开目标时,鼠标进入的节点

 

 



在0级DOM事件模型中。浏览器把事件分派给发生事件的文档元素。如果那个对象具有合适的事件句柄。就运行这个句柄。除此之外,不再执行其他的操作。
在2级DOM中,当事件发生在文档元素上时,目标的事件句柄就被触发。此外,目标的每个祖先元素也有机会处理那个事件。

事件捕获分三个阶段进行:
1.在捕捉(caputuring)阶段,事件从Document对象沿着文档树向下传播给目标节点。如果目标的任何一个祖先专门注册了捕捉事件句柄,那么在事件传播的过程中,就会运行这些句柄。
2.直接注册在目标上的适合的事件句柄将运行。
3.起泡(bubbling)阶段:事件将从目标元素向上传播回或起泡回Document对象的文档层次。(虽然所有事件都受时间传播的捕捉阶段的支配,但并非所有类型的事件都起泡)

在2级事件模型中,可调用对象的addEventListener()方法为特定元素注册事件句柄
document.myform.addEventListener("submit", function(e) { alert(e);}, false);
addEventListener函数对应的是removeEventListener

IE事件句柄的注册:attachEvent()方法和detachEvent()

function highlight() { /* code goes here*/}
document.getElementById('myelt').attachEvent("onmouseover", highlight);


attachEvent()和addEventListener()方法相似,除以下几点外:
1.只是由于IE事件不支持事件捕捉。因此attachEvent()方法只有2个参数
2.传递给IE方法的事件句柄名字应该包含一个“on”前缀
3.用attachEvent()注册的函数将被作为全局函数调用,即在attachEvent()注册的事件句柄执行时,关键字this引用的是Window对象,而不是事件的目标元素
4.attachEvent()允许同一个事件句柄注册多次。

IE中的事件起泡:IE事件模型中没有2级DOM模型具有的事件捕捉的概念。但在IE模型中,事件可以沿着包容层次向上起泡。在2级模型中,事件起泡只适用于原始事件或输入事件(主要是鼠标和键盘事件),不适用于高级的语义事件。IE中的事件起泡和2级DOM事件模型中的事件起泡之间的差别在于停止起泡的方式。IE Event对象没有DOM Event对象具有的stopPropagation()方法,所以要阻止事件起泡或制止它在包含层次中进一步传播,IE事件句柄必须把Event对象的cancelBubble属性设置为true:

window.event.cancelBubble = true;



设置cancelBubble属性只使用于当前事件。当新事件生成时,将赋予window.event新的Event对象,cancelBubble属性还将还原为它的默认值false

 

下面代码为拖动决定定位的元素:

<script type="text/javascript">
//拖动绝对定位的元素
function drag(elementToDrag, event) {
	var startX = event.clientX, startY = event.clientY;
	var origX = elementToDrag.offsetLeft, origY = elementToDrag.offsetTop;
	var deltaX = startX - origX, deltaY = startY - origY;
	
	if (document.addEventListener) {
		document.addEventListener("mouseover", moveHandler, true);
		document.addEventListener("mouseup", upHandler, true);		
	}
	else if (document.attachEvent) {
		//IE5+事件模型
		elementToDrag.setCapture();
		elementToDrag.attachEvent("onmousemove", moveHandler);
		elementToDrag.attachEvent("onmouseup", upHandler);
		elementToDarg.attachEvent("onlosecapture", upHandler);		
	}
	else {
		//IE4事件模型
		var oldmovehandler = document.onmousemove;
		var olduphandler = document.onmouseup;
		document.onmousemove = moveHandler;
		document.onmouseup = upHandler;	
	}
	
	if (event.stopPropagation) event.stopPropagation();
	else event.cancelBubble = true;	
	
	//阻止默认动作
	if (event.preventDefault) event.preventDefault();
	else event.returnValue = false;
	
	function moveHandler(e) {
		if (!e) e = window.event;	
		elementToDrag.style.left = (e.clientX - deltaX) + "px";		
		elementToDrag.style.top = (e.clientY - deltaY) + "px";
		
		if (e.stopPropagation) e.stopPropagation();
		else e.cancelBubble = true;
	}
	
	function upHandler(e) {
		if (!e) e = window.event;
		
		if (document.removeEventListener) {
			//DOM事件模型
			document.removeEventListener('mouseup', upHandler, true);
			document.removeEventListener("mousemove", moveHandler, true);
		}
		else if (document.detachEvent) {
			//IE5+事件模型
			elementToDrag.detachEvent("onlosecapture", upHandler);
			elementToDrag.detachEvent("onmouseup", upHandler);
			elementToDrag.detachEvent("onmousemove", moveHandler);
			elementToDrag.releaseCapture();
		}
		else {
			//IE4事件模型
			document.onmouseup = oldhandler;
			document.onmousemove = oldmoveHandler;
		}
		
		if (e.stopPropagation) e.stopPropagation();
		else e.cancelBubble = true;
	}
}
</script>
</head>
<body>
<div style="position:absolute; left:100px; top:100px; width:250px; background-color:white; border:solid black;">
<div style="background-color:gray; border-bottom:dotted black; padding:3px; font-family:sans-serif; font-weight:bold;" onmousedown="drag(this.parentNode, event);">
拖动我</div>
<p>测试段落</p><p>测试段落</p><p>测试段落</p><p>测试段落</p>
</div>

 

 

 

按键事件:如果 alt,ctrl,shift 和一个按键一起按下,这通过事件对象的 altKey,ctrlKey,shiftKey 属性来表示。

Firefox 中定义了两个属性, keyCode 存储了一个按键的较低层次的虚拟键盘码,并且和 keydown 事件一起发送; charCode 存储了按下一个键时所产生的可打印的字符的编码,并且和 keypress 事件一起发送(功能按键产生一个 keypress 事件,此时 charCode 0 keyCode 包含了虚拟按键码)。

IE 中,只有一个 keyCode 属性,并且它的解释也取决于事件的类型,对于 keydown 事件来说, keyCode 是一个虚拟按键码;对于 keypress 事件来说, keyCode 是一个字符码。字符码可以使用 String.fromCharCode() 转换为字符。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>限制用户输入某一组字符</title>
</head>
<body>
邮编:<input type="text" id="zip" allowed="0123456789" messageid="zipwarn">
<span id="zipwarn" style="color:red; visibility:hidden">只能输入数字<span>
</body>
<script type="text/javascript">
(function check() {
	//文档加在完毕后,执行init函数
	if (window.addEventListener) window.addEventListener('load', init, false);
	else if(window.attachEvent) window.attachEvent("onload", init);
	
	
	//查找input元素,并在其上注册init函数
	function init() {
		var inputtags = document.getElementsByTagName("input");		
		for(var i = 0; i < inputtags.length; i++) {
			var tag = inputtags[i];
			if (tag.type != "text") continue;//仅需要text框			
			var allowed = tag.getAttribute("allowed");
			if (!allowed) continue;//有allowed属性
			
			if (tag.addEventListener) 			
				tag.addEventListener("keypress", filter, false);
			else {
				//此处不用attacheEvent
				tag.onkeypress = filter;
			}		
		}	
	}
	
	//处理用户输入
	function filter(event) {
		//获取事件模型和字符码
		var e = event || window.event;
		var code = e.charCode || e.keyCode;
		
		if (e.charCode == 0) return true;
		if (e.ctrlKey || e.altKey) return true;
		if (code < 32) return true;
		
		var allowed = this.getAttribute("allowed");
		var messageElement = null;
		var messageid = this.getAttribute("messageid");		
		if (messageid)
			messageElement = document.getElementById(messageid);
			
		var c = String.fromCharCode(code);
		
		if (allowed.indexOf(c) != -1) {
			if (messageElement) messageElement.style.visibility = 'hidden';
			return true;		
		}
		else {
			if (messageElement) messageElement.style.visibility = "visible";
			if (e.preventDefault) e.preventDefault();
			if (e.returnValue) e.returnValue = false;
			return false;		
		}	
	}
})();

</script>
</html>
 


鼠标事件:当一个鼠标事件发生的时候,事件对象的clientX和clientY属性保存了鼠标指针的位置。

onload事件:有些javascript代码要修改包含它们的文档,通常这样的代码必须要在文档完全加载完毕后才能运行。

 

分享到:
评论

相关推荐

    Javascript权威指南学习笔记二

    ### JavaScript权威指南学习笔记二:客户端JavaScript #### 第十二章:Web浏览器中的JavaScript ##### 一、Web浏览器环境 在客户端JavaScript中,浏览器提供了一个特定的执行环境,其中`window`对象扮演着至关...

    javascript权威指南笔记

    JavaScript权威指南笔记是深入理解和掌握JavaScript这门编程语言的重要参考资料。这份笔记包含了作者在研读《JavaScript权威指南》过程中的学习体会和理解,旨在帮助读者更有效地掌握JavaScript的核心概念、语法特性...

    Javascript权威指南学习笔记一

    JavaScript权威指南的学习笔记为我们深入理解这门语言的基础和特性提供了宝贵的资源。在第一部分中,主要探讨了JavaScript的核心概念和基本语法。 首先,JavaScript有两个主要的解释器:C语言编写的SpiderMonkey和...

    JS权威指南(第四版)学习笔记.doc

    JavaScript,全称JavaScript语言,是一种广泛应用于Web开发的轻量级、基于对象和事件驱动的脚本语言。它主要用于增强用户界面,与HTML和CSS一起构成网页开发的三大核心技术。JavaScript在网页中嵌入,无需预编译,...

    《jQuery权威指南》学习笔记之第3章 jQuery操作DOM

    现在我们专注于《jQuery权威指南》第三章——jQuery操作DOM的内容。DOM,即文档对象模型,是HTML和XML文档的编程接口,它将文档结构转换为一个树形结构,方便程序进行读取和修改。jQuery提供了丰富的API,让开发者...

    《HTML5权威指南》笔记第一部分

    HTML5权威指南》笔记第一部分中提到的知识点涵盖了HTML5的基础概念、HTML页面结构、基本元素、浏览器兼容性、编辑器推荐以及HTML5中的一些新特性。以下是对这些知识点的详细介绍: ### HTML5基础概念 HTML5是第五代...

    《jQuery权威指南》学习笔记之第2章 jQuery选择器

    jQuery是一个广泛使用的JavaScript库,它极大地简化了HTML文档遍历、事件处理、动画以及Ajax交互。它的核心特性之一就是强大的选择器系统,使得开发者能够更方便地选取和操作DOM元素。 jQuery选择器是基于CSS选择器...

    《HTML5权威指南》笔记第五部分

    ### HTML5权威指南第五部分知识点总结 #### 一、Ajax技术概述 - **定义**: Ajax (Asynchronous JavaScript and XML) 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。这种技术允许网页应用程序...

    《HTML5权威指南》笔记第四部分

    ### 《HTML5权威指南》笔记第四部分:深入理解DOM #### DOM概念解析 文档对象模型(Document Object Model,简称DOM)是HTML5的核心组成部分之一,它为网页开发者提供了一种将HTML文档转换成可编程对象的方式。通过...

    javascript权威指南 学习笔记之javascript数据类型

    根据给定的【标题】"javascript权威指南 学习笔记之javascript数据类型"和【描述】,我们可以深入探讨JavaScript中的数据类型及其特点。 首先,JavaScript支持三种基本数据类型:数字(Number)、字符串(String)...

    JavaScript 权威指南(第四版) 读书笔记

    在学习JavaScript的过程中,《JavaScript权威指南(第四版)》是一本非常经典的参考书,它详细介绍了JavaScript的语法、对象、函数以及一些高级特性。下面将根据提供的读书笔记内容,详细阐述一些重要的知识点。 ...

    javascript权威指南 学习笔记之null和undefined

    在JavaScript中,`null`和`undefined`是两个非常重要的概念,它们经常被用来表示变量没有值或对象属性不存在的情况。下面将详细讲解这两个概念及其差异。 `null` 是一个预定义的关键字,它代表一个特定的值,即“无...

    vue3笔记,里面记了vue3的精华,减少学习时间

    标题和描述中都提到了“vue3笔记,里面记了vue3的精华,减少学习时间”,这意味着文档的主要内容是关于Vue 3的教程或者速成笔记,旨在帮助读者快速掌握Vue 3的核心概念和技巧。 从给定的文件内容可以提炼出以下Vue ...

    XML资料大全--基础 语言 笔记课件

    - W3C官方文档:提供了XML规范的权威指南,包括XML、XPath、XSLT等。 - 在线教程:如W3Schools、MDN Web Docs等,提供互动式的教程和实例。 - 开源库:如Java的JAXB、DOM4J,Python的lxml,JavaScript的xml2js等...

    笔记

    - MDN Web Docs:权威的Web开发文档资源,包含详细的JavaScript指南和API参考。 这本笔记将覆盖以上各个知识点,并深入探讨它们的应用场景和最佳实践,帮助读者从基础到进阶,全面掌握JavaScript编程技能。

    Jquery 学习帮助文档

    《jQuery权威指南》是一本深入解析jQuery的书籍,其读书笔记为我们提供了理解jQuery核心概念和实用技巧的宝贵资源。 ### 1. jQuery基础 - **选择器**: jQuery的选择器基于CSS,可以方便地选取DOM元素,如`$("#id")...

    关于JavaScript中name的意义冲突示例介绍

    在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源代码贴在下面: 代码如下: [removed] function Person(){} var per = new Person;...

    Oreilly.HTML学习笔记

    Oreilly出版的《HTML and XHTML: The Definitive Guide》是这个领域的权威指南,已经更新到第五版,为读者提供了深入理解HTML和XHTML的全面知识。 HTML是一种标记语言,它的主要作用是定义网页结构,通过不同的标签...

    AngularJs权威教程和学习网址

    AngularJS,作为一款由Google维护的前端JavaScript框架,是Web开发中的重要工具,尤其在构建动态单页应用程序(SPA)时。本教程旨在提供AngularJS的深入理解和实践指导,包括其核心概念、特性以及相关学习资源。 ...

Global site tag (gtag.js) - Google Analytics