js的事件

本人之前认为事件就是一些点击移入等事情触发的事情.

JavaScript使我们可以创建动态的页面,事件是可以被JavaScript监测到的.事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行

IE的事件流是事件冒泡,Netscape Communicator的事件流是事件捕获

事件的所有属性
属性        当以下情况发生时,出现此事件      FF     N     IE
onabort      图像加载被中断               1    3   4
onblur       元素失去焦点                1    2   3
onchange     用户改变域的内容              1    2   3
onclick      鼠标点击某个对象              1    2   3
ondblclick   鼠标双击某个对象              1    4   4
onerror      当加载文档或图像时发生某个错误    1   3   4
onfocus      元素获得焦点                1    2   3
onkeydown    某个键盘的键被按下         1    4   3
onkeypress   某个键盘的键被按下或按住      1    4   3
onkeyup      某个键盘的键被松开         1    4   3
onload       某个页面或图像被完成加载      1    2   3
onmousedown  某个鼠标按键被按下         1    4   4
onmousemove  鼠标被移动                  1    6  3
onmouseout   鼠标从某元素移开              1    4   4
onmouseover  鼠标被移到某元素之上        1    2   3
onmouseup    某个鼠标按键被松开         1    4   4
onreset      重置按钮被点击               1    3   4
onresize     窗口或框架被调整尺寸        1    4   4
onselect     文本被选定                 1    2   3
onsubmit     提交按钮被点击               1    2   3
onunload     用户退出页面                1    2   3

1.事件冒泡

IE的事件流叫做事件冒泡,既事件开始由最具体的元素接收,然后逐级向上传播到较为不具体的节点
事件冒泡触发顺序
div —> body —>html —>document
现在所有的浏览器都支持事件冒泡,有些会跳过HTML

2.事件捕获

另一个事件流叫做事件捕获.事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件.事件捕获的用意是在于在事件达到预定目标之前捕获他.触发事件
document —> html —> body —> div

在事件捕获过程中,document对象首先接收到click事件,然后事件沿DOM树依次向下,一直传播到事件的实际目标.

事件处理程序都带有 ‘on’

一.HTML事件处理程序

可以直接在HTML事件里面书写事件

<input type="button" value="Click me" onclick="alert('hello world')">

也可以在script里面去书写事件

<input type="button" value="Click me" onclick="showMessage()">
<script>
function showMessage() {
    alert('hello world')
}
</script>

这个函数是一个独立的script 元素中定义的,当然也可以被包含在另一个外部文件中,事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码,这样指定事件处理程序具有一些独到之处,这个函数中有一个局部变量event,也就是事件对象

<input type="button" value="Click me" onclick="alert(event.type)">
<!--输出click-->
<input type="button" value="Click me" onclick="alert(this.value)">
<!--输出Click me-->
<input type="button" value="Click me" onclick="alert(value)">

动态创建的函数,可以扩展作用域在函数内部,可以像访问局部变量一样访问document及本元素的成员.

function onclick() {
    with (this.form){
        with (this){

        }
    }
}

二.DOM 0级事件处理程序

DOM0级方法指定的事件处理程序被认为是元素的方法,所以事件处理是在元素作用域中运行

<p id="myBtn">123</p>  输出123 输出myBtn
var btn = document.getElementById('myBtn');
btn.onclick = function () {
    alert(this.innerText);
    alert(this.id)
}
也可以删除DOM 0级事件,将这个值设置为null就可以
btn.onclick = null;

三.DOM 2级事件处理程

DOM 2级事件 定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener()
所有的DOM节点都包括这两个方法,并且都接受三个参数:要处理的事件名,作为事件处理程序的函数和一个布尔值.这个布尔值如果是true.表示在捕获阶段调用事件处理程序,如果是false,表示在冒泡阶段调用事件处理程序.
例子:

<p id="myBtn">123</p>

<script>
输出的是myBtn,采用的是冒泡事件处理程序
var btn = document.getElementById('myBtn');
btn.addEventListener('click',function () {
    alert(this.id);
},false)
</script>

通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除时传入的参数与添加出炉
程序时使用的参数相同.这也意味着通过addEventListen()添加的匿名函数将无法移除

<script>
添加的二级事件
var btn = document.getElementById('myBtn');
btn.addEventListener('click',function () {
    alert(this.id);
},false)

移除的二级事件(但是没有用,匿名函数移除不了) 执行顺序 先显示this.id 后显示 hello world

btn.removeEventListener('click',function () {
    alert(this.id);
},false);
btn.addEventListener('click',function () {
    alert('hello world');
},false)

这样书写的可以移除 添加二级事件

var hander = function () {
    alert(this.id);
};
btn.addEventListener('click',hander,false);
移除二级事件
btn.removeEventListener('click',hander,false);
</script>

IE事件处理程序

IE实现DOM中类似的两个方法:attachEvent()和detachEvent().这两个方法接受相同的两个参数
attachEvent()添加事件 这个执行顺序是先执行hello world 后执行 this.id

btn.attachEvent('onclick',function () {
    alert(this.id)
})
btn.attachEvent('onclick',function () {
    alert('hello world')
})

注意:attachEvent()的第一个参数是’onclick’,而非DOM的addEventener()方法中的’click’

在IE中使用attachEvent()与使用DOM0级方法的主要区别在于处理程序的作用域.在使用DOM0级方法情况下事件处理,程序会在其所属元素的作用域内运行;

在attachEvent()方法中,事件处理程序会在全局作用域中运行,所以this等于window

事件对象

在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息,包括导致事件的元素.事件类型.和与特定事件相关的信息.鼠标操作导致的事件对象中,会包含鼠标位置信息,而键盘操作导致的事件对象中会包含与按下键有关的信息.所有的浏览器都支持event对象

DOM中的事件对象

兼容DOM事件的浏览器中都会将event对象传入到事件处理程序中.无论是DOM0级事件还是DOM2级事件,都会传入event对象.
event,type事件类型

btn.onclick = function (event) {
  alert(event.type)//输出的是'clcik'
};

btn.addEventListener('click',function (event) {
    alert(event.type)//输出的是'click'
},false)
target是目标实际触发者,currentTarget和target值相同
btn.onclick = function (event) {
    alert(event.currentTarget===this); //true
    alert(event.target===this);  //true
}

阻止特定事件的默认行为
event.preventDefault()
阻止事件冒泡和捕获
event.stopPropagation()

IE中的事件对象与DOM中event对象不同写为window.event 阻止默认程序的是 returnValue
写为Window.event.returnValue = false;
阻止默认程序 window.event.cancelBubble = true;

load事件,当页面加载完全后会触发window上面的load事件.有两种定义onload事件处理程序的方式.
第一种方式:EventUtil
第二中是在<bodyonload="alert('Loaded')">

unload事件,与load事件对象是卸载之后发生的事件

resize事件,当浏览器改变时会触发resize事件

scroll事件,在页面中元素改变的时候会触发,例如滚动滑动条.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值