2016-01-16 5 views
1
 var tr = document.getElementsByTagName('tr'); 
     tr[0].onmouseover = function(){ 
      tr[0].style.backgroundColor = '#ccc'; 
     } 
     tr[1].onmouseover = function(){ 
      tr[1].style.backgroundColor = '#ccc'; 
     } 
     tr[2].onmouseover = function(){ 
      tr[2].style.backgroundColor = '#ccc'; 
     } 

Первое право, но когда я использую цикл for, как в следующем фрагменте кода, я получаю «Uncaught TypeError: Cannot read property 'style' of undefined».В чем разница между этими двумя утверждениями?

 var tr = document.getElementsByTagName('tr'); 
     for(var i=0;i<tr.length;i++){ 
      tr[i].onmouseover = function(){ 
      tr[i].style.backgroundColor = '#ccc'; 
      }    
     } 
+0

Это было бы достаточно легко отладить. Поместите контрольную точку в свой отладчик в строке, где вы задаете цвет фона. Нажмите на первый 'tr'. Затем просмотрите значение 'i'. Это должно дать представление о проблеме. –

+0

Подводя итог, вы не можете использовать 'i' после завершения цикла (например, внутри обратного вызова). Лучше иметь 'this' или' event' в обработчике, чтобы он мог самостоятельно искать свой элемент DOM. – Thilo

ответ

1

Вам нужно обновить с

tr[i].onmouseover = function(){ 
    tr[i].style.backgroundColor = '#ccc'; 
} 

в

tr[i].onmouseover = function(event){ 
    event.currentTarget.style.backgroundColor = '#ccc'; 
} 

Проблема - К тому времени, когда вы пытаетесь получить доступ к tr[i] в значении обработчик события i был обновлен до 3 и поэтому произошла ошибка

+1

IIRC 'window.event' является IE-специфическим. Обычный подход заключается в том, чтобы написать обработчик для принятия параметра 'event'. –

+0

@torazaburo - Да, вы правы. Я просто поспешил к ответу и сделал беспорядок. – nikhil

+1

получил это. Спасибо много. – fengchunlong

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