2019-09-28

学习JavaScript13章

java与HTML的交互是通过事件实现的

1事件流

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

1.1事件冒泡

事件开始由最内部的元素接收
例:

<BODY onclick="alert('aaa');">
<div onclick="alert('bbb');">
 <a href="#" class="cooltip" title="这是我的超链接提示1。" onclick="alert('ddd');">提示</a>
</div>
</BODY>

若<div>元素被点击,则事件顺序传播为a --> div --> body

1.2事件捕获

是指事件开始由最外部的元素接收,然后由最内部的元素接收
例:

<BODY onclick="alert('aaa');">
<div onclick="alert('bbb');">
 <a href="#" class="cooltip" title="这是我的超链接提示1。" onclick="alert('ddd');">提示</a>
</div>
</BODY>

若<div>元素被点击,则事件顺序传播为body--> div --> a

1.3DOM事件流

DOM事件流包括三个阶段。

事件捕获阶段

处于目标阶段

事件冒泡阶段

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Event Bubbling</title>
</head>
<body>
  <button id="clickMe">Click Me</button>
</body>
</html>

若<div>元素被点击,则事件顺序传播为html-->body-->button
-->body-->html

2事件处理系统

2.1HTML事件处理系统

某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的 HTML 特性来指定。这个 特性的值应该是能 够执行的 JavaScript代码。
例:

<input type="button" value="Click Me" onclick="alert(this.value)"> 

2.2 DOM0级事件处理程序

每个元素(包括 window 和 document)都有自己的事件处理程序属性,这些属性通常全部小写, 例如 onclick。将 这种属性的值设置为一个函数,就可以指定事件处理程序

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

2.3 DOM2级事件处理程序

DOM2级事件”定义了两个方法,用于处理指定和删除事件处理程序的操作:
addEventListener()和 removeEventListener()
处理指定事件:

btn.addEventListener("click",function(){ },false); 

三个参数:事件名,函数,布尔值,若为false即表示在冒泡阶段处理,true在捕获阶段 移除上述添加的事件:

btn.removeEventListener() 

三个参数必须与add的完全一致才能移除,若在add中定义匿名函数则永远不能被移除

2.4 IE事件处理程序

IE实现了与 DOM中类似的两个方法:
attachEvent()和 detachEvent()。
这两个方法接受相同 的两个参数:事件处理 程序名称与事件处理程序函数。

2.5 跨浏览器的事件处理程序

第一个要创建的方法是** addHandler()**,它的职责是视情况分别使用 DOM0 级方法、DOM2 级方 法或 IE方法来添加 事件。这个方法属于一个名叫 EventUtil 的对象,本书将使用这个对象来处理浏览 器间的差异。addHandler()方法接 受 3个参数:要操作的元素、事件名称和事件处理程序函数。
与 addHandler()对应的方法是
removeHandler()
,它也接受相同的参数。这个方法的职责是移 除之前添加的事件处 理程序。

3 事件对象

3.1 DOM中的事件对象

兼容 DOM的浏览器会将一个 event 对象传入到事件处理程序中。无论指定事件处理程序时使用什 么方法(DOM0级 或 DOM2级),都会传入 event 对象 。
在事件处理程序内部,对象 this 始终等于 currentTarget 的值,而 target 则只包含事件的实 际目标。如果直接将事 件处理程序指定给了目标元素,则 this、currentTarget 和 target 包含相同 的值。
在需要通过一个函数处理多个事件时,可以使用 type 属性 要阻止特定事件的默认行为,可以使用 preventDefault()方法

3.2 IE中的事件对象

与访问 DOM中的 event 对象不同,要访问 IE中的 event 对象有几种不同的方式,取决于指定事 件处理程序的方 法。在使用 DOM0级方法添加事件处理程序时,event 对象作为 window 对象的一个属性存在。
IE的 event 对象同样也包含与创建它的事件相关的属性和方法。其中很多属性和方法都有对应的 或者相关的 DOM属 性和方法。与 DOM的 event 对象一样,这些属性和方法也会因为事件类型的不同 而不同,但所有事件对象都会包含 下表所列的属性和方法。

3.3 跨浏览器的事件对象

而在 IE中,event 参数是未定义 的(undefined), 因此就会返回 window.event。将这一行代码添加到事件处理程序的开头,就可以确 保随时都能使用 event 对象,而 不必担心用户使用的是什么浏览器。

第二个方法是 getTarget(),它返回事件的目标。在这个方法内部,会检测 event 对象的 target 属性,如果存在则返 回该属性的值;否则,返回 srcElement 属性的值
第三个方法是 preventDefault(),用于取消事件的默认行为。在传入 event 对象后,这个方法 会检查是否存在 preventDefault()方法,如果存在则调用该方法。如果 preventDefault()方法不 存在,则将 returnValue 设置为 false。
第四个方法是 stopPropagation(),其实现方式类似。首先尝试使用 DOM方法阻止事件流,否 则就使用 cancelBubble 属性。

4 事件类型

Web 浏览器中可能发生的事件有很多类型。如前所述,不同的事件类型具有不同的信息,而“DOM3 级事件”规定了 以下几类事件。
UI(User Interface,用户界面)事件:当用户与页面上的元素交互时触发;
焦点事件
当元素获得或失去焦点时触发;
鼠标事件
当用户通过鼠标在页面上执行操作时触发;
滚轮事件
当使用鼠标滚轮(或类似设备)时触发;
文本事件
当在文档中输入文本时触发;
键盘事件
当用户通过键盘在页面上执行操作时触发;
合成事件
当为 IME(Input Method Editor,输入法编辑器)输入字符时触发;
变动(mutation)事件
当底层 DOM结构发生变化时触发。 变动名称事件,当元素或属性名变动时触发。此类事件已经被废弃,没有任何浏览器实现它们, 因此本章不做 介绍。

5. 内存和性能

5.1 事件委托

即把事件直接弄到一个比较高的节点上,统一管理某一类型的所有事件,而不是每个小事件都添加 事件处理程序,用target=EventUtil.getTarget(event)获取事件目标,然后用target.id获取具体的哪 一个节点执行什么事件

5.2 移除事件处理程序

在onunload事件处理程序中移除所有已添加的事件处理程序,设置其为null即可,如 btn.onclick=null

6. 模拟事件

6.1 DOM事件模拟

在document对象用creatEvent方法创建event对象,接受一个参数,表示是什么类型的事件,有以 下几个可接受参数:
UIEvents:UI事件
MouseEvents:鼠标事件
MutationEvents:DOM变动事件 HTMLEvents:HTML事件

1. 模拟鼠标事件 创建鼠标事件须指定必要信息 返回的对象有initMouseEvent()方法,接受15个参数: >type:事件类型

bubbles:事件是否冒泡
cancelable:是否可以取消
view:与事件关联的视图
detail:0
screenX:相对于屏幕X坐标 Y:Y坐标
clientX:相对于视口X Y
ctrlKey:是否按下Ctrl,默认false altKey:false shift:false metaKey:是否按下Meta,默认false >button:表示按下哪一个鼠标键,默认为0 >relatedTarget:表示与事件相关对象 用这个初始化后的对象传给dispatchEvent方法,就会自动触发 ####2. 模拟键盘事件 createEvent(“KeyboardEvent”)创建键盘事件,返回对象包含initKeyEvent()方法,接受10个参

type:事件类型
bubbles:是否冒泡
cancelable:是否可以取消
view:与事件关联视图
ctrlKey:是否按下ctrl
altKey:按下alt
shiftKey:按下shift
metaKey:按下meta
keyCode:键码
charCode:ascii编码 将初始化后对象传入dispatchEvent即可

3. 模拟其他事件

也是用creatEvent方法,传入事件类型名即可

4. 自定义DOM事件

类型名为CustomEvent,返回对象有initCustomEvent方法,四个参数

type:事件类型
bubbles:同上
cancelable:同上
detail:任意值,保存在event对象的detail属性中

6.2 IE的模拟事件

调用document.creatEventObject()方法创建event对象,不接受参数,要手动添加必要信息,最后 调用fireEvent方法,会自动为event对象添加srcElement和type属性

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,467评论 1 11
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,092评论 0 21
  • JavaScript 程序采用了异步事件驱动编程模型。在这种程序设计风格下,当文档、浏览器、元素或与之相关的对象发...
    劼哥stone阅读 1,249评论 3 11
  • JavaScript 与 HTML 之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬...
    LemonnYan阅读 671评论 0 4
  • 事件流 JavaScript与HTML之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互...
    DHFE阅读 818评论 0 3