javascript 循环内不认对象

stenlylee 2007-01-29 03:47:15
以下两段代码:

var i = 0;
arr[i].onmouseover = function() {
arr[i].getElementsByTagName("div")[i].style.left = 100;
arr[i].getElementsByTagName("div")[i].style.top = 20;
arr[i].getElementsByTagName("div")[i].style.display = "block";
}
arr[i].onmouseout = function() {
arr[i].getElementsByTagName("div")[i].style.display = "none";
}

以上代码完全正常,可以达到效果,但是,把i编程循环中的变量后,即把i=0变成循环中的:


for(var i = 0; i<arr.length; i++) {
//这里放上面那段去掉第一行var i = 0;的全部代码
}

浏览器报错,arr[...]为空或不是对象。
arr.length能够输出具体数值4循环也能输出i=0,1,2,3
什么倒头问题啊!
...全文
1073 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
AHUA1001 2007-01-30
  • 打赏
  • 举报
回复
for(var i = 0; i<arr.length; i++) {
//这里放上面那段去掉第一行var i = 0;的全部代码
}
把这个放在上边
arr还没有值呢
所以arr.length过不去。
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
muxrwc(王辰)
xuStanly(黑金)
真的非常感谢你们了,
拜你们为师了,黑金大哥,也能给个QQ什么的么?谢谢了
xuStanly 2007-01-29
  • 打赏
  • 举报
回复
循环引用时做为循环指针的变量被误改写的问题。
js这一类的脚本语言变量的作用域经常让初学者犯晕,
所以,建议在写稍复杂的js代码的时候,循环的指针不要用i,n,m等过于简单的字母。
避免当函数之间互相调用时,两个函数中因同时存在以i,n,m等命名的指针变量的循环而出现错误。
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
谢谢,结贴,xuStanly(黑金)的方法也有用
muxrwc 2007-01-29
  • 打赏
  • 举报
回复
boss说..上班不允许上Q...
有机会上了加你..^o^
muxrwc 2007-01-29
  • 打赏
  • 举报
回复
也就是说...
return 函数后.
那些每次执行那些func都没有释放资源...
并且..返回的func中..的i引用了..执行时的func里的形式参数i
这样每执行一次就会发生一次新的引用...
所以说就不会发生引用外部的那个i...
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
to muxrwc(王辰)
加了你QQ了,加我,谢谢
muxrwc 2007-01-29
  • 打赏
  • 举报
回复
QQ: 663710209
寒,就是说..
程序顺序执行...
执行到最后一次的时候i == arr.length了..
然后跳出循环...
但是执行的过程中...
给那些onmouseover 都指定了func
里面引用了一个变量就是循环的时候这个i
因为它们引动的是这个i所以...当执行完后...
就会出错...
你可以从那些func里放个alert(i);
这样
arr[i].onmouseout = function() {
alert(i);
arr[i].getElementsByTagName("div")[0].style.display = "none";
}
而我那样做只是改变了i的引用...
这个你仔细理解下就可以明白的..
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
xuStanly(黑金)
您的方法也可以,这个里面到底是什么一个原因呢?
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
to muxrwc(王辰)
您的方法有用,只要根据我的实际情况稍微调整下位置就可以了,但是我还是不明白其中的原理……能告诉我么?是在是非常感谢……
xuStanly 2007-01-29
  • 打赏
  • 举报
回复
arr[i].onmouseover = function() {
//这里面的arr[i]应全部换成this
}
arr[i].onmouseout = function() {
//同上
}
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
能留个QQ或者其他什么的号码给我么?谢谢大哥了
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
判断的时候是i<arr.length啊,最后一次,怎么会i==arr.length呢?

而且,我即使把判断循环的条件写成i<(arr.length-1)也出现同样的问题啊……
muxrwc 2007-01-29
  • 打赏
  • 举报
回复
因为你用的是
for(var i=0; i<arr.length; i++) {
arr[i].onmouseover = function() {
arr[i].getElementsByTagName("div")[0].style.left = 100;
arr[i].getElementsByTagName("div")[0].style.top = 20;
arr[i].getElementsByTagName("div")[0].style.display = "block";
}
arr[i].onmouseout = function() {
arr[i].getElementsByTagName("div")[0].style.display = "none";
}
}
这个for的i
循环到最后一次的时候i 就 == arr.length
所以..你的那些FUNC找i就会出错..
我那样写..是用一个func保了i...
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
to muxrwc(王辰)
只是纠正以下我自己发帖时候的错误啊,没有说不搭理你啊……

我只是想明白,为什么手工指定i的值的时候就有效,用循环指定i的值的时候,就无效……

你的方法我在试,不管试出来效果对不对,我这个问题到底是什么原因引起的呢?
muxrwc 2007-01-29
  • 打赏
  • 举报
回复
...没采纳我的意见也就算了..都没搭理我...
伤心一阵...
飘走.
stenlylee 2007-01-29
  • 打赏
  • 举报
回复
我原来的代码写错了,
不是要用getElementsByTagName("div")[i],二十只要用getElementsByTagName("div")[0],即第一个元素就可以了

var i = 0;
arr[i].onmouseover = function() {
arr[i].getElementsByTagName("div")[0].style.left = 100;
arr[i].getElementsByTagName("div")[0].style.top = 20;
arr[i].getElementsByTagName("div")[0].style.display = "block";
}
arr[i].onmouseout = function() {
arr[i].getElementsByTagName("div")[0].style.display = "none";
}
有效果,下面放到循环里面就没有效果了
for(var i=0; i<arr.length; i++) {
arr[i].onmouseover = function() {
arr[i].getElementsByTagName("div")[0].style.left = 100;
arr[i].getElementsByTagName("div")[0].style.top = 20;
arr[i].getElementsByTagName("div")[0].style.display = "block";
}
arr[i].onmouseout = function() {
arr[i].getElementsByTagName("div")[0].style.display = "none";
}
}
muxrwc 2007-01-29
  • 打赏
  • 举报
回复
<script type="text/javascript">
var rover = function (i) {
return function () {
arr[i].getElementsByTagName("div")[i].style.left = 100;
arr[i].getElementsByTagName("div")[i].style.top = 20;
arr[i].getElementsByTagName("div")[i].style.display = "block";
};
};
var rout = function (i) {
return function () {
arr[i].getElementsByTagName("div")[i].style.display = "none";
};
};

arr[i].onmouseover = rover(i);
arr[i].onmouseout = rout(i);
</script>

87,909

社区成员

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

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