遇到无效语句时,循环不应中断

Mar*_*One 1 html javascript

看看这个代码......

HTML

<span>TEST </span>

<div style="color:red">COlured div</div>
<div style="color:blue">COlured div</div>
<p style="color:red">Colourful TExt</p>
<p style="color:blue">Colourful TExt</p>
<p style="color:green">Colourful TExt</p>
<p style="color:brown">Colourful TExt</p>
<button onclick="changetobw()">CHANGE COLOR</button>
Run Code Online (Sandbox Code Playgroud)

JavaScript的

function changetobw() {
    a = document.getElementsByTagName('p');
    b = document.getElementsByTagName('div');
    var i = 0;
    do {
        a[i].classList.add('nocolor');
        b[i].classList.add('nocolor');
        i++;
    } while (i < a.length && i < b.length);   
}
Run Code Online (Sandbox Code Playgroud)

CSS

.nocolor {
    color:#000 !important;
}
Run Code Online (Sandbox Code Playgroud)

DEMO

我在这里尝试做的是点击按钮使所有div和span字体颜色"黑色".

当计数器越过i = 2时,我的代码(显然)断开,因为只有2个div,因此"i [2]"将是未定义的,因此循环中断.

无论如何,在击中这一点后,循环不会破坏?也许我没有完全理解我的观点.希望大家都明白吗?

Bas*_*i M 5

要像使用它一样使用循环,您必须确保两个数组具有相同的长度.

显然,它们的长度不相等,所以你要么将这一个循环分成两个循环(1),要么你用两个if语句来检查两个数组的长度(2).更好的是forquerySelectorAll(3)结合使用.

(1):

function changetobw() {
    a = document.getElementsByTagName('p');
    b = document.getElementsByTagName('div');
    var i = 0;
    do {
        a[i].classList.add('nocolor');        
        i++;
    } while (i < a.length);   
    i = 0;
    do {
        b[i].classList.add('nocolor');
        i++;
    } while (i < b.length);
}
Run Code Online (Sandbox Code Playgroud)

(2)(小提琴):

function changetobw() {
    a = document.getElementsByTagName('p');
    b = document.getElementsByTagName('div');
    var i = 0;
    do {
        if(i < a.length)
          a[i].classList.add('nocolor');

        if(i < b.length)
          b[i].classList.add('nocolor');

        i++;
    } while (i < a.length || i < b.length);   
}
Run Code Online (Sandbox Code Playgroud)

(3)(小提琴):

function changetobw() {
  var els = document.querySelectorAll('p, div');
  for(var i = 0; i < els.length; i++) {
    els.item(i).classList.add("nocolor");
  }
}
Run Code Online (Sandbox Code Playgroud)