你们好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新......
+------------------------------------------------------------
github:https://github.com/Daotin/Web
微信公众号:Web前端之巅
博客园:http://www.cnblogs.com/lvonve/
CSDN:https://blog.csdn.net/lvonve/
+-----------------------------------------------------------
在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。如今就让咱们一块儿进入 Web 前端学习的冒险之旅吧!javascript
事件冒泡:当有多个元素嵌套,而且这些元素绑定了相同的事件,这时候若是里面的元素事件触发了,那么外面的事件会自动触发。html
示例:前端
<body> <div id="dv1"> <div id="dv2"> <div id="dv3"></div> </div> </div> <script src="common.js"></script> <script> my$("dv1").onclick = function() { console.log(this.id); } my$("dv2").onclick = function() { console.log(this.id); } my$("dv3").onclick = function() { console.log(this.id); } </script> </body>
window.event.cancelBubble = true;
java
注意: Chrome,IE8 支持,firefox 不支持git
在事件处理函数中传一个参数 e,而后调用 e.stopPropagation();
github
注意:Chrome,firefox 支持, IE8 不支持。数组
window.event 和 e 都是事件处理参数对象,一个是 IE 标准,一个是 firefox 标准。服务器
<body> <div id="dv1"> <div id="dv2"> <div id="dv3"></div> </div> </div> <script src="common.js"></script> <script> my$("dv1").onclick = function() { console.log(this.id); } my$("dv2").onclick = function() { console.log(this.id); window.event.cancelBubble = true; } my$("dv3").onclick = function(e) { console.log(this.id); e.stopPropagation(); } </script> </body>
这时候能够写兼容代码的,因为用到 window ,可是没学到 BOM,因此先不写。微信
经过事件处理参数对象 e.eventPhase
属性能够查看当前事件所处的阶段。app
若为1:捕获阶段
若为2:目标阶段
若为3:冒泡阶段
addEventListener 绑定事件处理方法中第三个参数:控制事件的阶段
true: 控制事件为捕获阶段
false: 控制事件为冒泡阶段
通常默认使用冒泡阶段,不多使用捕获阶段。
<body> <div id="dv1"> <div id="dv2"> <div id="dv3"></div> </div> </div> <script src="common.js"></script> <script> my$("dv1").addEventListener("click", function(e) { console.log(this.id +" --- "+ e.eventPhase); }, false); my$("dv2").addEventListener("click", function(e) { console.log(this.id +" --- "+ e.eventPhase); }, false); my$("dv3").addEventListener("click", function(e) { console.log(this.id +" --- "+ e.eventPhase); }, false); // ------------------------------------------------------- // addEventListener 的第三个参数为 false // 点击最里面的 dv3 //dv3 --- 2 : 由于是冒泡阶段,从里向外,从 dv3开始,dv3是目标,因此为2 //dv2 --- 3:冒泡阶段,因此为3 //dv1 --- 3:冒泡阶段,因此为3 // 若是将 false 都改成 true 的话: // 点击最里面的 dv3 //dv1 --- 1:捕获阶段,从外向里,从dv1开始捕获,因此dv1为1 //dv2 --- 1:捕获阶段,从外向里 //dv3 --- 2:捕获阶段,从外向里,到达dv3目标,随意dv3为目标阶段。 </script> </body>
目的:为同一个元素绑定多个不一样的事件指向相同的事件处理函数。
<body> <input type="button" value="按钮" id="btn" > <script src="common.js"></script> <script> my$("btn").onclick = func; my$("btn").onmouseover = func; my$("btn").onmouseout = func; function func(e) { switch(e.type) { case "click" : console.log("onclick"); break; case "mouseover" : console.log("onmouseover"); break; case "mouseout" : console.log("onmouseout"); break; default: break; } } </script> </body>
使用事件处理参数对象的 type 属性能够判断事件触发时候,事件的类型,从而作出相应的事件处理。
目标:在搜索框输入关键字,自动在搜索框下方显示相关内容。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> * { margin: 0; padding: 0; } #dv1 { width: 500px; margin-top: 100px; margin-left: 200px; font: 400 18px/30px "Microsoft Yahei"; color: #595959; } input { width: 500px; height: 30px; } .dvv { width: 500px; /*height: 10px;*/ border: 1px solid green; } .ps { padding: 2px 0 2px 5px; cursor: pointer; } </style> </head> <body> <div id="dv1"> <input type="text" placeholder="日向雏田" id="txt"> </div> <script src="common.js"></script> <script> var KeyWords = [ "旋涡鸣人", "旋涡辛久奈", "旋风小子", "旋风少女", "日向雏田", "日向花火", "日向本家", "奈良鹿丸", "奈良大佐", "旗木卡卡西" ]; my$("txt").onkeyup = function () { while(my$("dv2")) { my$("dv1").removeChild(my$("dv2")); } // console.log(this.value); var findArr = []; // 每次输入文字的时候都先清除临时数组 for (var i = 0; i < KeyWords.length; i++) { if (KeyWords[i].indexOf(this.value) === 0) { // console.log("yes"); findArr.push(KeyWords[i]); } } // 文本框输入了内容,而且临时数组不为空 if ((findArr.length !== 0) && (this.value.length !== 0)) { var dvObj = document.createElement("div"); dvObj.className = "dvv"; dvObj.id = "dv2"; my$("dv1").appendChild(dvObj); for (var i = 0; i < findArr.length; i++) { var pObj = document.createElement("p"); pObj.className = "ps"; setInnerText(pObj, findArr[i]); my$("dv2").appendChild(pObj); pObj.onmouseover = f1; // 循环里面不要使用匿名函数 pObj.onmouseout = f2; } } }; function f1() { this.style.backgroundColor = "greenyellow"; } function f2() { this.style.backgroundColor = ""; } </script> </body> </html>
一、这里的候选数据原本应该来自服务器,这里用数组来模拟。
二、这里使用的是鼠标输入文字后的鼠标抬起事件:onkeyup。
三、 须要准备个临时数组存储于文本框输入文字匹配的字符串。
四、当搜索框的文本为空或者临时数组的内容为空时,循环删除下拉列表。
五、之因此输入多个文字,可是只建立了一个下拉列表的缘由是由于在输入第二个文字的时候,先输入的实际上是字母,这个时候不匹配,而咱们在每次鼠标抬起的时候会清空临时数组,因此这个时候会先删除下拉列表,当咱们输入第二个文字的时候,再从新建立相匹配的下拉列表。
六、每次进入鼠标抬起按键时,若是有下拉列表就循环删除。
七、注意在循环里面不要使用匿名函数。