帮我看一下这个关联,不知怎么滴浏览器会挂掉的

keaizhong 2006-10-21 10:17:39
根据不同的场景类型显示场景,如果选择两个场景类型,就显这两类下的全部场景
现在执行到注释标注的地方开始出问题,不晓得怎么回事?大家帮忙看下。


<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>
<script language="javascript">
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'}
}
</script>
<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>
<script>
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 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){
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
break;
}else{
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)
}
</script>
...全文
123 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
keaizhong 2006-10-21
  • 打赏
  • 举报
回复
while(temp2.length>temp.length+2){
temp2.options[temp.length+2]=null
}

经过热心肠的人提醒,把错误找出来了,现在改成这样子才是最简单和是我要的东西上。
谢谢了。。
myvicy 2006-10-21
  • 打赏
  • 举报
回复
temp2.options[temp2.length]=null
改为-》temp2.remove(temp2.length-1)
另发现你虽然有alert出其他的选项,不过你没有改变temp2的长度。
梅雪香 2006-10-21
  • 打赏
  • 举报
回复
<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>
总之,问题多多,设计上就有问题,所以代码无法执行,不认识到设计上的错误,再怎么改代码也没有.
keaizhong 2006-10-21
  • 打赏
  • 举报
回复
temp2.options[temp2.length]=null

这个执行完了之后,temp2不会小一个选项吗?那样子怎么不会小一个成长度?
myvicy 2006-10-21
  • 打赏
  • 举报
回复
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
}

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧