javascript Dom 问题

来源:百度知道 编辑:UC知道 时间:2024/06/10 13:20:27
各位大侠帮我看看下面的代码:
var obj= document.getElementById("mainMenu").getElementsByTagName("li");
for( var i=0; i<obj.length;i++)
{
if(obj[i].childNodes.length>0)
{
obj[i].onmousemove=showmanu;
obj[i].onmouseout=hiddemanu;
}
}

function showmanu()
{

var ul= this.getElementsByTagName("ul")[0];
ul.style.display="block";
this.style.zIndex="100";
this.style.backgroundColor="#fff";

}
function hiddemanu()
{
var ul=this.getElementsByTagName("ul")[0];
ul.style.display="none";
this.style.zIndex="";

if(obj[i].childNodes.length>0)
这里应该是判断是否在li里有ul,因为之后把showmenu和hidemenu作为元素的事件侦听器
但是这样写了即使条件是true,也不能肯定li里一定有ul的,文本节点也是li的子节点
应该改成下面这样才能更好的判断。
if(obj[i].getElementsByTagName('url').length>0)
但是这个表达式依然不完美,因为getElementsByTagName查找的是后代元素,而不是子元素
最完美的方案:
先定义一个函数
function hasChild(elem,tagname){
for (var i=0,l=elem.childNodes.length;i<l;i++){
if (elem.childNodes[i].nodeName.toLowerCase()==tagname.toLowerCase()){
return true;
}
}
return false;
}
然后改条件
if(hasChild(obj[i],'ul'))
这个函数不仅能通过标签名检查是否含有元素,也能用"#comment"检查是否含有注释,"#text"检查是否含有文本

你是在关键字 this上使用出错了的,
当你在第一个循环中取得各个 li 对象,并且给它们加上两个事件showmanu,hiddemanu;
注意了:此时这两个事件中的this表示的 li 对象,所以你用this.getElementsByTagName("ul")[0]是永远取不到 ul 对象的。
这样取ul对象:document.getElementsByTagName("ul")[0];
----------------------------------------------------------
呵呵 那这样更简单了的,你只需要在判断