联动菜单事件

wtcsy 2008-10-05 10:16:15
刚开始写联动菜单,却发现了一些解决不了的问题 郁闷!!
代码写的很差劲也很乱,请各位大虾点跟烟慢慢看
<body>
</body>
<script>
function change(e){
alert(e)
}

function ss(){
var args=ss.arguments
var big
var o //判断是不是已经生成了菜单,
for(var i=1;i<args.length;i++)
{
big=(args[i][0]>args[0][0]?args[i][0]:args[0][0])
} //得到是几级联动


for(var i=0;i<args.length;i++)
{
for(var k=1;k<=big;k++) //根据big生成不同级别的菜单
{

if(args[i][0]==k&&k==1)
{
var sele =document.createElement("select")
document.body.appendChild(sele)
for (var j=1; j <args[i].length; j++)
{sele.options.add(new Option(args[i][j], (j-1)));}
sele.onchange = function(){change(sele.selectedIndex)};
} //第一个菜单的生成方式


if(args[i][0]==k&&k!=1)
{
if(o!=args[i][0])
{
o=args[i][0]
var sele =document.createElement("select")
document.body.appendChild(sele)
for (var j=1; j <args[i].length-1; j++)
{sele.options.add(new Option(args[i][j], (j-1)));}
}//剩下菜单的生成方式
}
}
}


}

var s1=[1,"人族","兽族","不死族","精灵族"]
var s2=[2,"大法师","山丘之王","血法师","怕拉顶",1]
var s3=[2,"先知","牛头人酋长","地狱咆哮-剑圣","xiaoYY",2]
ss(s1,s2,s3)
</script>

alert()出来的全部都是一个数字 奇怪!
...全文
95 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloudgamer 2008-10-06
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wtcsy 的回复:]
4楼的大虾
您的这中写法没见过 sele.onchange=(...)(....) PS:真的是第一次见到!!~~~
我太菜了
可否告诉一下 我该看一下什么资料才能理解你的写法了????
[/Quote]

看JS闭包
  • 打赏
  • 举报
回复
JS闭包
sxntree 2008-10-05
  • 打赏
  • 举报
回复
xuexi
wtcsy 2008-10-05
  • 打赏
  • 举报
回复
4楼的大虾
您的这中写法没见过 sele.onchange=(...)(....) PS:真的是第一次见到!!~~~
我太菜了
可否告诉一下 我该看一下什么资料才能理解你的写法了????
hbhbhbhbhb1021 2008-10-05
  • 打赏
  • 举报
回复
变量作用域问题,可以用中间变量等方法代替

<body>
</body>
<script>
function change(e){
alert(e)
}

function ss(){
var args=ss.arguments
var big
var o //判断是不是已经生成了菜单,
for(var i=1;i<args.length;i++)
{
big=(args[i][0]>args[0][0]?args[i][0]:args[0][0])
} //得到是几级联动


for(var i=0;i<args.length;i++)
{
for(var k=1;k<=big;k++) //根据big生成不同级别的菜单
{

if(args[i][0]==k&&k==1)
{
var sele =document.createElement("select")
document.body.appendChild(sele)
for (var j=1; j <args[i].length; j++)
{sele.options.add(new Option(args[i][j], (j-1)));}
//sele.onchange = function(){change(sele.selectedIndex)};
sele.onchange = (function(i){return function (){change(i.selectedIndex)}})(sele)
} //第一个菜单的生成方式


if(args[i][0]==k&&k!=1)
{
if(o!=args[i][0])
{
o=args[i][0]
var sele =document.createElement("select")
document.body.appendChild(sele)
for (var j=1; j <args[i].length-1; j++)
{sele.options.add(new Option(args[i][j], (j-1)));}
}//剩下菜单的生成方式
}
}
}


}

var s1=[1,"人族","兽族","不死族","精灵族"]
var s2=[2,"大法师","山丘之王","血法师","怕拉顶",1]
var s3=[2,"先知","牛头人酋长","地狱咆哮-剑圣","xiaoYY",2]
ss(s1,s2,s3)
</script>

飞翔地猴子 2008-10-05
  • 打赏
  • 举报
回复
刚刚想多加一种颜色了 搞多了代码 你看这里吧


{sele.options.add(new Option(args[i][j], (j-1)));}
sele.onchange = function(){change(sele.selectedIndex)};
} //第一个菜单的生成方式[/color]

你在这一段代码中调用了change函数 而change函数就是alert(弹出提示框)的。

你的代码大概的执行是

先生成了菜单,单击第一个菜单,执行change函数 没有继续调用改变第二个菜单的代码 而只是alert了。
飞翔地猴子 2008-10-05
  • 打赏
  • 举报
回复
{sele.options.add(new Option(args[i][j], (j-1)));}
sele.onchange = function(){[color=#00FF00]change(sele.selectedIndex
)};
} //第一个菜单的生成方式[/color]

你在这一段代码中调用了change函数 而change函数就是alert(弹出提示框)的。

你的代码大概的执行是

先生成了菜单,单击第一个菜单,执行change函数 没有继续调用改变第二个菜单的代码 而只是alert了。
wtcsy 2008-10-05
  • 打赏
  • 举报
回复
<body>
</body>
<script>
function change(e){
alert(e)
}

function ss(){
var args=ss.arguments
for(var i=0;i<args.length;i++)
{
var sele =document.createElement("select")
document.body.appendChild(sele)
for (var j=1; j <args[i].length; j++)
{sele.options.add(new Option(args[i][j], (j-1)));}
sele.onchange = function(){change(sele.selectedIndex)};
}
}

var s1=[1,"人族","兽族","不死族","精灵族"]
ss(s1)
</script>

把上面的代码化简后 又可以正常的alert()出来
请个位大虾指教下错在什么地方了 谢谢 !~~

87,927

社区成员

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

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