何为事件冒泡
在一个对象(节点)上触发某类事件(例如onclick点击事件),该对象定义了某类事件的处理函数,则当事件触发时会调用该处理函数。如果没有定义该事件处理函数或者是该事件函数返回true,那么该事件触发会向该对象的父级对象传播,层级顺序从内(该对象)到外(父级),直到所有父级对象的同类事件都被激活、或者到达了对象层级的最高级。
查看被触发事件的目标节点
在触发事件的处理函数时,可以传入一个事件参数(形参ev),该ev包含了事件触发的参数,比如:click事件有ev.pageX ev.pageY;keydown事件有ev.keyCode等等,在ie中,ev是全局的,通过window.event来获取,其他浏览器都是作为函数的参数传入的。
function seebin(ev){ if(!ev){ev = window.event;} // 或者 var ev = ev || window.event; }
当然还可以查看触发事件的目标节点,是在哪个节点上触发的事件,如下:
function seebin(ev){ var ev = ev || window.event; console.log(ev.target); }
解决事件冒泡
有两种方法:
1、通过stopPropagation()方法
function (ev){ var event = ev || window.event; if (){ event.cancelBubble=true; // ie浏览器的内核使用该方法 }else{ event.stopPropagation(); // 在基于firefox内核的浏览器中支持做法stopPropagation } }
2、通过返回值为false:
function (ev){ return false; }
注意:
event.stopPropagation() 的事件处理过程中:阻止了事件冒泡,但不会阻击元素的默认行为
return false 的事件处理过程中:阻止了事件冒泡,也阻止了元素的默认行为
当然,还有一种事件方法只阻止默认行为,如下:
event.preventDefault() 的事件处理过程中:不阻击事件冒泡,但阻击元素的默认行为
小知识:何为元素的默认行为。比如:a 标签的点击跳转,input 提交表单的提交。
label 的绑定事件冒泡现象
label 标签还有点特殊,就是 label 可以和一个标签绑定来触发同一个事件,一般是和 ingput 标签配合。这会使label的事件冒泡到绑定的元素上面在执行一次相同的事件,这就导致了有时候点击 label 标签时,执行了两次相同的事件函数,却找不到原因。这里在说下 label 的绑定分两种:显式绑定、隐式绑定。 下面的代码点击文字时都会弹出两次一样的弹出框。
-
显式绑定
<div id="div2" onclick="alert('显式绑定')"> <input type="radio" name="" id="a" value="" /> <label for="a">显式绑定</label> </div>
2. 隐式绑定
<label onclick="alert('隐式绑定')"> <input type="checkbox" value="" id=""> <span>隐式绑定</span> </label>
冒泡排序
何为冒泡排序?
一说冒泡。可能还会有人听到一个词——冒泡排序。
就是 比较相邻的两个元素,如果前一个比后一个大,则交换位置
代码方法:
var arr = [66, 53, 11, 5, 4, 3, 2, 1]; (function () { for (var i = 0; i < arr.length - 1; i++) {//比较的次数是length-1 for (var j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { var tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } alert(arr); })();