(第九天)DOM事件

addEventListener

使用addEventListner()方法可以为事件目标注册事件处理程序。addEventListner()接受三个参数。第一个是要注册处理程序的事件类型,这个事件类型(或名字)是字符串,但它不包括应该用于设置事件处理程序属性的前缀”on“。第二个参数是当指定类型的事件发生时应该调用的函数。最后一个参数时布尔值。通常情况下,会给这个参数传递false。如果相反传递了true,那么函数将注册为捕获事件处理程序,并在事件不同的调度阶段调用。你可以忽略第三个参数并无须传递false,同时规范最终应该会改变从而允许这么做。但在下面例子忽略这个参数可能在某些浏览器中报错。

                <button id = "btn">click me</button>

                var b = document.getElementById("btn");
                b.onclick = function() {
                    alert("Thanks for clicking me!");
                }
                b.addEventListener("click", function() {
                    alert("Thanks again!");
                }, false);

上述中用"click"作为第一个参数调用addEventListener()不会影响onclick属性的值。在前面的代码中,单击按钮会产生两个alert()对话框。

(1)通过多次调用addEventListener()为同一个对象注册同一事件类型的多个处理程序函数。当对象发生事件时,所有该事件类型的注册处理程序都会按照注册的顺序调用。

(2)使用相同的参数在同一个对象上多次调用addEventListener()是没用的,处理程序仍然只注册一次,同时重复调用也不会改变调用处理程序的顺序。

attachEvent

IE9之前的IE不支持addEventListener()和removeEventListener()。IE5及以后版本定义了类似的方法attachEvent()和detachEvent()。

attachEvent()和detachEvent()方法的工作 原理与addEventListender()和removeEventListener()类似,但有一下例外:

  • 因为IE事件模型不支持事件捕获,所以attachEvent()和detachEvent()要求只有两个参数:事件类型和处理程序函数。
  • IE方法的第一个参数使用了带”on“前缀的事件处理程序属性名,而非没有前缀的事件类型。例如,当给addEventListener()传递"click"时,要给attachEvent()传递”onclick“。
  • attachEvent()允许相同的事件处理程序函数注册多次。当特定的事件类型发生时,注册函数的调用次数和注册次数一样。

经常可以看到的事件处理程序注册代码是在支持addEventListener()的浏览器中就调用它,否则就用attachEvent():

var b = document.getElementById("mybutton");

var handler = function() { alert("Thanks!"); };

if (b.addEventListener)
    b.addEventListener("click", hanlder, false);
else if (b.attachEvent)
    b.attachEvent("onclick",handler)

事件处理程序的参数

在IE8以前的版本中,通过设置属性注册事件处理程序,当调用它们时并未传递传递事件对象。取而代之,需要通过全局对象 window.event 来获得事件对象。出于互通性,你可编写如下程序,这样如果没有参数就使用window.event:

function handler(event) {
       event = event || window.event;

}

向使用attachEvent()注册事件处理程序传递事件对象,但它们也能使用window.event。

事件取消

在支持addEventListener()的浏览器中,也通过调用事件对象的 preventDefault() 方法来取消事件的默认操作。不过,在IE9之前的IE中,可以通过设置事件对象的 returnValue 属性为false来达到同样的效果。

            window.onload = function() {
                var a = document.getElementById("a");
                a.onclick = function(event){
                    event.preventDefault();
                }
            }

           <a id="a" href="http:www.cnblogs.com">clcik me</a>

/*在IE9以下是不好使的!显示错误:无法获取未定义或 null 引用的属性“preventDefault”*/

接下来进行修改如下:

          window.onload = function() {
                var a = document.getElementById("a");
                a.onclick = function(event){
                       var event = event || window.event;
                       event.preventDefault();
                }
            }

           <a id="a" href="http:www.cnblogs.com">clcik me</a>

           /*但是在IE8以下还是不支持,必须用event.returnValue = false*/

下面的代码给出三种事件取消技术

function cancelHandler(event) {
     var event = event || window.event;

       /*这里是处理事件的代码*/
     if (event.preventDefault) event.preventDefault();  //标准技术

     if (event.returnValue) event.returnValue = false; //IE

     return false; //用于处理使用对象属性注册的处理程序
}

事件传播(事件冒泡)

概念

在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

(1)event.stopPropagation()

事件处理过程中,阻止了事件冒泡,但不会阻击默认行为(它就执行了超链接的跳转)

【注】IE9之前IE不支持stopPropagation()方法。相反,IE事件对象有一个 cancelBubble 属性,设置这个属性为 true 能阻止事件进一步传播。

(2)return false

事件处理过程中,阻止了事件冒泡,也阻止了默认行为

(3)event.preventDefault()

它的作用是:事件处理过程中,不阻击事件冒泡,但阻击默认行为(它只执行所有弹框,却没有执行超链接跳转)

(4)stopImmediatePropagation()

此方法阻止了任何其他对象的事件传播,但也阻止了在相同对象上注册的任何其他事件处理程序的调用。【注】该方法只在IE 11+上支持,如果要求对IE兼容性支持的话,此方法不建议使用

鼠标事件

 1 click
 2
 3 contextmenu
 4 /*可以取消的事件,当上下文菜单即将出现时触发。当前浏览器在鼠标右键时显示上下文菜单,所以这个事件也能像click事件使用*/
 5
 6 ondblclick
 7 /*当用户双击鼠标时触发*/
 8
 9 mousedown
10 /*当用户按下鼠标按键时触发*/
11
12 mouseup
13 /*当用户释放鼠标按键时触发*/
14
15 mousemove
16 /*当用户移动鼠标时触发*/
17
18 mouseover
19 /*当鼠标进入元素时触发*/
20
21 mouseout
22 /*当鼠标离开元素时触发*/
23
24 mouseenter
25 /*类似”mouseover,但不冒泡。IE将其引入,HTML5将其标准化,但未广泛实现“*/
26
27 mouseleave
28 /*类似”mouseout,但不冒泡。IE将其引入,HTML5将其标准化,但尚未广泛实现“*/

文本事件

浏览器有三个传统的键盘输入事件。onkeydown事件、onkeyup事件和onkeypress事件。这三者中keypress是比较高级的事件,它表示产生了一个可打印字符。并且通过keypress事件传递的对象更加混乱。一个onkeypress事件表示输入的单个字符。事件对象以数组Unicode编码的形式指定字符,所以必须用String.fromCharCode()把它转换成字符串。

时间: 2024-10-07 06:41:36

(第九天)DOM事件的相关文章

从click事件理解DOM事件流

事件流是用来解释页面上的不同元素接受一个事件的顺序,首先要明确两点: 1.一个事件的影响元素可能不止一个(同心圆理论),但目标元素只有一个. 2.如果这些元素都绑定了相同名称的事件函数,我们怎么知道这些函数的运行顺序?于是有了事件流的概念(事件捕捉,事件冒泡) 举个例子: <div id="outer"> <p id="inner">Click me!</p> </div> 为了看起来方便,先无视CSS样式,那么蓝色的

DOM事件模型学习笔记

下面的内容属于阅读笔记,其中涉及大量内容来自于PPK的博客的内容,如果你要跟随我的脚步领略大家风采,那么就从Introduction to Events开始阅读吧. 现代的前端开发应该是会严格遵守 html 展示文档内容构成,css 渲染页面效果,javascript 提供交互 浏览器提供交互行为可以追溯到Netscape公司在其第二个版本中支持javascript语言,随后其与微软之间的浏览器大战,以及w3c标准制定的落后,导致至今一直被诟病的浏览器兼容问题,而这些不兼容中关于DOM事件模型的

整理之DOM事件阶段、冒泡与捕获、事件委托、ie事件和dom模型事件、鼠标事件

整理之DOM事件阶段 本文主要解决的问题: 事件流 DOM事件流的三个阶段 先理解流的概念 在现今的JavaScript中随处可见.比如说React中的单向数据流,Node中的流,又或是今天本文所讲的DOM事件流.都是流的一种生动体现.用术语说流是对输入输出设备的抽象.以程序的角度说,流是具有方向的数据. 事件流分事件冒泡与事件捕获 在浏览器发展的过程中,开发团队遇到了一个问题.那就是页面中的哪一部分拥有特定的事件? 可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其

DOM 事件深入浅出(一)

在项目开发时,我们时常需要考虑用户在使用产品时产生的各种各样的交互事件,比如鼠标点击事件.敲击键盘事件等.这样的事件行为都是前端DOM事件的组成部分,不同的DOM事件会有不同的触发条件和触发效果.本文就将带大家深入浅出地了解DOM事件的那些属性和方法. 首先在介绍DOM事件之前我们先来认识下DOM的不同级别.针对不同级别的DOM,我们的DOM事件处理方式也是不一样的. DOM级别与DOM事件 DOM级别一共可以分为4个级别:DOM0级,DOM1级,DOM2级和 DOM3级,而DOM事件分为3个级

用dom操作样式和dom事件

1.样式表的操作 1.1获取样式表: var cssRules = document.styleSheets[0].cssRules //DOM规范 document.styleSheets[0].rules //IE 1.2获取最终样式 var divEle = document.getElementById("divId"); var backgroundColor = divEle.currentStyle.backgroundColor; //IE var background

你真的了解DOM事件么?

你真的了解DOM事件么? 我们大家都知道,人与人之间的交流可以通过语言,文字,肢体动作,面部微表情等,但是你知道Javascript和HTML之间是通过什么进行交互的么?你又知道Javascript和HTML之间是如何进行交互的么?如果你不是那么清楚,可以看这篇文章... 前面的话: 这篇博文由浅入深,先介绍两种事件流,然后介绍常见的事件处理程序以及它们之间的差异(涉及到一个简单的兼容的处理函数),后面还会针对事件对象进行深入学习,最后则是通过DOM事件实现的小案例. 事件流: 关于事件流,简单

【转载】DOM 事件深入浅出(二)

DOM 事件深入浅出(二) 在DOM事件深入浅出(一)中,我主要给大家讲解了不同DOM级别下的事件处理程序,同时介绍了事件冒泡和捕获的触发原理和方法.本文将继续介绍DOM事件中的知识点,主要侧重于DOM事件中Event对象的属性和方法. 那么什么是DOM事件中Event对象呢?事件对象(event object)指的是与特定事件相关且包含该事件详细信息的对象.我们可以通过传递给事件处理程序的参数获取事件触发后所产生的一系列方法和属性. Event对象 Event对象其实是一个事件处理程序的参数,

DOM事件

在慕课网上学习了DOM事件探秘课程,特此整理了一下笔记. 慕课网DOM事件探秘课程地址:http://www.imooc.com/learn/138 事件 是文档或浏览器窗口中发生的特定的交互瞬间.[JavaScript <------>HTML] 事件流 描述的是从页面中接受事件的顺序 (IE:事件冒泡流 / Netscape事件捕获流) 事件的三个阶段 事件的三个阶段分别是:捕获阶段.目标阶段.冒泡阶段 事件冒泡流:即事件最开始由最具体的无素(文档中嵌套层次最深的那个节点)接收,然后逐级向

JavaScript学习总结【10】、DOM 事件

DOM 事件是 JS 中比较重要的一部分知识,所谓事件,简单理解就是用户对浏览器进行的一个操作.事件在 Web 前端领域有很重要的地位,很多重要的知识点都与事件有关,所以学好 JS 事件可以让我们在JS的学习道路中更进一步. 1.事件流 事件流描述的是从页面中接受事件的顺序.但是 IE 和 Netscape 开发团队提出了两个截然相反的事件流概念,IE 的事件流是事件冒泡流,而 Netscape 的事件流是事件捕获流. (1).事件冒泡 事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的

javascript的IE事件和DOM事件模型

通用的事件模型: 1.是在HTML页面绑定 <button id="button" onclick="function();">按钮</button> 2.在javascript脚本文件中绑定事件处理 document.getElementById('button').onclick = function; IE中的事件模型 1.使用script for绑定(这个绑定很少用) <script for="btn1" e