创建: 2017/10/15

完成: 2017/10/15
 
更新: 2017/11/04 加粗事件的参数
更新: 2017/12/12 增加事件处理时获取事件对象的方法
更新: 2019/05/20  补充Promise对象 异步处理, 删除相关TODO
 
【TODO】
补充15.5 改变事件监听器的this p422
补充 15.6 自己查, 补充完事件初始化函数的后续参数
补充15.9 做一个画图软件 p435
 
 事件句柄的登陆方法
 事件句柄
的登陆方法

 HTML元素的事件句柄属性  传送门
 例: 
 《a href="" onclick="sample();"》

问题:
 1. HTML被JavaScript污染
 2. 一个事件只能登陆一个函数,多个的话最后一个有效

 DOM的元素对象的事件属性  传送门
 var sample =
document.getElementByIdx_x_x_x_x_x_x_x_x_x_x_x_x("t");
 sample.onclick = sample();

问题
 1. 一个事件只能登陆一个函数,多个的话最后一个有效

 通过addEventListener()方法  元素对象.addEventListener(type, listener,
useCapture);

 参数 

 type  事件的种类
 字符串, 去掉前面的on
 listener  发生事件时的回调函数的参照
 useCapture  true ---> 捕获阶段
 false ---> 起泡阶段

默认值 false

 例1  var a =
document.getElementByIdx_x_x_x_x_x_x_x_x_x_x_x_x("a");
 a.addEventListener("click", function(e) {
   
e.currentTarget.style.backgroundColor = "red";
 }, false);
 例2  function test(e) {
   
  e.currentTarget.style.backgroundColor
= "red";
 }
 a.addEventListener("click", test);

登陆初始化事件

 图象等资源加载好以后初始化  window.addEventListener("load", function ()
{});
 文档加载好后就加载  document.addEventListener("DOMContentLoaded",

function () {});

   
   
   

指定函数时候不带参数的不要括号,可以带参数(要括号)

好处:
1.一个事件能登陆多个函数

   
 删除事件监听器  target.removeEventListener(type, listener,
useCapture);
1. 登陆时候如果是无名函数,不能删
2. 可以删除自己(整个事件?)
element.removeEventListener("click", arguments.callee, false);
 
   
 事件对象
 参数  事件回调的对象函数的参数,
名字任意。一般为e或event
 获取  可以直接在触发的处理里使用event
 或者加上参数e(jquery.event)
 $('sample').click(function(e) {
   event.stopPropagation();
   event.preventDefault();
   console.log(event);
   console.log(e);
 }
 事件种类

 onclick  鼠标点击
 ondblclick  鼠标双击 
 onmousedown  鼠标按下
 onmouseup  鼠标收起
 onmousemove  鼠标在要素上移动
 onmouseout  鼠标移出要素
 onmouseover  鼠标移入要素
 onkeydown  键盘按下 
 onkeyup  键盘收起
 onkeypress  键盘按下并收起
 onchange  input的内容改变
 onblur  input失去聚焦
 onfocus  input获得聚焦 
 onselect  文字输入框等文字被选中
 onsubmit  form的submit按钮被按下时
 onload  读取完成
 onunload  关闭浏览器,调向新页面等??
 onabort  页面或者图像的读取被中断(取消)
 onerror  页面或者图象读取出错
 onresize  元素的大小改变 
   
 事件对象共有的属性  p412

 type  事件名
 字符串
 "click", "mousedown"等
 target   发生事件的元素
 要素对象
 currentTarget  登陆正在执行的事件函数的元素
 要素对象 
 eventPhase  事件传播的相
 整数
 1: 捕捉阶段
 2: 配发阶段
 3: 发泡阶段
 timeStamp   事件发生的事件
 (1970/1/1 00:00:00开始的毫秒)
 bubbles  是不是发泡阶段
 true/false
 cancelable 
 defaultPrevented
 两个一样
 是否可以取消
 true/false
 取消用preventDefault();
 isTrusted   事件是否是有用户的行为引起的
 true/false
 取消用preventDefault();
   
   
 鼠标事件对象的共通属性  click, dbclick, mousedown, mouseup,
mousemove, mouseout, mouseover

 screenX
 screenY
 点击位置的屏幕左边
 整数 
 clientX
 clientY
 点击位置的视口坐标
 整数 
 pageX
 pageY
 点击位置的文档坐标
 整数 
 offsetX
 offsetY
 发生事件的要素内的相对坐标
 整数
 以该要素的左上为顶点
 altKey  是否按了Alt键
 true/false
 ctrlKey  是否按了ctrl键
 true/false
 shiftKey  是否按了shift键
 true/false
 detail  事件详细情况
 鼠标事件的话显示点击次数
 button  鼠标按下的键
 整数

 0  左击
 1  滚轮
 2  右击 
 relatedTarget  对象

 mouseover  鼠标的出发点的元素
 mouseout  鼠标的到达点的元素
   
   
   
 键盘事件的共通属性  keydown, keypress, keyup等

 altKey  是否按了Alt键
 true/false
 ctrlKey  是否按了ctrl键
 true/false
 shiftKey  是否按了shift键
 true/false
 metaKey  是否按了Meta键
 true/false
 Mac的command键, Windows的Windows键
 key  按下的键的值的DOMString
 字符串
 keyCode  按下的键的编码
 整数
 code  表示被按下的键在键盘上的物理位置
 字符串
   
   
   

注:

 keyCode
 按下的键的编码
 只对数值和字母正确
 不受Shift和Ctrl的影响
 获取大小写  keyCode+shiftKey
 key
 按下的键的值的DOMString
 全部正确
 code
 表示被按下的键在键盘上的物理位置
 不受Shift和Ctrl的影响
   
   
   
 事件的传播
 事件的相

 捕捉阶段  从Window Object出发一直到目标对象
 有登陆事件的就执行
 正常事件派发  执行登陆事件 
 发泡阶段  
 取消事件  阻止事件的传播

 函数  event.stopPropagation()
 意义  阻止事件的传播
 也就是阻止发泡阶段的发生
   
   
   

阻止事件的传播与其他同级事件

 函数  event.stopImmediatePropagation()
 意义  阻止事件传播,并且该句柄的其他事件不执行
   
   
   

阻止默认动作

 函数  event.preventDefault();
 意义  取消浏览器默认处理
 如点击链接跳过去等
 注意:  不一定可以取消
 event. cancelable
   
   
   
   
 事件监听器内的this
 事件监听器内的this  表示登陆该事件的元素对象
 改变this指定的对象  略 p422
 // TODO: 补充这里
   
   
 向事件监听器添加参数的方法
 用无名函数  在无名函数里面传递参数
 e.addEventListener("click", function(e) {
    test(e, 想要传递的参数);
 }
, false);

function test(e, 想要传递的参数) {...};

 用返回函数的函数 e.addEventListener("click", test(...), false);

function test(想要传递的参数) {
    return function(e) {
     
 ...
    };
 };

   
   
   
 自定义事件
 步骤

 创建事件对象  var event =
document_createEvent(type);

type: 事件种类

 "UIEvents"  UI事件
 初期化: event.initUIEvent
 "MouseEvents"  鼠标事件
 初期化: event.initMouseEvent
 "TextEvent"  文本事件
 初期化: event.initTextEvent
 "KeyboardEvent"  键盘事件
 初期化: event.initKeyEvent
 "MutationEvents"  变异事件?
 初期化: event.initMutationEvent
 "HTMLEvents"  HTML事件
 初期化: event.initEvent
 "CustomEvent"  自定义事件
 初期化: event.initCustomEvent
   
   
   
 初始化事件  event.initXXXXX(type, bubbles, cancelable,
...);

 参数含义

 type  事件种类
 "click"等
 bubbles  是否要发泡阶段
 cancelable  是否可以取消
 ...  不同初始化函数不一样
 // TODO: 自己查,补充这一块
   
   
   
   
   
   
 配发事件  target.dispatchEvent(event);
 target: 元素对象
 一旦配发, 该事件的事件监听器立即执行
   
   
 和默认事件的区别  event.isTrusted
 true: 用户产生
 false: 开发端产生
 自定义事件的用途  一旦派发,监听器立即执行。所以和直接执行监听器函数没区别。
 但是这样更加面向对象,不用在意接口
   
   
   
 间接的实现非同期处理(Promise)
 通常的回调

回调只是注册在运行堆, 实际运行时刻为可执行时间和实际设定开始时间中最先到来的

// 输出 A C B
console.log('A');
setTimeout(() => {
console.log('B');
}, 0);
console.log('C');

要想实现期待的顺序

setTimeout(()=>{
console.log('A');
setTimeout(()=>{
console.log('B');
setTimeout(()=>{
console.log('C');
}, 0);
},0);
}, 0);

 

 Promise
var promise = new Promise(function(resolve, reject) {...});

● 参数

想要执行的参数

 resolve

以成功状态中断promise

执行then, 可以带一个参数

 reject

以出错状态中断promise

执行catch, 可以带一个参数

● 运行

 then(onFullfilled)

resolve来呼出

const promise = new Promise((resolve, reject) => {
console.log("a");
resolve('b');
reject('c');
})
promise
.then((data) => {
console.log(data);
})
.catch((data)=>{
console.log(data);
}); 

● then究极体

then(onFullfilled, onRejected)

onRejected对应catch

 catch(onRejected)  
 串联事件  

并联事件

all

 
 race  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
做一个画图软件
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

【WIP】客户端JavaScript 事件处理的更多相关文章

  1. 【WIP】客户端JavaScript Web Object

    创建: 2017/10/11   更新: 2017/10/14 标题加上[WIP],增加[TODO] 更新: 2018/01/22 更改标题 [客户端JavaScript Web Object, UR ...

  2. 【JavaScript权威指南(第五版)】笔记之第二部分 客户端JavaScript 第13章~第23章

    第十三章 Web浏览器中的javascript ①   eg:下面两行代码实际上执行的是相同的功能 var answer = 42; window.answer = 42;   ③每个window对象 ...

  3. JavaScript 客户端JavaScript之事件(DOM API 提供模块之一)

    具有交互性的JavaScript程序使用的是事件驱动的程序设计模型.   目前使用的有3种完全不同的不兼容的事件处理模型. 1.原始事件模型 (一种简单的事件处理模式) 一般把它看作0级DOM API ...

  4. JavaScript 客户端JavaScript之 脚本化文档

    客户端JavaScript的存在把静态HTML转变为交互式的Web应用程序,脚本化Web页面的内容正是JavaScript存在的理由.   一个文档对象模型或者说DOM就是一个API,它定义了如何访问 ...

  5. 客户端JavaScript(window、document、element)

    一.window对象是所有客户端JavaScript特性和API的主要接入点,用window来引用它. 属性:location属性(引用Location对象,当前显示在窗口的URL).document ...

  6. JavaScript的进阶之路(七)客户端JavaScript知识点总结

    一.客户端JavaScript主要是BOM DOM的操作和js脚本的兼容性.互用性.可访问性.安全性的应用.以及一些框架的引用. 二.BOM:浏览器对象模型 主要介绍window对象 1.定时器:se ...

  7. 浅谈个人对客户端JavaScript同步、异步、执行顺序等概念的理解

    一.同步和异步的概念. 同步:即按代码的顺序执行任务. 在下列代码中,按照同步概念,则是先打印1后打印2. console.log(1); console.log(2); 异步:即执行一个任务的同时执 ...

  8. JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)

    XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应:但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话.   大多数浏览的客户端JavaScri ...

  9. JavaScript 客户端JavaScript之 Web浏览器的环境

    Web浏览器实现的Javascript,通过Web浏览器实现的JavaScript引入了大量可脚本化的对象(1.Web浏览器 2.HTML 3.HTML中的内容)  Web浏览器中的Javascrip ...

随机推荐

  1. Spring Boot- 用idea新建spring boot web项目

    1.新建project 2.选择Spring Initializr,next 3.输入项目信息,next 4.选择web依赖以及Spring Boot的版本,next 5.Finish 6.Enabl ...

  2. 分享知识-快乐自己:揭秘HDFS

    揭秘HDFS: 一):大数据(hadoop)初始化环境搭建 二):大数据(hadoop)环境搭建 三):运行wordcount案例 四):揭秘HDFS 五):揭秘MapReduce 六):揭秘HBas ...

  3. NserviceBus过期处理

    NserviceBus不过期,修改注册表 HKEY_CURRENT_USER\Software\NServiceBus\3.3下的项TrailDate到2099-08-02

  4. 关于自动化与vTable两种暴露接口的区别-1未完......

    COM组件有两种暴露组件接口的方式,一种是以虚拟列表的方式暴露:一种就是自动化方式. 虚拟列表(VTable): COM组件将自己所有的方法的地址以一个虚拟表的方式存放在一起,这个虚拟表是一种结构,有 ...

  5. 线段树Final版本

    结构体是个好东西... 看着逼格很高 #include<iostream> #include<cstdio> #include<cstdlib> #include& ...

  6. bzoj 3689: 异或之 Trie+堆

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3689 题解: 利用一个优先队列存储当前取到的数 然后再写一颗支持查找异或的k大值的Tri ...

  7. asp.net分页asp.net无刷新分页高效率分页

    项目中经常会用到分页的功能类似的项目做过无数个了,今个把自己常用的分页代码分享一下. 首先说说服务端处理的代码: 下面代码中重点是分页的sql语句的写法,其中的参数@n是当前的页码,总的来说本服务端主 ...

  8. Excel用vlookup方法匹配数据

    (1) VLOOKUP是一个查找函数,给定一个查找的目标,它就能从指定的查找区域中查找返回想要查找到的值.它的基本语法为:     VLOOKUP(查找目标,查找范围,返回值的列数,精确OR模糊查找) ...

  9. 修改sharepoint列表样式

    1.将sharepoint 的样式修改为阴影 2.用designer打开列表的AllItems.aspx文件,将下面的样式拷贝到里面     <style type="text/css ...

  10. ABCD四个人说真话的概率都是1/3。假如A声称B否认C说D是说谎了,那么D说过的那句话真话的概率是多少

    ABCD四个人说真话的概率都是1/3.假如A声称B否认C说D是说谎了,那么D说过的那句话 真话的概率是多少 记"A声称B否认C说D说谎"为X,那么由贝叶斯公式,所求的 P(D真)P ...