while(temp2.length>temp.length){
temp2.options[temp2.length]=null
}
问题出在这里。当temp2.length>temp.length成立时,你没有在循环内部减小temp2.length,所以条件一直成立,循环一直执行,因此浏览器会挂掉。
用下面的代码可以看出效果。
var i=0;
while(temp2.length>temp.length){
i++;
status=i;
if(i>100) return;
temp2.options[temp2.length]=null
}

解决方案 »

  1.   

    temp2.options[temp2.length]=null这个执行完了之后,temp2不会小一个选项吗?那样子怎么不会小一个成长度?
      

  2.   

    <script language="javascript">
    var menuInit = [['1', '酒家', false], ['2', '集市', false], ['3', '学堂', false],
                    ['4', '校场', false], ['5', '农业', false], ['6', '铁匠铺', false], 
                    ['7', '药铺', false], ['8', '监狱', false], ['9', '督府', false], 
                    ['10', '自宅', false], ['11', '寺庙', false], ['12', '港口', false], 
                    ['13', '驻军营', false], ['15', '太守府', false], ['17', '白马山', false], 
                    ['59', '派系', false], ['74', '都尉府', false], ['82', '仓库', false], 
                    ['84', '旅店', false], ['86', '集市', false], ['87', '自己', false], ['88', '任务', false]]
    var menuArr = [
                    [['8', '监狱', false], ['9', '督府', false], ['15', '太守府', false], ['74', '都尉府', false]], 
                    [['1', '酒家', false], ['2', '集市', false], ['3', '学堂', false], ['5', '农业', false], 
                     ['6', '铁匠铺', false], ['7', '药铺', false], ['11', '寺庙', false], 
                     ['12', '港口', false], ['59', '派系', false], ['82', '仓库', false], 
                     ['84', '旅店', false], ['86', '集市', false]], [['4', '校场', false], ['13', '驻军营', false]], 
                    [['10', '自宅', false], ['87', '自己', false], ['88', '任务', false]], [['17', '白马山', false]]]
    function scene_id_multi_select()
    {
        document.all.scene_id.value = '';
        var select_options = document.all.scene_id_select.options;
        var enable_multi_select = true;
        for(var i=0;i<select_options.length;i++)
        {
            if(select_options[i].selected == true){
                if(select_options[i].value == '0') continue;
                document.all.scene_id.value += (document.all.scene_id.value.length>0?',':'')+select_options[i].value
            }
        }
        if(document.all.scene_id.value.length>0){
            if(select_options[0].value=='0')
                select_options[0].selected=false;}
        else{
            document.all.scene_id.value='0'
        }
    }
    function Cha_Select(temp,child){
    var temp2 = document.all(child)
    temp2.options[0]=new Option('无具体场景限制',0)
    temp2.options[1]=new Option('主场景','-1')
     alert(temp.length+' '+temp)//执行到这里为止都正确
    for(var i = 0; i < temp.length; i++){  //这里应该是双层循环
     alert(temp.length+' '+temp)//当选择‘特殊机构’执行到这里浏览器会挂掉
     return
    temp2.options[i+2]=new Option(temp[i][1],temp[i][0])
    if( temp[i][2] ) temp2.options[i+2].selected = true
    }
    while(temp2.length>temp.length){ //这里的while如果执行进去就是个死循环啦
    temp2.options[temp2.length]=null
    }
    }
    function selectValue(obj, child) {
     var v = new Array();
     var vv = new Array();
     for( i= 0; i<obj.options.length; i++ ) {
       if( obj.options[i].selected ) {
         if( obj.options[i].value == '-1' ) {
       v = menuInit; // v是二维数组
       break;
     }else{
       var vv = menuArr[obj.options[i].value]; //此处返回一个二维数组
           if(vv) v = v.concat(vv.slice(0,vv.length)); //如果选择多项, 经过运算后的v可能是三维数组
         /*
       var len = v.length
       var vv = menuArr[obj.options[i].value]
       if( vv != undefined ) {
         for( j = 0; j< vv.length; j++ ) {
           v[v.length] = vv[j]
         }
       }*/
     }
       }
     }
     Cha_Select(v,child) //参数v的维数不确定,下面的函数就很难处理了. 可以把menuInit改成三维
    }
    </script><table border="1">
        <tr class="secondalt">
            <td width="50%" valign="top">出现场景类型限制<br>NPC只在选中的场景类型中出现</td>
            <td>
                <select name="scene_type[]"    multiple size=8 onchange="selectValue(this, 'scene_id_select')">
                    <option value="-1" selected class="">无场景类型限制</option>
                    <option value="0" class="">政府机构</option>
                    <option value="1" class="">民用设施</option>
                    <option value="2" class="">军事设施</option>
                    <option value="3" class="">其它(自宅等)</option>
                    <option value="9" class="">特殊机构</option>
                </select>
            </td>
        </tr>
    <input type="hidden" name="scene_id" value="0">
        <tr class="firstalt">
            <td width="50%" valign="top">出现具体场景限制<br>NPC只在选中的具体场景中出现</td>
            <td>
                <select name="scene_id_select" onchange="scene_id_multi_select()"  multiple size=8 >
                    <option value="0" selected class="">无具体场景限制</option>
                    <option value="-1" class="">主场景</option>
                    <option value="1" class="">酒家</option>
                    <option value="2" class="">集市</option>
                    <option value="3" class="">学堂</option>
                    <option value="4" class="">校场</option>
                    <option value="5" class="">农业</option>
                    <option value="6" class="">铁匠铺</option>
                    <option value="7" class="">药铺</option>
                    <option value="8" class="">监狱</option>
                    <option value="9" class="">督府</option>
                    <option value="10" class="">自宅</option>
                    <option value="11" class="">寺庙</option>
                    <option value="12" class="">港口</option>
                    <option value="13" class="">驻军营</option>
                    <option value="15" class="">太守府</option>
                    <option value="17" class="">白马山</option>
                    <option value="59" class="">派系</option>
                    <option value="74" class="">都尉府</option>
                    <option value="82" class="">仓库</option>
                    <option value="84" class="">旅店</option>
                    <option value="86" class="">集市</option>
                    <option value="87" class="">自己</option>
                    <option value="88" class="">任务</option>
                </select>
            </td>
        </tr>
    </table>
    总之,问题多多,设计上就有问题,所以代码无法执行,不认识到设计上的错误,再怎么改代码也没有.
      

  3.   

    temp2.options[temp2.length]=null
    改为-》temp2.remove(temp2.length-1)
    另发现你虽然有alert出其他的选项,不过你没有改变temp2的长度。
      

  4.   

    while(temp2.length>temp.length+2){
    temp2.options[temp.length+2]=null
    }经过热心肠的人提醒,把错误找出来了,现在改成这样子才是最简单和是我要的东西上。
    谢谢了。。