zoukankan      html  css  js  c++  java
  • 13事件

    JavaScript和HTML之间的交流是通过事件实现的。事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。

    13.1事件流

    事件流描述的是从页面中接收事件的顺序。

    IE的事件流叫做事件冒泡(event bubbling),即事件开始有最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点应该最后接收到事件。

    13.2事件处理程序

    事件就是用户或浏览器自身执行的某种动作。而响应某个事件的函数就叫做事件处理程序(或事件侦听器)。

    HTML事件处理程序

    事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。局部变量event就是事件对象,在函数内部,this值等于事件的目标元素,注意拓展作用域的方法。

    在HTML中指定事件处理程序的缺点:存在时差问题;扩展事件处理程序的作用域链在不同浏览器中会导致不同结果;HTML与JavaScript代码紧密耦合。

    DOM0级事件处理程序

    通过JavaScript指定事件处理程序的传统方式,就是将一个函数复制给一个事件处理程序的属性。程序中的this引用当前元素。将事件处理程序设置为null之后,再单击按钮将不会有任何动作发生。

    DOM2级事件处理程序

    addEventListener()和removeEventListener()方法用于指定和删除事件处理程序,都接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值(true:捕获阶段调用;false:冒泡阶段调用)。使用DOM2级方法添加事件处理程序的主要好处是可以添加多个事件处理程序(按添加顺序触发)。用removeEventListener()移除时,参数要相同。

    IE事件处理程序

    attachEvent()(可添加多个事件处理程序,以相反的顺序被触发)和detachEvent()(移除时,参数要相同)参数接收相同的2个参数:事件处理程序名称与事件处理程序函数。

    在IE中使用attachEvent()与使用DOM0级方法的主要区别在于处理程序的作用域。DOM0的作用域为所属元素的作用域,而attachEvent()在全局作用域中运行,this等于window。

    跨浏览器的事件处理程序

    第一个要创建的方法是addHandler(),视情况分别使用DOM0级方法、DOM2级方法或IE方法来添加事件

    13.3事件对象

    在触发DOM上的某个事件时,会产生一个事件对象event。

    DOM中的事件对象

    对象this始终等于currentTarget的值,而target则只包含事件的实际目标。在需要通过一个函数处理多个事件时,可以使用type属性。要阻止特定事件的默认行为,可以使用preventDefault()(前提是cancelable属性设置为true)。stopPropagation()方法用于立即阻止事件在DOM层次中的传播,即取消进一步的事件捕获或冒泡。事件的eventPhase属性,可以用来确定事件当前正处于事件流的哪个阶段。

    IE中的事件对象

    用event.srcElement表示事件目标比较保险。preventDefault()方法可以取消给定事件的默认行为(returnValue设置为false)。cancelBubble属性用来停止时间冒泡。

    跨浏览器的时间对象

    13.4事件类型

    UI事件

    UI事件指的是那些不一定与用户操作有关的事件。

    当页面完全加载后(包括所有图像、JavaScript文件、CSS文件等外部资源),就会触发window上面的load事件。有两种定义方式:通过JavaScript来指定事件处理程序的方式(推荐用这种);为<body>元素添加一个onload特性。新图像不一定要从添加到文档后才开始下载,只要设置了src属性就会开始下载。

    unload事件在文档被完全卸载后触发。利用这个事件最多的情况是清除引用,以避免内存泄漏。有两种方式定义(和load一样)。

    当浏览器窗口被调整到一个新的高度或宽度时,就会触发resize事件,可以通过JavaScript或者<body>元素中的onresize特性来指定事件处理程序。

    在混杂模式,可以通过<body>元素的scrollLeft和scrollTop来监控scroll事件,在标准模式下,可以通过<html>元素来放映这一变化。

    焦点事件

    焦点事件会在页面获得或失去焦点时触发,与document.hasFocus()和document.activeElement属性配合。

    6个焦点事件:blur(不冒泡)、DOMFocusOut、focusout、focus(不冒泡)、DOMFocusIn、focusin。

    鼠标和滚轮事件

    9个鼠标事件:mousedown、mouseup、click、dblclick、mouseenter、mouseleave、mousemove、mouseout和mouseover

    客户区坐标位置:clientX、clientY

    页面坐标位置:pageX、pageY

    屏幕坐标位置:screenX、screenY

    DOM规定了4个属性,表示修改键的状态:shiftKey、ctrlKey、altKey和metaKey

    event对象的relatedTagrget属性提供了相关元素的信息,这个属性只对于mouseover和mouseout事件才包含值,对于其他事件,这个属性的值是null。

    event对象的button属性表示按下或释放的按钮。

    event对象的detail属性给出了事件的更多信息。

    鼠标滚轮(mousewheel)事件包含一个wheelDelat属性。将mousewheel事件处理程序指定给页面中的任何元素或document对象,即可处理鼠标滚轮的交互操作。

    触摸设备、无障碍性问题

    键盘和文本事件

    3个键盘事件:keydown(任意键)、keypress(字符键)和keyup。只有一个文本事件textInput,是对keypress的补充。

    发生keydown或keyup事件时,event对象的keyCode属性中包含一个代码,与键盘上一个特定的键对应。发生keypress事件时,event对象包含charCode属性。

    用户在可编辑区域中 输入字符时,会触发textInput事件,它的event对象中还包含一个data属性,这个属性的值就是用户输入的字符(而非字符编码),event的inputMethod属性表示把文本输入到文本框中的方式。

    复合事件

    复合事件是DOM3级事件中新添加的一类事件,用于处理IME的输入序列。有3种复合事件:compositionstart、compositionupdate和compositionend

    变动事件

    DOM2级的变动事件能够在DOM中的一部分发生变化时给出提示。

    DOMSubtreeModified、DOMNodeInserted、DOMNodeRemove、DOMNodeInsertedIntoDocument、DOMNodeRemoveFromDocument、DOMAttrModified、DOMCharacterDataModified,删除节点和插入节点。

    HTML5事件

    通常使用contextmenu事件来显示自定义的上下文菜单,使用onclick事件处理程序来隐藏该菜单。

    beforeunload事件是为了让开发人员有可能在页面卸载钱阻止这一操作。

    与load事件不同,DOMContentLoaded支持在页面下载的早期添加事件处理程序,这也就意味着用户能够尽早地与页面经行交互。

    readystatechange事件的目的是 提供与文档或元素的加载状态有关的信息,<script>和<link>元素也会触发readystatechange事件,可以用来确定外部的JavaScript和CSS文件是否已经加载完成。

    pageshow事件在页面显示时触发,这个时间的目标是document,但必须将其事件处理程序添加到window,包含一个persisted的布尔值属性,页面保存在bfcache中,则这个属性的值为true。pagehide事件在浏览器卸载页面的时候触发。

    haschange事件会在URL参数列表发生变动时通知开发人员,必须添加给window对象,包含两个属性oldURL和newURL。

    设备事件

    设备事件可以让开发人员确定用户怎样使用设备。

    orientationchange事件,window.orientation属性。MozOrientation事件。deviceorientation事件。devicemotion事件

    触摸和手势事件

    触摸事件:touchstart、touchmove、touched和touchcancel。3个用于跟踪触摸的属性:touches、targetTouchs、changeTouches

    3个手势事件:gesturestart、gesturechange和gestureend

    13.5内存和性能

    事件委托

    对“事件处理程序过多”问题的解决方案就是时间委托。事件委托利用了时间冒泡,只指定一个事件处理程序,就可以管理某一类的所有事件。使用事件委托,只需在DOM树中尽量最高的层次上添加一个事件处理程序。

    移除时间处理程序

    13.6模拟事件

    DOM中的事件模拟

    在document对象上使用creatEvent()方法创建event对象,参数可以是:UIEvents、MouseEvents、MutationEvents和HTMLEvents。模拟事件的最后一步就是触发事件,使用dispatchEvent()方法。

    模拟鼠标事件,模拟键盘事件。模拟其他事件,自定义DOM事件

    IE中的事件模拟

  • 相关阅读:
    Geoserver发布缓存切片(制定Gridsets)
    Oralce Spatial
    判断ArcSDE是否安装成功
    sqlserver操作geography方法
    ArcGIS Server 基于Token安全验证
    ArcGIS Server配置端口
    贝叶斯推断
    加密算法
    互联网协议认识
    yocto config mk.fs.ext4
  • 原文地址:https://www.cnblogs.com/dingzibetter/p/6405275.html
Copyright © 2011-2022 走看看