Javascript事件,又称DOM事件,指用户对DOM节点进行各种操作时,能触发相应的处理函数。这些操作包括获取焦点、点击、键盘输入、鼠标悬浮、窗口变化等等。
一个JavaScript事件,包括事件绑定、事件触发、事件冒泡、事件捕获、事件处理。下面将详细描述。
var addEvent = function(type, callback) { if (window.attachEvent) { // IE this.attachEvent.call(this, "on" + type, callback); } else if (window.addEventListener) { this.addEventListener.call(this, type, callback, false); } else { alert("无法绑定事件,请将浏览器版本发至评论"); } return this;}注意addEventListener的第三个参数是设置事件是在事件捕获阶段进行还是在事件冒泡阶段进行,true表示在事件捕获阶段进行。事件捕获跟事件冒泡将在下文详细解说。
<div id="first"> <span id="second"> <b id="third">111</b> </span></div>我们先给它们绑定函数
addEvent.call(document.getElementById("first"), "click", function(event) { console.log("first");});addEvent.call(document.getElementById("second"), "click", function(event) { console.log("second");});addEvent.call(document.getElementById("third"), "click", function(event) { console.log("third");});在谷歌中运行,我们可以看到,浏览器将依次输出third,second, first。这就是事件冒泡。即使我们将上述addEvent里的addEventListener第三个参数去掉,结果仍然不变。说明谷歌默认采用事件冒泡机制。实际上绝大多数浏览器默认采用事件冒泡机制(本人只测试了Chrome,FF,IE,不过Opera一般也会随大流),而IE只支持事件冒泡,IE的绑定事件 函数attachEvent甚至没有设置是否使用事件捕获的参数。而如果我们将addEventListener第三个参数设为true,结果将刚好相反,输出first,second,third。这就是事件捕获。当然,IE不支持。事件的冒泡有时不是我们需要的,也就是说,我们只需要子节点的事件,而不希望事件冒泡到父节点。我们可以取消冒泡。
event.cancelBubble = true;// IE
event.stopPRopagation();// 非IE其中,event为事件回调函数的参数,后文会详细说明。
<div id="first"> <span id="second"> <b class="third">111</b> <b class="third">222</b> </span></div>
function delegate(node, childNodeClass, eventType, func) { addEvent.call(node, eventType, function(event) { var classes = event.target.className.split(" "); if(classes.indexOf(childNodeClass) > -1) { func(event); } })}调用时,
var node = document.getElementById("first");delegate(node, "third", "click", function(event) { console.log(event.target);})在这里,我们是用的类名来判断,因为实际中用类名的比较频繁。当然,你也可以扩展此函数。事件委托有很多好处,当然,这些好处在当需要给很多同类节点添加事件,比如菜单栏的悬浮事件时,会更明显:
node.onclick = function(event) {}在事件处理函数中,event为其唯一的参数,包含了事件所有的信息和方法。这里我们挑几个常见的说一下:
新闻热点
疑难解答