事件委托
譬如有一组li在ul中.
给每一个li加事件可以加在ul上.
<ul id="ul1">
<li>111</li>
<li>222</li>
<li>333</li>
<li>444</li>
</ul>
<script type="text/javascript">
window.onload =function(){
var oUl = document.getElementById('ul1');
var aLi = oUl.getElementsByTagName('li');
// for(var i=0;i<aLi.length;i++){
// aLi[i].onmouseover = function(){
// this.style.background = 'red';
// }
// aLi[i].onmouseout = function(){
// this.style.background = '';
// }
// }
oUl.onmouseover = function(ev){
var ev = ev||window.event;
var target = ev.target||ev.srcElement;
target.style.background = 'red';
}
oUl.onmouseout = function(ev){
var ev = ev||window.event;
var target = ev.target||ev.srcElement;
target.style.background = '';
}
}
通过window下的event.target对象就可以找到移入的li.
ie下是event.srcElement.
但是有一个bug,就是鼠标移到标签左边时会选中整个ul.
nodeName:找到当前元素的标签名.
利用ev.target.nodeName可以区分LI和UL,注意是大写的.
所以可通过 .toLowerCase()转换成小写的.
于是事件监听的代码块就变成:
oUl.onmouseover = function(ev){ var ev = ev||window.event; var target = ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background = 'red'; } } oUl.onmouseout = function(ev){ var ev = ev||window.event; var target = ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background = ''; } }
好处:
1.可以提高性能;
2.新添加的元素也会带该事件.
window.onload =function(){ var oUl = document.getElementById('ul1'); var aLi = oUl.getElementsByTagName('li'); var oInput = document.getElementsByTagName('input')[0]; // for(var i=0;i<aLi.length;i++){ // aLi[i].onmouseover = function(){ // this.style.background = 'red'; // } // aLi[i].onmouseout = function(){ // this.style.background = ''; // } // } var iNow = 4; oUl.onmouseover = function(ev){ var ev = ev||window.event; var target = ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background = 'red'; } } oUl.onmouseout = function(ev){ var ev = ev||window.event; var target = ev.target||ev.srcElement; if(target.nodeName.toLowerCase()=='li'){ target.style.background = ''; } } oInput.onclick =function(){ iNow++; var oLi = document.createElement('li'); oLi.innerHTML = 1111*iNow; oUl.appendChild(oLi); } }
浙公网安备 33010602011771号