自己写了个联动菜单,onload时运行没有问题,但改变选项时就报错了,而且只说1行1字符:对象不支持此属性或方法,找了一上午了,实在找不到错在哪了,求高手帮忙<html>
<head>
<title>测试</title>
<script type="text/javascript">
//*测试数据
var id_array,name_array,parent_array;
id_array = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14);
name_array = new Array("湖北","广东","黄冈","武汉","东莞","虎门","浠水","蕲春","武昌","汉阳","东一","东二","虎一","虎二");
parent_array = new Array(0,0,1,1,2,2,3,3,4,4,5,5,6,6);
function get_top_id(the_id){
var p_array = new Array();
var n = 0;
if(the_id == 0){
return p_array;
}
for(var i = 0; i < id_array.length; i++){
if(the_id == id_array[i]){
p_array[n] = parent_array[i];
if(parent_array[i] == 0){
return p_array;
}else{
n++;
get_top_id(parent_array[i]);
break;
}
}
}
}
function get_bottom_id(the_id){
var c_array = new Array();
var n = 0;
for(var i = 0; i < parent_array.length; i++){
if(the_id == parent_array[i]){
c_array[n] = id_array[i];
n++;
}
}
if(n > 0){
return c_array;
}else{
return false;
}
}
function create_sel(the_id){
the_id = Number(the_id);
var node_array,option_array,sel_name,head_code,last_code,sel_code;
document.getElementById("set_sel").innerHTML = '';
node_array = get_top_id(the_id);
node_array.unshift(the_id);
head_code = '<form method="post" action="">';
last_code = '</form>';
sel_code  = '';
for(var k = node_array.length - 1; k >= 0; k--){
option_array = get_bottom_id(node_array[k]);
if(option_array != false){
sel_name  = 'select' + node_array[k];
sel_code += '<select name="' + sel_name + '" onchange="create_sel(this.value)">';
for(var l = 0; l < option_array.length; l++){
for(var m = 0; m < id_array.length; m++){
if(option_array[l] == id_array[m]){
sel_code += '<option value=' + id_array[m] + '>' + name_array[m] + '</option>';
break;
}
}
}
sel_code += '</select>';
}
}
document.getElementById("set_sel").innerHTML = head_code + sel_code + last_code;
}
</script>
</head><body onLoad="create_sel(2)">
    <div id="set_sel"></div>
</body>
</html>

解决方案 »

  1.   

    脚本代码我再贴下
    <script type="text/javascript">
    //*测试数据
    var id_array,name_array,parent_array;
    id_array = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14);
    name_array = new Array("湖北","广东","黄冈","武汉","东莞","虎门","浠水","蕲春","武昌","汉阳","东一","东二","虎一","虎二");
    parent_array = new Array(0,0,1,1,2,2,3,3,4,4,5,5,6,6);
    function get_top_id(the_id){
        var p_array = new Array();
        var n = 0;
        if(the_id == 0){
            return p_array;
        }
        for(var i = 0; i < id_array.length; i++){
            if(the_id == id_array[i]){
                p_array[n] = parent_array[i];
                if(parent_array[i] == 0){
                    return p_array;
                }else{
                    n++;
                    get_top_id(parent_array[i]);
                    break;
                }
            }
        }
    }
    function get_bottom_id(the_id){
        var c_array = new Array();
        var n = 0;
        for(var i = 0; i < parent_array.length; i++){
            if(the_id == parent_array[i]){
                c_array[n] = id_array[i];
                n++;
            }
        }
        if(n > 0){
            return c_array;
        }else{
            return false;
        }
    }
    function create_sel(the_id){
        the_id = Number(the_id);
        var node_array,option_array,sel_name,head_code,last_code,sel_code;
        document.getElementById("set_sel").innerHTML = '';
        node_array = get_top_id(the_id);
        node_array.unshift(the_id);
        head_code = '<form method="post" action="">';
        last_code = '</form>';
        sel_code  = '';
        for(var k = node_array.length - 1; k >= 0; k--){
            option_array = get_bottom_id(node_array[k]);
            if(option_array != false){
                sel_name  = 'select' + node_array[k];
                sel_code += '<select name="' + sel_name + '" onchange="create_sel(this.value)">';
                for(var l = 0; l < option_array.length; l++){
                    for(var m = 0; m < id_array.length; m++){
                        if(option_array[l] == id_array[m]){
                            sel_code += '<option value=' + id_array[m] + '>' + name_array[m] + '</option>';
                            break;
                        }
                    }
                }
                sel_code += '</select>';
            }
        }
        document.getElementById("set_sel").innerHTML = head_code + sel_code + last_code;
    }
    </script>
      

  2.   

    求人不如求己,我找到错误了,是获取上级id的函数get_top_id()写的有问题。
    这次的事我很有感触,人总是在没有退路时才发挥出了自己最大的力量。顺便奉劝一下不管什么问题都喜欢上论坛要答案的同学,不知道是你懒得自己思考问题还是觉得自己无法解答。前者的话我就不多说了,假如是后者,我以这次实际体验跟你说,不要总是带着种依赖心理思考问题。耐心点,冷静点,答案就在你眼前。
      

  3.   

    for(var i = 0; i < id_array.length; i++){
            if(the_id == id_array[i]){
                //p_array[n] = parent_array[i];
    p_array.push(parent_array[i]);
                if(parent_array[i] == 0){
                    return p_array;
                }else{
                    //n++;
                    get_top_id(parent_array[i]);
    return p_array;
                    //break;
                }
            }
        }
      

  4.   

    谢谢楼上的回答!顺便把更正后的代码贴出来大家参考参考:
    说明:可以从后台添加数据,前台就能显示出来了
    后台部分:<?php
    /*
    *说明:联动菜单
    */
    require(xxx);
    $add_result = mysql_query("select * from xxx");
    $add_result_num = mysql_num_rows($add_result);
    echo '<script type="text/javascript">var name_array,parent_array,id_array;name_array=new Array();parent_array=new Array();id_array=new Array();';
    for($i = 0; $i < $add_result_num; $i++){
    mysql_data_seek($add_result,$i);
    $add_result_information = mysql_fetch_array($add_result);
    echo 'id_array['.$i.']='.$add_result_information['xxx'].';';
    echo 'name_array['.$i.']='.$add_result_information['xxx'].';';
    echo 'parent_array['.$i.']='.$add_result_information['xxx'].';';
    }
    echo '</script>';
    ?>
    前台部分:<html>
    <head>
    <title>测试</title>
    <script type="text/javascript">
    //*测试数据
    var id_array,name_array,parent_array;
    id_array = new Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14);
    name_array = new Array("湖北","广东","黄冈","武汉","东莞","虎门","浠水","蕲春","武昌","汉阳","东一","东二","虎一","虎二");
    parent_array = new Array(0,0,1,1,2,2,3,3,4,4,5,5,6,6);/****三级版****/
    function create_select(parent_id,sel_id,what_sel){
    var new_option;
    if(parent_id === ""){
    return;
    }
    if(what_sel == 1){
    document.getElementById("mid_sel").options.length = 0;
    document.getElementById("bot_sel").options.length = 0;
    new_option = new Option("请选择地区","");
    document.getElementById("mid_sel").options.add(new_option);
    new_option = new Option("请选择县市","");
    document.getElementById("bot_sel").options.add(new_option);
    }
    if(what_sel == 2){
    document.getElementById("bot_sel").options.length = 0;
    new_option = new Option("请选择县市","");
    document.getElementById("bot_sel").options.add(new_option);
    }
    for(var j = 0; j < id_array.length; j++){
    if(parent_array[j] == parent_id){
    new_option = new Option(name_array[j],id_array[j]);
    document.getElementById(sel_id).options.add(new_option);
    }
    }
    }
    /****无限级版****/
    //获取上一级id
    function get_top_id(the_id){
    for(var i = 0; i < id_array.length; i++){
    if(the_id == id_array[i]){
    return parent_array[i];
    break;
    }
    }
    }
    //获取下一级id
    function get_bottom_id(the_id){
    var c_array = new Array();
    var n = 0;
    for(var i = 0; i < parent_array.length; i++){
    if(the_id == parent_array[i]){
    c_array[n] = id_array[i];
    n++;
    }
    }
    if(n > 0){
    return c_array;
    }else{
    return false;
    }
    }
    //生成下拉菜单代码
    function create_sel(the_id){
    the_id = Number(the_id);
    var node_array,option_array,sel_name,head_code,last_code,sel_code;
    document.getElementById("set_sel").innerHTML = '';
    var node_array = new Array();
    var n = 0,loop_go_on = the_id;
    while(loop_go_on != 0){
    node_array[n] = get_top_id(loop_go_on);
    loop_go_on = node_array[n];
    n++;
    }
    node_array.unshift(the_id);
    head_code = '<form method="post" action="">';
    last_code = '</form>';
    sel_code  = '';
    for(var k = node_array.length - 1; k >= 0; k--){
    option_array = get_bottom_id(node_array[k]);
    if(option_array !== false){
    sel_name  = 'select' + node_array[k];
    sel_code += '<select name="' + sel_name + '" onchange="create_sel(this.value)">';
    for(var l = 0; l < option_array.length; l++){
    for(var m = 0; m < id_array.length; m++){
    if(option_array[l] == id_array[m]){
    if(id_array[m] == node_array[k - 1]){
    sel_code += '<option value=' + id_array[m] + ' selected>' + name_array[m] + '</option>';
    }else{
    sel_code += '<option value=' + id_array[m] + '>' + name_array[m] + '</option>';
    }
    break;
    }
    }
    }
    sel_code += '</select>';
    }
    }
    document.getElementById("set_sel").innerHTML = head_code + sel_code + last_code;
    }
    </script>
    </head><body onLoad="create_sel(5)">
    <form name="create_sel" method="post" action="create_sel.php">
        <select id="top_sel" name="top_sel" onChange="create_select(this.value,'mid_sel',1)">
        <option value="">请选择省份</option>
        </select>
        <select id="mid_sel" name="mid_sel" onChange="create_select(this.value,'bot_sel',2)">
        <option value="">请选择地区</option>
        </select>
        <select id="bot_sel" name="bot_sel">
        <option value="">请选择县市</option>
        </select>
        </form>
        <div id="set_sel"></div>
    </body>
    </html>
      

  5.   

    楼主的东东还很好用,咱不用费力写了,耐心是需要时间的,该提时还是要提。
    如不想在 body中写入onload事件,可在脚本中写入如下代码,又便灵活调用。
    window.onload = function(){create_sel(0);}