基于元素不存在的中断循环

时间:2012-03-07 12:54:26

标签: javascript arrays html for-loop getelementbyid

我已经构建了一个允许用户在幻灯片中添加多达10个图像的cms,这些图像都在div的前端输出,并带有showcaseSlide的id,末尾附加了一个0-9的数字,例如: showcaseSlide0,showcaseSlide1等。对于控制幻灯片的javascript,我需要将所有div id输出到一个数组中,但是当幻灯片完成时结束数组,例如如果div id来自showcaseSlide0 - showcaseSlide3,我需要数组来自幻灯片[0] - 幻灯片[3]。

以下是我之前尝试过的当前代码和一些注释掉的代码:

var slides = new Array();
var count = 0;
for(i=0; i<=10; i++){
slides[i] = "showcaseSlide"+i;
document.write(slides[i]); //so that I can see which id's are in the array
var div = document.getElementById(slides[i]);
//if(div) { break; } <- doesn't break
//if(document.getElementById(slides[i]) == null) break; <-breaks after 1st
//if(document.getElementById(slides[i]) == undefined) break; <- breaks after 1st
};

修改

我发现(感谢下面评论过的Teemu)它没有工作,因为它是在页面加载之前调用的,因此在渲染对象之前。我还要感谢Peter Kelly(他也在下面评论过),他指出我需要使用!在我的破坏if声明和弗雷泽指出我的循环是太大了。

这是新代码(包括初始化函数的其他元素):

var count = 0;
var wait = 4000;
var slides = [];

function startShowcase() {

    for(var i=0; i<10; i++){
        slides[i] = "showcaseSlide"+i;;
       if(!document.getElementById(slides[i])) { break; }
    };
    setInterval(showcase, wait);

};

2 个答案:

答案 0 :(得分:1)

我不会那么复杂。我猜你有一个类应用于你的所有幻灯片div?如果您这样做,请使用以下内容:

var slides = []
var divs = document.getElementsByClassName('slide-class')
for (var i = 0, l = divs.length; i < l; ++i) {
    slides.push("showcaseSlide" + i)
}

顺便说一句,关于你的代码的一些评论:

  • 请勿使用new Array()。相反,请使用[]。请参阅here以了解原因。
  • 您没有使用var关键字来声明您的i变量,这意味着此变量是全局变量。全球是邪恶的。
  • document.write是邪恶的。

我猜您的count变量稍后会有用吗?

答案 1 :(得分:1)

您的DIV编号为0-9,但您的循环运行了11次。

不是实际的代码,但这解释了它。

for(i=0; i<=10; i++){
  0 = 1st 
  1 = 2nd
  2 = 3rd
  3 = 4th
  4 = 5th
  5 = 6th
  6 = 7th
  7 = 8th
  8 = 9th
  9 = 10th
  10 = 11th
}