2013-11-20 3 views
1

Проверьте этот код ...Loop не должен нарушать Пересекая недостоверных отчетности

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> 

код 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); 
} 

CSS

.nocolor { 
    color:#000 !important; 
} 

DEMO

То, что я пытаюсь сделать здесь, находится по щелчку кнопки, чтобы весь цвет шрифта div и span был «черным».

Мой код разрывается (очевидно), когда счетчик пересекает i = 2, потому что есть только 2 div и, следовательно, «i [2]» будет неопределенным и, следовательно, цикл прерывается.

Есть ли в любом случае, чтобы петля не прерывалась после удара по этой точке? Может быть, я не понимаю, как это сделать. Надеюсь, вы все понимаете?

ответ

5

Чтобы использовать петлю, как вы ее используете, у вас есть, чтобы убедиться, что оба массива имеют одинаковую длину.

Очевидно, что их длина не равна, поэтому либо вы разделите этот один цикл на две петли (1), либо вы переходите к двум if-операторам, проверяющим i, относительно длины обоих массивов (2). Еще лучше использовать for в сочетании с querySelectorAll (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); 
} 

(2) (fiddle):

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); 
} 

(3) (fiddle):

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

Я бы предложил _author_ использовать 2 петли, но есть и (3) http://jsfiddle.net/A52Lj/2/, если он хочет 1 цикл. – mdolbin

+0

Я попробовал второй вариант в скрипке, не работает ... Каков третий вариант с concat? Я думал, что это для струны. Могу ли я попробовать это для меня в скрипке? – MarsOne

+0

@lancemanfv, вы играете аккуратно. Почему вы не отправляете его в качестве решения? – MarsOne

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); 

} 
+0

У меня уже есть это в другой моей скрипке. Я хочу, чтобы это произошло в одном. http://jsfiddle.net/A52Lj – MarsOne

2

Если вы не беспокоитесь о браузерах под IE9, вы должны использовать querySelectorAll, так как это позволит вам подобрать оба типа элементов в одном запросе.

var a = document.querySelectorAll('p, div'); 
for (var i = 0, l = a.length; i < l; i++){ 
    a[i].classList.add('nocolor'); 
} 

Fiddle

1

Другой подход найден:

function changetobw() { 
    a = document.getElementsByTagName('p'); 
    b = document.getElementsByTagName('div'); 
    var j=(a.length>b.length)?a.length:b.length; 

    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 <j); 

} 
+0

Приятель, у него есть ошибка. Если я не увеличиваю число div до 5, это не удастся для 5-го div http://jsfiddle.net/A52Lj/3/ – MarsOne

+0

Теперь попробуйте it.I обновил код http://jsfiddle.net/A52Lj/6/ –

+1

+1 для инновационного ответа. – MarsOne

2

Я думаю, и должны сделать конкретный общий метод, чтобы изменить цвет, а затем вызвать его для каждого типа тега и нужно, а затем изменить все в одном
попробовать это:

function changetobw() 
{ 
    changeColor(document.getElementsByTagName('p')); 
    changeColor(document.getElementsByTagName('div')) ; 
} 
function changeColor(obj) 
{ 
    var i = 0; 
    do { 
     obj[i].classList.add('nocolor'); 
     i++; 
    } while (i < obj.length); 
} 

demo: http://jsfiddle.net/A52Lj/5/

+0

+1 для этой попытки. Но это несколько глубже, чем моя первоначальная попытка. – MarsOne

+0

Я думаю, что это более общий и читаемый способ. –

Смежные вопросы