创建: 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. C#统计目录中文件MD5值

    1. [代码]统计目录中文件MD5值 using System.IO;using System.Security.Cryptography;using System.Collections;using ...

  2. 一款实现滑动切换效果的插件---swiper

    Swiper是纯javascript打造的滑动特效插件,面向手机.平板电脑等移动终端. Swiper能实现触屏焦点图.触屏Tab切换.触屏多图切换等常用效果. Swiper开源.免费.稳定.使用简单. ...

  3. 仿联想商城laravel实战---5、无刷新的增删改查(动态页面更新的三种方式(html))

    仿联想商城laravel实战---5.无刷新的增删改查(动态页面更新的三种方式(html)) 一.总结 一句话总结: 直接js增加删除修改html 控制器直接返回处理好的页面 用双向绑定插件比如vue ...

  4. MVC中ajax调用Controller的方法

    1. ajax代码: $.ajax({ async: false, cache: false, type: 'POST', contentType: "application/json&qu ...

  5. guava_学习_00_资源帖

    一.精选 1.Google Guava 官方教程 二.参考资源 1.Google Guava官方教程(中文版) 2.使用Guava编写优雅代码 3.Google guava工具类的介绍和使用

  6. 【转】C++11 标准新特性:Defaulted 和 Deleted 函数

    原文链接http://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/ 本文将介绍 C++11 标准的两个新特性:defaul ...

  7. Linux上用nginx搭建RTMP服务器

    参考文章:https://obsproject.com/forum/resources/how-to-set-up-your-own-private-rtmp-server-using-nginx.5 ...

  8. 2017-2018-1 20179215《Linux内核原理与分析》第八周作业

    实验:ELF文件格式与程序的编译链接 一.可执行文件的创建  从源代码到可执行程序所要经历的过程概述:  源代码(.c .cpp .h)经过c预处理器(cpp)后生成.i文件,编译器(cc1.cc1p ...

  9. Mathf.Sin正弦

    输入参数是弧度 Mathf.Sin   public static float Sin(float f); Parameters Description Returns the sine of ang ...

  10. 用VBA计算两个日期之间的工作日(去掉周末两天)

    最近公司HR和Finance想算员工的工作天数,想让我帮忙写些VBA,自己从网上找了下代码,自己再改改,以下来自网络. 计算两个日期之间的工作日,用VBA,因量大,最好用数组做 Sub kk() Di ...