做的是一个弹出菜单,点击某一个li标签改变box的display,如果我给定一个序号这段JS就能正常执行,使用索引就会出问题,看了半天也没看出自己哪里写错了,跪求高人指点迷津!ps:话说这种写法貌似比较常用的是创建选项卡……
<script type="text/javascript">
window.onload=function ()
{
var oNav=document.getElementById('nav');
var aLi=oNav.getElementsByTagName('ul')[0].getElementsByTagName('li');
var aBox=getByClass(oNav,'box');
var i=0;

for (i=0; i<aLi.length; i++)
{
aLi[i].index=i
aLi[i].onclick=function ()
{
for (i=0; i<aLi.length; i++)
{
aBox[i].style.display='none'
}
aBox[this.index].style.display='block'
};
};
};
function getByClass(o,n)
{
var arr=[];
var s=o.getElementsByTagName('*');

for (var i=0; i<s.length; i++)
{
if (s[i].className==n)
{
arr.push(s[i]);
};
};
return arr;
};
</script>

解决方案 »

  1.   

    你的onclick函数应该使用闭包:
    aLi[i].onclick=function ()
            {
                for (i=0; i<aLi.length; i++)
                {
                    aBox[i].style.display='none'
                }
                aBox[this.index].style.display='block'
            };
    改为:
        aLi[i].onclick=(function (e){
            return function(){
                for (var i=0; i<aLi.length; i++){
                    aBox[i].style.display='none'
                }
                aBox[e].style.display='block';
            }
        })(i);
      

  2.   

    这是我之前写的一个选项卡,写法是一样的啊,咋这个就能执行呢?
    // JavaScript Document
    window.onload=function ()
    {
    var oTab=document.getElementById('tab');
    var aLi=getByClass(oTab, 'menu')[0].getElementsByTagName('li');
    var aA=oTab.getElementsByTagName('ul')[0].getElementsByTagName('a')//获取a元素
    var aBox=getByClass(oTab, 'box');
    var i=0;

    aBox[0].style.display='block'

    for (i=0; i<aLi.length; i++)
    {
    aLi[i].index=i
    aLi[i].onclick=function ()
    {
    for (i=0; i<aLi.length; i++)
    {
    aLi[i].className=''
    aBox[i].style.display='none'
    };
    this.className='active'
    aBox[this.index].style.display='block'
    };
    aA[i].onfocus=function()//取消a标签链接获得焦点时的虚线框
    {
    this.blur();
    };
    };
    };
    function getByClass(o,n)
    {
    var arr=[];
    var aAll=o.getElementsByTagName('*');//在参数o下获取所有标签元素
    for (var i=0; i<aAll.length; i++)
    {
    if (aAll[i].className==n)
    {
    arr.push(aAll[i]);
    };
    };
    return arr
    };
      

  3.   

    你在 循环体力  alert 看看 变量 i到底是什么就可以了。参考闭包的概念:http://blog.csdn.net/xiaofan_sap/article/details/4676378
      

  4.   

    aLi[i].index=i
    aBox[this.index].style.display='block'索引有问题,index检索不对
      

  5.   

    要用闭包 像楼主这样的话i的值一直就是aLi.length