2011-01-14 102 views
0

我遇到了一些使用getElementById的JavaScript问题。它可以在FF,Safari和Chrome中正常工作,但IE(8 - 没有尝试过其他)可以保留。Internet Explorer在getElementById上抛出错误

HTML的相关位是一个div叫topnav:

<div id="topnav"> 
    ... some HTML ... 
    <div> 
    <div id="sub_1" class="lowernav"> 
    ... some HTML ... 
    </div> 
    <div id="sub_2" class="lowernav"> 
    ... some HTML ... 
    </div> 

在我的JavaScript,我想找到topnav。完整的代码(最多的地方捞出)是这样的:

<script> 

window.onload = init(); 

function init() { 
    // Show current menu 
    showCurrentMenu(); 
} 

function showCurrentMenu() { 
    hideMenus(); // Hide all menus and then show the current one 
    topnav = document.getElementById('topnav'); 
    ... rest of code ... 
} 

function hideMenus() { 
    var divlist = document.getElementsByTagName('div'); 
    for(var ii=0; ii<divlist.length; ii++) { 
    if(divlist[ii].className != divlist[ii].className.replace('lowernav','')) { 
    divlist[ii].className += ' hidden'; 
    } 
    } 
} 

...然后一些其他的代码还没有达到...

难道我做错了什么吗?这可能是一件非常明显的事情,但对我而言,我看不到它!所有的建议非常感谢。

ETA:好吧,这里是整个代码,因为它目前为:

<script> 
window.onload = init; 

function init() { 
    // Show current menu 
    showCurrentMenu; 
    // Attach 'onmouseover' event to main menu items 
    topnav = document.getElementById('topnav'); 
    // Get all items in list 
    var menulist = topnav.getElementsByTagName('a'); 
    for(var ii=0; ii<menulist.length; ii++) { 
    menulist[ii].onmouseover = showMenu; 
    } 

    document.getElementById('mainHomeNav').onmouseout = restoreMenu; 
} 

function restoreMenu(e) { 
    var targ; 
    if (!e) var e = window.event; 
    if (e.target) targ = e.target; 
    else if (e.srcElement) targ = e.srcElement; 
    if (targ.nodeType == 3) // defeat Safari bug 
     targ = targ.parentNode; 
    if (targ.id == "mainHomeNav") { 
    showCurrentMenu; 
    } 
} 

function hideMenus() { 
    var divlist = document.getElementsByTagName('div'); 
    for(var ii=0; ii<divlist.length; ii++) { 
    if(divlist[ii].className != divlist[ii].className.replace('lowernav','')) { 
    divlist[ii].className += ' hidden'; 
    } 
    } 
} 

function showCurrentMenu() { 
    hideMenus; 
    topnav = document.getElementById('topnav'); 
    // Get all items in list 
    var menulist = topnav.getElementsByTagName('a'); 
    for(var ii=0; ii<menulist.length; ii++) { 
    if(menulist[ii].className != menulist[ii].className.replace('thisSection','')) { 
    var thisid = menulist[ii].id; 
    var thissubmenu = document.getElementById(thisid + '_sub'); 
    thissubmenu.className = thissubmenu.className.replace(/hidden/g,''); 
    } 
    } 
} 

function showMenu() { 
    hideMenus; 
    // show this menu 
    var submenu_id = this.id + '_sub'; 
    var submenu = document.getElementById(submenu_id); 
    submenu.className = submenu.className.replace(/hidden/g,''); 
} 
</script> 

回答

4

问题是

window.onload = init(); 

这将立即调用init函数,然后用它的返回值该页面的onload函数。您需要:

window.onload = init; 

只有在页面完全加载后才会调用init函数。

+0

+1为正确的答案。在尝试调试时容易犯错误,容易错过。 – Spudley 2011-01-14 15:47:10

0

你的问题出在下面一行:

window.onload = init(); // this will CALL init() and assign the return value 

由于init不返回任何东西,window.onloadundefined

现在,它不在IE中工作,但在其他浏览器中的原因是那些其他浏览器可能已经解析了DOM的一部分,因此调用showCurrentMenu的作品。

但是,你同样可以打破的,因为从技术角度来看,不能保证该文件被加载,要解决,你有实际功能的引用赋予window.onload做:

window.onload = init; 
+0

谢谢你,但我改变了它,它仍然给错误。 – Sharon 2011-01-14 15:40:04

+0

@Sharon那么你必须向我们展示更多的代码,因为现在,我不能做出任何其他错误。 – 2011-01-14 15:41:07

2

我发现了这个问题 - 我在'topmenu'前没有'var'。

所以不是

topnav = document.getElementById('topnav'); 

它应该是

var topnav = document.getElementById('topnav'); 

感谢大家的帮助。