事件句柄的登陆方法 |
事件句柄 的登陆方法 | HTML元素的事件句柄属性 | 传送门 例: 《a href="" target="_blank" rel="external nofollow" οnclick="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 | 鼠标按下的键 整数 | 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 | |
做一个画图软件 |