JS的Dom和事件处理机制(三)
来源:互联网 发布:祛痘产品淘宝 编辑:程序博客网 时间:2024/06/05 22:49
一、事件监听原理
var btn = document.getElementsByTagName("button")[0];// btn.addEventListener("click",fn1);// btn.addEventListener("click",fn2); fn("click",fn1,btn); function fn1(){ console.log("九尺龙泉万卷书,上天生我意何如。"); } //原理(了解)(自己封装一个)(click) function fn(str,fn,ele){ //判断位置要注意:如果进入绑定事件本身,那么该事件已经本绑定了 //所以获取旧的事件必须在新的事件绑定之前 var oldEvent = ele["on"+str]; ele["on"+str] = function () { //不能直接执行函数,因为我们还不知道以前有没有绑定我同样的事件 //进行判断,如果以前有过绑定事件,那么把以前的执行完毕在执行现在的事件,如果没有就直接执行 //如果没有被定义过事件该事件源的该事件属性应该是null对应的boolean值是false //如果已经定义过事件该事件源的该事件属性应该是function本身对应的boolean值是true if(oldEvent){ //因为oldEvent本身他就是函数本身,那么后面加一个();就是执行函数 oldEvent(); fn(); }else{ //没有绑定过事件 fn(); } } }
二、事件兼容
//火狐谷歌IE9+支持addEventListener// btn.addEventListener("click",fn1);// btn.addEventListener("click",fn2); //IE678支持attachEvent// btn.attachEvent("onclick",fn1);// btn.attachEvent("onclick",fn2); //兼容写法 EventListen = { addEvent: function (ele,fn,str) { //通过判断调用的方式兼容IE678 //判断浏览器是否支持该方法,如果支持那么调用,如果不支持换其他方法 if(ele.addEventListener){ //直接调用 ele.addEventListener(str,fn); }else if(ele.attachEvent){ ele.attachEvent("on"+str,fn); }else{ //在addEventListener和attachEvent都不存在的情况下,用此代码 ele["on"+str] = fn; } } } EventListen.addEvent(btn,fn1,"click") EventListen.addEvent(btn,fn2,"click")
三、冒泡和捕获
// 冒泡和捕获 box1.onclick = function () { alert("我是box1"); } box2.onclick = function () { alert("我是box2"); } box3.onclick = function () { alert("我是box3"); } document.onclick = function () { alert("我是document"); }点最里面的蓝色div,事件会一层层冒泡上去,3、2、1、document。
<div class="box1" id="box1"> <div class="box2"> <div class="box3"></div> </div></div>
box1.addEventListener("click", function () { alert("我是box1"); },true); box2.addEventListener("click", function () { alert("我是box2"); },true); box3.addEventListener("click", function () { alert("我是box3"); },true); document.addEventListener("click", function () { alert("我是document"); },true);true:document、box1、box2、box3,出现顺序
false:3、2、1、document
四、取消冒泡
box.onmouseover = function (event) { console.log("鼠标放到了box上"); //阻止冒泡 event = event || window.event; if(event && event.stopPropagation){ event.stopPropagation(); }else{ event.cancelBubble = true; } }
五、事件委托
<button>创建4个移民li</button><ul> <li>我是土著li</li> <a href="#">我是土著li</a> <li>我是土著li</li> <li>我是土著li</li> <a href="#">我是土著li</a> <li>我是土著li</li></ul><script> var liArr = document.getElementsByTagName("li"); var ul = document.getElementsByTagName("ul")[0]; var btn = document.getElementsByTagName("button")[0];// for(var i=0;i<liArr.length;i++){// liArr[i].onclick = function () {// alert("我是土著li");// }// } btn.onclick = function () { for(var i=1;i<=4;i++){ var newLi = document.createElement("li"); var newA = document.createElement("a"); newLi.innerHTML = "我是移民li"; newA.innerHTML = "我是移民a"; newA.href = "#"; ul.appendChild(newLi); ul.appendChild(newA); } } //普通的时间绑定,没有办法为新创建的元素绑定事件。所以我们要使用冒泡的特性,事件委托! //事件委托 ul.onclick = function (event) { //获取事件触动的时候传递过来的值 event = event || window.event; var aaa = event.target?event.target:event.srcElement; //判断标签名,如果是li标签弹窗 if(aaa.tagName === "LI"){ alert("我是li"); } }
阅读全文
0 0
- JS的Dom和事件处理机制(三)
- JS的Dom和事件处理机制( 一)
- JS的Dom和事件处理机制( 二)
- js--DOM(事件处理)
- JS DOM事件机制详解
- JS DOM事件处理程序
- DOM事件的处理
- DOM事件的处理
- js事件处理机制的理解
- js给dom元素绑定事件的三种方式
- js总结三(对象,事件,DOM,拖放)
- Cocos2d-JS事件处理机制
- JS中事件处理机制
- Cocos2d-JS 事件处理机制
- Cocos2d-js 事件处理机制
- JS:事件鼠标处理机制
- Android的事件处理机制和滑动
- Android的事件处理机制和滑动
- 排序 0
- Python爬虫Selenium使用
- C++递归求解N个元素的所有子集
- 15算法课程 53. Maximum Subarray
- position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
- JS的Dom和事件处理机制(三)
- 试题18:树的子结构
- 粒子滤波
- JZOJ5393【NOIP2017提高A组模拟10.5】Snake vs Block DP
- <C++>15.this指针
- HDU 3555(数位dp)
- 显式Intent
- java面向对象
- VMware安装CentOS 图文教程