JavaScript:事件

事件

事件,就是用户或者是浏览器执行的某种动作。例如:click、load等都是事件的名字.

事件处理程序,就是响应事件的函数。事件处理程序的名字是以“on”开头的。

例如:事件 click ---> 事件处理程序 onclick(事件处理程序一般都是小写字母)。

事件是可以被JavaScript侦测到的行为,它包含三个要素

事件->鼠标点击

事件源->被点击的button

响应行为->显示警告框

事件类型

鼠标事件

click 单击

dblclick 双击

mouseover 经过

mouseout 移开

mousemove 移动

mouseup 抬起

mousedown 按下

键盘事件

keydown 按下时

keypress 按着没松开

keyup 抬起

表单事件

submit 提交

blur 失去焦点

focus 聚集焦点

change 内容改变

UI事件

load 加载完毕

unload 卸载

resize 窗口改变大小

scroll 滚动条

DOM事件模型

HTML事件处理程序

将事件和响应行为都内嵌到HTML标签中

<input type="button" value="第一种" onclick="alert('abc')"/>

将事件内嵌到HTML中,响应行为使用函数封装

<input type="button" value="第二种" onclick="foo()"/>
<script type="text/javascript">
    function foo() {alert('abc');}
</script>

DOM0事件处理程序

将事件和响应行为和HTML标签完全分离

对象.οnclick=function(){ }

<input id="btn" type="button" value="第三种" />
<script type="text/javascript">
    var btn = document.getElementById("btn");
    btn.onclick = function() { alert("abc"); }
</script>

对象.οnclick=fun; function fun(){ }

<input id="btn" type="button" value="第四种" />
<script type="text/javascript">
    	var btn = document.getElementById("btn");
    	btn.onclick = fun; //不能带括号
    	function fun() {alert("abc");}
</script>

对象.οnclick=null 删除事件

<input id="btn" type="button" value="一次性点击" />
<script type="text/javascript">
    	var btn = document.getElementById("btn");
    	btn.onclick = fun;
    	function fun() {
    		alert("abc");
    		btn.onclick = null; //删除点击事件,点击一次后按钮失效
    	}
</script>

DOM1事件处理程序

为什么没有1级DOM:DOM级别1于1998年10月1日成为W3C推荐标准。1级DOM标准中并没有定义事件相关的内容,所以没有所谓的1级DOM事件模型。在2级DOM中除了定义了一些DOM相关的操作之外还定义了一个事件模型 ,这个标准下的事件模型就是我们所说的2级DOM事件模型。

DOM2事件处理程序

事件流

如果单击了按钮,浏览器认为单击事件不仅仅发生在按钮上。在单击按钮的同时,你也单击了按钮所在的容器元素,单击了整个页面。

事件流,是指从页面接受事件的顺序。

IE事件流 —— 事件冒泡

当你单击了页面上的div元素,这个click事件就会按照下面的顺序进行传播

从里到外:div ——> body ——> html ——> document ——> window

注意:

  1. 所有的现代浏览器都支持事件冒泡。IE9、FF、chrome、safari会将事件一直冒泡到window对象。
  2. 阻止冒泡:阻止具有相同类型的事件。(需要阻止时才阻止)
  3. 冒泡的理解:相同事件类型逐级向外冒泡

Netscapte事件流 —— 事件捕获

Netscapte采用事件捕获,先由不具体的元素接收事件,最具体的节点最后才接收到事件。单击div,click事件的触发顺序是

从外到里:window ——> document ——> html ——> body ——> div

注意:

  1. IE9、FF、opera、chorme、safari都支持事件捕获。但是使用的不多。
  2. 阻止捕获:无法阻止捕获。

DOM2级事件流

DOM2级事件流分为三个阶段:事件捕获阶段、处于事件阶段、事件冒泡阶段。

注意:DOM2级事件流默认就存在捕获和冒泡这种机制。

添加事件处理程序:addEventListener("事件名", 事件处理程序函数, 布尔值);,addEventListener()可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用

true,表示在捕获阶段调用事件处理程序

false,表示在冒泡阶段调用事件处理程序

删除事件处理程序:removeEventListener("事件名", 事件处理程序函数, 布尔值);

注意:

通过addEventListener()添加事件处理程序,只能通过removeEventListener()来移除,移除时传入的参数与添加时传入的参数一样。(此时不可以使用匿名函数)

ie8及ie8以下浏览器需使用attachEvent和detachEvent进行事件的绑定和解除,并且事件执行顺序为先绑定后执行。对象.attachEvent('onclick',fn); 对象.detachEvent('onclick',fn);

event对象

event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

  • 什么时候会产生event 对象呢? 当用户单击某个元素的时候,我们给这个元素注册的事件就会触发,该事件的本质就是一个函数,而该函数的形参接收一个event对象。
  • 事件通常与函数结合使用,函数不会在事件发生前被执行!
var oDIv = document.getElementById('box');
oDiv.onclick = function(event) {
    	.........
}

在触发的事件的函数里面我们会接收到一个event对象,通过该对象我们需要的一些参数,比如说我们需要知道此事件作用到谁身上了,就可以通过event的属性target来获取到(IE暂且不谈),或者想阻止浏览器的默认行为可以通过方法preventDefault()来进行阻止。以下是event对象的一些属性和方法

属性

描述

altKey

返回当事件被触发时,“alt” 是否被按下。

button

返回当事件被触发时,哪个鼠标按钮被点击。0左键,1中间键,2右键

clientX

返回当事件被触发时,鼠标指针的水平坐标。浏览器可视窗口水平方向的坐标

clientY

返回当事件被触发时,鼠标指针的垂直坐标。浏览器可视窗口垂直方向的坐标

ctrlKey

返回当事件被触发时,“ctrl” 键是否被按下。

metaKey

返回当事件被触发时,“meta” 键是否被按下。

pageX

页面中水平方向的坐标

pageY

页面中垂直方向的坐标

relatedTarget

返回与事件的目标节点相关的节点。

screenX

返回当某个事件被触发时,鼠标指针的水平坐标。电脑屏幕水平方向的坐标

screenY

返回当某个事件被触发时,鼠标指针的垂直坐标。电脑屏幕垂直方向的坐标

shiftKey

返回当事件被触发时,“shift” 键是否被按下。

IE 属性(除了上面的鼠标/事件属性,IE 浏览器还支持下面的属性)

属性

描述

cancelBubble

如果事件句柄想阻止事件传播到包容对象,必须把该属性设为 true。

fromElement

对于 mouseover 和 mouseout 事件,fromElement 引用移出鼠标的元素。

keyCode

返回keydown和keyup事件发生的时候按键的代码,以及keypress 事件的Unicode字符(firefox2不支持 event.keycode,可以用 event.which替代)

offsetX,offsetY

发生事件的地点在事件源元素的坐标系统中的 x 坐标和 y 坐标。

returnValue

一个布尔属性,设置为false的时候可以阻止浏览器执行默认的事件动作(e.returnValue = false; 相当于 e.preventDefault();)

srcElement

对于生成事件的 Window 对象、Document 对象或 Element 对象的引用。

toElement

对于 mouseover 和 mouseout 事件,该属性引用移入鼠标的元素。

x,y

事件发生的位置的 x 坐标和 y 坐标,它们相对于用CSS动态定位的最内层包容元素。

标准 event 属性 下面列出了 2 级 DOM 事件标准定义的属性。

属性和方法

描述

bubbles

返回布尔值,指示事件是否是起泡事件类型。

cancelable

返回布尔值,指示事件是否可拥可取消的默认动作。

currentTarget

返回其事件监听器触发该事件的元素。

defaultPrevented

为true,表示已经调用了preventDefault()

detail

与事件相关的细节信息

eventPhase

返回事件传播的当前阶段。1捕获,2处于目标,3冒泡

initEvent()

初始化新创建的 Event 对象的属性。

preventDefault()

通知浏览器不要执行与事件关联的默认动作,当cancelable方法返回true时可以使用,阻止默认行为(如a标签的跳转行为属于默认行为)

stopPropagation()

不再派发事件,阻止事件的进一步捕获或者冒泡。

target

返回触发此事件的元素(事件的目标节点)。

timeStamp

返回事件生成的日期和时间。

type

返回当前 Event 对象表示的事件的名称。

event对象的一些兼容性写法

//获得event对象兼容性写法
event || (event = window.event);

//获得target兼容型写法
event.target||event.srcElement

//阻止浏览器默认行为兼容性写法
event.preventDefault ? event.preventDefault() : (event.returnValue = false);

//阻止冒泡写法
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble = true);

//注册和删除事件方法的形式
// 绑定事件
function on(id, eventType, fn) {
	var dom = this.isString(id) ? this.$id(id) : id;
	if (dom.addEventListener) {
		dom.addEventListener(eventType, fn);
	} else {
		if (dom.attachEvent) {
			dom.attachEvent('on' + eventType, fn);
		}
	}
}
// 解除绑定
function un(id, eventType, fn) {
	var dom = this.$id(id);
	if (dom.removeEventListener) {
		dom.removeEventListener(eventType, fn, false);
	} else {
		if (dom.detachEvent) {
			dom.detachEvent("on" + eventType, fn)
		}
	}
}

以超链接<a>为例,有三种方法可以阻止默认的跳转行为

使用W3C定义的event.preventDefault()方法和老版本IE上的window.event.returnValue属性

在onclick中直接写javascript语句,并返回false

在href中使用javascript:void(0)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值