javascript笔记7-事件

由处理程序来监听某个动作,一旦某个动作发生,那么处理程序就作出响应,这就是观察者模式的简单案例。在JavaScript中,按钮一旦被点击(或者其他动作,拿点击按钮举例),就会有响应的处理程序进行响应,比如,点击按钮弹出一个对话框、鼠标滑过按钮会提示一行字等等,这就是JavaScript中要讲的事件,也属于经典的观察者模式。

  1. 事件流。

    在DOM树中,可能一个<button>元素属于一个<div>元素的子元素,而<div>又属于<html>的子元素。这个时候,点击<button>这个元素,<button>就会触发一个事件(或者一个动作),而<div>、<html>有可能也要接收到这个事件的信号。也就是说,你打了button一下,它的父亲、祖父都会感受到你的打击。这就是事件流。IE的事件流是事件冒泡流。
  2. 事件冒泡
    • IE的事件流叫做事件冒泡。即事件从最深的元素开始接收,然后逐级向上传播。

      如:打了孙子一下,孙子感受到疼,然后父亲感知,最后爷爷感知,追本溯源,直到老祖宗感知。
    • 事件冒泡的过程图:
  3. 事件捕获
    • 事件捕获与事件冒泡正好相反,即从最外层开始接收事件,直到最深的元素。

      骂了姓张的人,首先张姓的祖宗感到耻辱,接着张姓的爷爷、爸爸、自己分别感受到。
    • 事件捕获很少用到。过程图与事件冒泡相反。
  4. DOM的事件流
    • DOM2级事件包括三个阶段:事件捕获阶段、处理目标阶段、事件冒泡阶段。

      先发生事件捕获,传递到最深一层,由具体元素接收到事件,然后冒泡并处理程序。(下面讲到第10节事件对象的target属性时会具体解释这一现象)
    • 过程图:
  5. 事件处理程序
    • 事件就是用户或者浏览器自身执行的某种动作。而响应某个事件的函数就叫做事件处理程序。

      诸如click、load、mouseover都是事件的名字。
      事件处理程序的名字则在前面加on,比如:onclick、onload等。
    • 示例:
       1 <body>
       2     <input type="button" value="Click Me" onclick="alert(‘Clicked‘)" />
       3     <!--双引号转义-->
       4     <input type="button" value="Click Me" onclick="alert(&quot;Clicked&quot;)" />
       5
       6     <script type="text/javascript">
       7         function showMessage(){
       8             alert("Hello world!");
       9         }
      10     </script>
      11     <input type="button" value="Click Me" onclick="showMessage()" />
      12     <!--防止在函数未加载时点击-->
      13     <input type="button" value="Click Me" onclick="try{showMessage();}catch(ex){}" />
      14 </body>
      <input>是元素,
      onclick是事件处理程序的名字,跟value、type一样,是属性。
    • 缺点:
      • 如果<input>写在<script>上方,函数尚未加载时,用户可能就点击元素,导致报错。所以上面代码13行进行try catch捕获。
      • 如果要修改事件函数,那么<input>里的onclick和<script>里的具体函数都要修改,HTML与JavaScript太紧密耦合。
  6. DOM0级事件处理程序
    • 在JavaScript中,取出要触发的元素,把函数赋值给事件处理程序属性。

       1 <body>
       2     <input type="button" id="myBtn" value="Click Me" />
       3     <input type="button" id="myRemoveBtn" value="Remove Event Handler" />
       4     <script type="text/javascript">
       5         var btn = document.getElementById("myBtn");
       6         //会在事件流的冒泡阶段处理
       7         btn.onclick = function(){
       8             alert(this.id);//this指示当前元素
       9         };
      10
      11         var removeBtn = document.getElementById("myRemoveBtn");
      12         removeBtn.onclick = function(){
      13             btn.onclick = null;//删除事件处理程序
      14         };
      15     </script>
      16 </body>
  7. DOM2级事件处理程序
    IE9及其他主流浏览器支持DOM2级事件处理程序。
    • DOM2级事件给元素定义了两个方法:

      • 指定事件处理程序的操作:addEventListener();
      • 删除事件处理程序的操作:removeEventListener();
      • DOM2级之于DOM1级最大的优势在于,可以注册多个事件。
        比如点击某个按钮,要弹出一个提示框,同时要按钮改变颜色,这时就需要同时添加两个事件处理程序。
      • 示例:

        <body>
            <input type="button" id="myBtn" value="Click Me" />
            <p>This example won‘t work in Internet Explorer.</p>
            <script type="text/javascript">
                var btn = document.getElementById("myBtn");
                btn.addEventListener("click", function(){
                    alert(this.id);
                }, false);
                /**第三个参数默认为false,表示在冒泡阶段触发。如果为true,表示在捕获阶段触发,true一般不会用*/
                btn.addEventListener("click", function(){
                    alert("Hello world!");
                }, false);
        
            </script>
        </body>
  8. IE事件处理程序
    • IE事件给元素定义了两个方法:

      • 指定事件处理程序的操作:attachEvent();
      • 删除事件处理程序的操作:detachEvent();
    • attachEvent()与DOM0级注册事件在作用域上有不同。
      • DOM0级:作用域是所属元素。

        即:如果在函数中使用this,this指示当前元素
      • attachEvent():作用域是全局作用域(即window)。
    • 添加多个事件处理程序,按相反的顺序触发。
  9. 跨浏览器的事件处理程序
    • 为保持兼容,可以写一个公共事件Util。下面是Util中的添加事件示例:

       addHandler: function(element, type, handler){
              if (element.addEventListener){
                  element.addEventListener(type, handler, false);
              } else if (element.attachEvent){
                  element.attachEvent("on" + type, handler);
              } else {
                  element["on" + type] = handler;
              }
          }
  10. 事件对象
    • 在触发DOM上的某个事件时,会在方法中传入一个事件对象event(隐藏),这个对象中包含着所有与事件相关的信息。下面列举部分event的属性:

      • currentTarget:当前正在处理事件的那个元素。
      • target:事件的目标。
        在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标。一般情况下,currentTarget都与target相等。但是,假如<button>的父元素是<div>,你给<div>元素绑定了一个onclick,那么这时,<div>元素是currentTarget值,而target是最终目标:<button>(向下捕获)。由于按钮<button>上并未绑定onclick事件处理程序,结果click事件就冒泡到了<div>,在那里事件得到处理。
    • IE中的事件对象
      IE中的事件对象与其他主流浏览器稍微不同,比如,使用DOM0级方法添加事件处理程序时,方法中传入的event对象是window对象的一个属性,event事件对象的目标对象属性为srcElement而非target等等。所以一般情况下会写一个跨浏览器的Util。
  11. 事件类型
    • 上述举例最多的是onclick事件类型,实际上,事件类型多种多样,如:

      • UI事件:用户与界面交互时触发。
      • 焦点事件:元素获得或者失去焦点时。
      • 鼠标事件:单击、双击、右击等。
      • 滚轮事件:鼠标滑轮滚动时。
      • 键盘事件:键盘上按下某个键时。
      • 等等。
    • javascript中最常用的事件就是load,页面全部加载后,就会触发load事件。
    • 图像上面也可以触发load事件,当图像加载完毕时可以指定事件。
    • 用户从一个页面切换到另一个页面,会触发unload事件。
    • 当浏览器窗口大小被调整后,会触发resize事件。
    • 键盘事件也经常用到。
      • keydown:用户按下键盘上的任意键时触发。按住不放会重复触发。
      • keyup:用户释放键盘上的键时触发。
      • 在发生keydown或者keyup时,event对象的keyCode属性会包含一个数字,与键盘上的一个特定的键对应。(比如:回车:13;退出:27;左箭头:37;等等)。
      • 使用回车键触发事件举例:

        <meta http-equiv="content-type" content="text/html; charset=gb2312"/>
        <script type="text/javascript">
            function show () {
              //火狐不支持window.event,所以加入"或"条件
              var e=window.event||arguments.callee.caller.arguments[0];
              if(e.keyCode==13){
                  alert("你按下了回车");
              }
            }
        
        </script>
        <input onkeydown="show();" value="触发键盘试试">
  12. 内存和性能
    在javascript中,添加到页面上的事件处理程序数量将直接影响到页面整体的运行性能。
    每个函数都是对象,都会占用内存。
    内存中的对象越多,性能就越差。
    所以要利用好事件处理程序,比如使用事件委托等。
时间: 2024-08-01 06:17:43

javascript笔记7-事件的相关文章

JavaScript笔记04——事件与回调

1.在浏览器中,大多数代码都是由事件驱动的(event-driven). 这和生物中的神经反射有点类似. 比如说,谷歌页面上的一个按钮, 当我们“按下”这个按钮的时候,将跳出如下界面. 那么你有没想过,这个过程是怎么发生的呢? 很显然,在我们按下按钮的时候,一定是有“某一段代码“被调用. 这个“某一段代码“就是我们通常所说的“回调函数”(callback). 2.那么如何自己来实现一个这样的功能呢? 很自然的可以想到,既然要对一个特定的事件做出响应,我们需要知道的事情是 “特定的事情发生了没有?

javascript - 工作笔记 (事件四)

在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装, JavaScript Code 12345   yx.bind(item, "click", function (e) {         //console.log("Div Click 1 !");         alert("Div Click 1 !");         e.stopPropagation();     }); 但是这样用起来有些

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle&lt;T&gt;

Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T> 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现和源码 下一篇用它们做一个多语言的demo 这两个是事件的订阅和广播,很强大,但用的时候要小心发生不必要的冲突. 先看一下它的实现思想 在Caliburn.Micro里EventAggregator要以单例的形式出现这样可以

JavaScript:理解worker事件api

如果你不是很了解Event事件,建议先看我上一篇随文javascript:理解DOM事件.或者直接看下文worker api. 首先,我们需要实例一个Worker的对象,浏览器会根据新创建的worker对象新开一个接口,此接口会处理客户端与indexedDB数据库之间的通信.这里的数据库是指浏览器数据库.如果,你需要判断浏览器是否支持worker对象,详见如下代码.或者浏览器是否支持indexedDB数据库,详见同下,二者判断最好选择前者.因为IE不支持indexedDB . if(window

javascript中的事件

在javascript中的事件有三个方面的知识,一是事件流,二是事件处理程序,三是事件对象.下面就我个人的一点理解,分别讲述一下这三个方面的内容. 第一.事件流 事件流指的是事件按照一定的顺序触发.它有两个顺序,分别是自上而下和自下而上. 自上而下的叫做事件捕获,事件捕获指的是事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递.在这个过程中,事件会被从文档根到事件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useC

JavaScript笔记之Function

一.函数定义 (1)使用function declaration 格式:function functionName(parameters) { function body } 注:此种方式声明的函数作用域是全局的,即在声明之前可以调用 (2)使用function expression 格式:var name = function (parameters) { function body }; 注:与(1)不同,在声明之前不可以调用 (3)使用function constructor() 格式:v

javaScript中的事件三

javaScript中的事件三 先看两种错误的写法,他们的目的都是:添加两个事件: 错误方式一: window.onload=function (){ alert('event 1'); } window.onload=function (){ alert('event 2') } 错误方式二: window.onload=function (){ var obj=document.getElementById("but"); obj.onclick=function(){ alert

javascript中奇怪事件

javascript中奇怪事件 为啥叫奇怪事件了,应该是我目前掌握的知识暂时不能解释这种现象滴呀(也许可以用事件流的概念来解释滴呀) 看布局: #hideInfo{ height:100px; width:100px; background:green; position:absolute; top:20px; left:-90px; } #hideInfo span{ height:100px; width:100px; background:blue; position:absolute;

javascript鼠标中键滚动事件介绍

javascript鼠标中键滚动事件介绍:在实际应用中,鼠标的一些事件非常常用,例如,onclick事件.onmouseover事件等,这里就不介绍了,具体可以参阅javascript的onclick事件和javascript的onmouseover事件一章节. 还有一种事件比较少用,那就是鼠标中键滚轮滚动事件,下面就通过代码实例简单介绍一下中键滚轮事件.IE浏览器和谷歌浏览器支持mousewheel事件,也就是鼠标中键滚动事件,但是遗憾的是火狐浏览器并不支持此事件,而是支持DOMMouseSc

JavaScript笔记5-事件

一.概述: 事件是可以被JavaScript侦测到的行为.网页中的每个元素都可以产生某些可以触发JavaScript函数的事件.相当于让标签在满足某种条件的时候,调用指定的方法. 二.常用事件 1:onload事件:表示页面上的其他元素全部加载完成之后,再执行指定的方法; 格式:       1)直接定义一个带名称的方法,在body标签中,使用onload="方法名()";     2)写在js文件中:     window.onload=function(){         Js代