一、设置HTML标签属性为事件处理程序(注意和下面的设置javascript对象属性为事件处理程序是不同的)

用于设置文档元素事件处理程序属性也能化成对应的HTML标签的属性。如果这样做,属性值应该是Javascript代码字符串。这段代码应该是事件处理程序函数的主体,而非完整的函数声明。当指定一串代码作为HTML事件处理程序属性的值时,浏览器会吧代码串转换为类似如下的函数中:

function(event){
  with(){
    with(){
      with(this){
        /* 这里是代码字符串 */
      }
    }
  }
}

实例:

<form onsubmit="checkform();"></form>

这里的checkform并不是事件处理程序函数,它只会作为真正的事件处理程序函数的主体被调用,而非完整的函数声明,这就是为什么很多同学总是在这里写表单验证的时候就算return false也总是会将表单提交,写在checkform()函数里面的return false并没有起到作用,如果想在事件处理程序函数起到不提交的作用,应该改为<form onsubmit="return checkform();"></form>,请记住设置HTML标签属性为事件处理程序时,属性值即使时一个函数也并不是事件处理程序函数,它只是事件处理程序函数的主体。

function(event){
  with(){
    with(){
      with(this){
        return checkform();/* 这里是代码字符串 */
      }
    }
  }
}

二、设置javascript对象属性为事件处理程序

注册事件处理程序最简单的方式就是通过设置时间目标的属性为所需事件处理程序函数。按照约定,事件处理程序属性的名字由"on"后面跟着事件名组成;onclick、onchange、onload、onmouseover等。注意这些属性名师区分大小写的,所有的都是小写,及时事件类型是由多个词组成。

缺点是其设计都是围绕着架设每个事件目标对于每种事件类型将最多只有一个处理程序。

var btn = document.getElementById("myBtn");
btn.onclik = function(){
alert("thanks!");
}

三、addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作。

所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最有这个布尔值参数是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。

要在按钮上为click事件添加事件处理程序,可以使用下列代码:

var btn = document.getElementById("myBtn");
btn.addEventListener("click", function () {
alert(this.id);
}, false);

使用DOM2级方法添加事件处理程序的主要好处是可以为同一个对象注册同一事件类型的多个处理程序函数,而且不会覆盖对象属性为事件处理程序。来看下面的例子:

var btn = document.getElementById("myBtn");
btn.onclick = function(){alert(this.id)}
btn.addEventListener("click", function () {
alert(this.id);
}, false);
btn.addEventListener("click", function () {
alert("Hello World");
}, false);

通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;移除时传入的参数与添加处理程序时使用的参数相同。这也意味着通过addEventListener()添加的匿名函数无法移除,如下面的例子所示:

var btn = document.getElementById("myBtn");
btn.addEventListener("click", function () {
alert(this.id);
}, false);
btn.removeEventListener("click", function () { //无效!
alert(this.id);
}, false);

在这个例子中,我使用addEventListener()添加一个事件处理程序。虽然调用removeEventListener()是看似使用了相同的参数,但实际上,第二个参数与传入addEventListener()中的那一个完全不同的函数。而传入removeEventListener()中的事件处理程序函数必须与传入addEventListener()中的相同,如下面的例子所示:

var btn = document.getElementById("myBtn");
var handler = function () {
alert(this.id);
};
btn.addEventListener("click", handler, false);
btn.removeEventListener("click", handler, false); //有效!

重写后的这个例子没有问题,是因为在addEventListener()和removeEventListener()中用来相同的函数。

IE中实现了与DOM中用于处理指定和删除事件处理程序操作类似的两个方法:attachEvent()和detachEvent()。因为IE事件模型不支持事件捕获,所以这两个方法只接受相 同的两个参数:事件处理程序名称与事件处理程序函数。由于IE只支持事件冒泡,所以同各国attachEvent()添加的事件处理程序都会被添加到冒泡 阶段。

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

var btn = document.getElementById("myBtn");
btn.attachEvent("onclick", function () {
alert(this == window); //ture
})

注意,attachEvent()第一个参数是“onclick”,而非DOM的addEventListener()方法中的“Click”。

与addEventListener()类似,attachEvent()方法可以用来为一个元素添加多个事件处理程序。来看下面的例子:

var btn = document.getElementById("myBtn");
btn.attachEvent("onclick", function () {
alert("Clicked");
});
btn.attachEvent("onclick", function () {
alert("Hello World!") ;
});

使用attachEvent()添加事件可以通过detachEvent()来移除,条件是必须提供相同的参数。与DOM方法一样,这也意味着添加 的匿名函数将不能被移除。不过,只要能够将相对相同函数的引用传给detachEvent(),就可以移除相应的事件处理程序。例如:

var btn = document.getElementById("myBtn");
var handler = function () {
alert("Clicked");
}
btn.attachEvent("onclick", handler);
btn.detachEvent("onclick", handler);

这个例子将保存在变量handler中的函数作为事件处理程序。因此,后面的detachEvent()可以使用相同的函数来移除事件处理程序。

大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这样可以最大限度地兼容各种浏览器。最好只在需要在是时间到达目标之前截获它的时候将事件处理程序添加到捕获阶段。如果不是特别需要,我们不建议在事件捕获阶段注册事件处理程序。

四、事件处理程序的返回值(补充)

通过设置对象属性或HTML属性注册时间处理程序的返回值有时是非常有意义的。通常情况下,返回值false就是告诉浏览器不要执行这个事件相关的默认操作。例如,表单提交按钮的onclick事件处理程序能返回false组织浏览器提交表单。(当用户的输入在客户端验证失败时,这是有用的。)类似的,如果欧诺个户输入不合适的字符,输入域上的onkeypress事件处理程序能通过返回false来过滤键盘事件。

window对象的onbeforeunload事件处理程序的返回值也非常有意义。当浏览器将要跳转到新页面时触发这个事件。如果事件处理程序返回一个字符串,那么它将出现在询问用户是否想离开当前页面的标准对话框中。

理解事件处理程序的返回值只对通过属性注册的处理程序才有意义这非常重要。接下来我们将看到使用addEventListener()或attachEvent()注册事件处理程序转而必须调用preventDefault()方法或设置事件对象的returnValue属性。明白的说就是return false对addEventListener()或attachEvent()是不起作用的,不能阻止默认操作,要通过preventDefault()来阻止默认操作。

var form= document.getElementById("myform");
form.addEventListener("submit",function(e){
// 要用preventDefault()阻止默认行为
e.preventDefault();
// return false 没用
})

注册事件处理程序onclick和addEventListener、attachEvent的更多相关文章

  1. 事件处理程序(addEventListener 和 attachEvent)

    1.addEventListener 和 removeEventListener 接收三个参数:要处理的事件名.作为事件处理程序的函数和布尔值 缺点:不兼容IE <body> <in ...

  2. js事件流、事件处理程序/事件侦听器

    1.事件流 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档). 事件捕获 ...

  3. 学习javascript中的事件——事件处理程序

    事件就是用户或浏览器自身执行的某种动作.诸如 click.load 和 mouseover ,都是事件的名字.而响应某个事件的函数就叫做事件处理程序(或事件侦听器).事件处理程序的名字以“on”开头, ...

  4. javaScript事件(二)事件处理程序

    一.事件 二.事件流 以上内容见:javaScript事件(一)事件流 三.事件处理程序 前面提到,事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字.响应 ...

  5. 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解

    <javascript高级程序设计>跨浏览器事件处理程序EventUtil.js个人注释 EventUtil.js // 跨浏览器事件处理程序封装 var EventUtil = { // ...

  6. DOM 事件流与事件处理程序

    ㈠事件流 ▶事件:是文档和浏览器窗口中发生的,特定的交互瞬间. ▶事件流:描述的是从页面中接受事件的顺序   ⑴DOM事件冒泡 定义:事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接受,然后 ...

  7. FF,chrome与IE的事件处理程序

    今天学习了js的事件处理程序,IE与FF,chrome,safari,opera的处理事件方法不同,FF,chrome,safari,opera支持addEventLisener,而addEventL ...

  8. SharePoint 2013 新功能探索 之 SPGroup、SPUser 事件处理程序 还要继续改进

    曾几何时,想要获取SPGroup Add及SPUserAdd事件,在网上查找各种方法,都没有找到相对应的解决办法,如今在VS 2013 Preview版本 提供了 SPSecurityEventRec ...

  9. IE attachEvent事件处理程序(事件绑定的函数)的this指向的是window不是执行当前事件的dom元素

    IE attachEvent事件处理程序(事件绑定的函数)的this指向的是window不是执行当前事件的dom元素. attachEvent(type,listener); listener函数中的 ...

随机推荐

  1. [Android Pro] Android保存图片到系统图库

    http://stormzhang.github.io/android/2014/07/24/android-save-image-to-gallery/ http://blog.csdn.net/x ...

  2. Python下安装MySQLdb

    前提是你已经安装过mysql 1.从https://pypi.python.org/pypi/MySQL-python/下载MySQL-python,然后用rz命令上传到相关目录 2.用tar -zx ...

  3. Xcode 7如何免费真机调试iOS应用

    Xcode 7如何免费真机调试iOS应用的简单方式: 运行Xcode后,点击菜单中的Preferences…进入Accounts标签,这里选择添加Apple ID:在弹出的对话框中登入你的Apple ...

  4. jquery学习笔记---闭包,原型链,this关键字

    网上的资料很多,关于闭包,原型链,面向对象之内的.本人也有一点自己的总结. 关于this: this 的值取决于 function 被调用的方式,一共有四种, 如果一个 function 是一个对象的 ...

  5. 如何使用Case进行简单判断

    Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 ' T ...

  6. MyEclipse 选中右侧编辑的文件时自动展开左侧目录树

  7. cmder

    添加cmder到右键菜单 Cmder.exe /REGISTER ALL 打开配置快捷键 win+alt+p 文字重叠 main->font->去掉monospace的勾 λ符号修改 找到 ...

  8. WPF 多语言实现

    很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件.这篇博客中将介绍在WPF中实现多语言的方式. 方式一,使用WPF动态资源的方式实现.先简单介绍下StaticResour ...

  9. Java Data Type

    官方文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 转载地址:http://blog.csdn.n ...

  10. PMP 第八章 项目质量管理

    1规划质量 2实施质量保证 3实施质量控制 质量成本 1.等级和质量的区别?现代质量管理的重要性,关注图8-2    质量是一些列内在特性满足要求的程度,而等级是对用途相同但技术特性不同的产品或服务的 ...