创建: 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. OTSU大津法对图像二值化

    OTSU算法 (1)原理: 对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于背景的像素个数占整幅图像的比例记为ω0,其平均灰度μ0:前景像素个数占整幅图像的比例为ω1,其平均灰度为μ1 ...

  2. Linux下c++11多线程聊天室

    刚看的c++11多线程,写个聊天室试试编译的时候加上 c++11 和 多线程库g++ -Wall -std=c++0x -pthread -o server server.cppserver 和cli ...

  3. 从request中读数据流

    ServletInputStream servletInputStream = reqeust.getInputStream(); int len=0; int size=reqeust.getCon ...

  4. spring 4 + jpa(hibernate 3/4) + spring mvc 多数据源配置

    先从persistence.xml开始: <?xml version=”1.0″ encoding=”UTF-8″?><persistence version=”2.1″ xmlns ...

  5. 山东省第七届ACM省赛

    ID Title Hint A Julyed 无 B Fibonacci 打表 C Proxy 最短路径 D Swiss-system tournament 归并排序 E The Binding of ...

  6. PHP获取指定日期是星期几的实现方法

    这篇文章主要介绍了PHP获取指定日期是星期几的实现方法,涉及php针对日期的读取.判断与字符串.数组相关运算操作技巧,需要的朋友可以参考下 本文实例讲述了PHP获取指定日期是星期几的实现方法.分享给大 ...

  7. leetcode 2 Add Two Numbers(链表)

    数字反过来这个没有什么麻烦,就是镜像的去算十进制加法就可以了,然后就是简单的链表. /** * Definition for singly-linked list. * struct ListNode ...

  8. FEC之我见二

    前面简单说了一下FEC,以及它的配合使用的方法.下面我想详细说一下FEC算法: 曾经有位大神在帖子里这么写着:采用改进型的vandermonde矩阵RS算法.其优点算法运算复杂度更低且解决了利用矩阵构 ...

  9. HDU1370Biorhythms(中国剩余定理||暴力)

    Some people believe that there are three cycles in a person's life that start the day he or she is b ...

  10. Link-cut-tree 学习记录 & hdu4010

    网上的lct一抓一大把,所以我也不再写什么讲解了,只写一写自己的看法. Link-cut-tree 是用于维护动态树的一种数据结构 所谓动态树就是一片存在边的添加与删除的森林中的一棵树 所以我们要快速 ...