2013-11-02 3 views
0

Я пытаюсь изучить javascript, не используя jQuery и другие.javascript Невозможно вызвать метод undefined в getElementsByTagName

У меня эта ошибка: не удается вызвать метод «getElementsByTagName» неопределенной

Я знаю, что проблема ошибки, но он не знает ее решить. как я могу избежать этой ошибки в будущем?

var menu = document.getElementsByClassName("menu-item"); 
    var i; 
    for (i = 0; i < menu.length; i = i + 1) { 
     menu[i].addEventListener("mouseenter", function() { 
     setInterval(function(){ 
      menu[i].getElementsByTagName("a").css("color","red") 
     },5000) 
     }) 
    } 
+0

[ '.css()'] (http://api.jquery.com/css/) является JQuery также см Http: // stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example – Musa

+0

в чистом javascript вы должны назвать style.color = "red", no css() –

+0

document.getElementsById (меню [i]. ID) .setAttribute ('стиль', 'цвет: красный'); вы также можете найти свою собственную консоль своего браузера –

ответ

1

На самом деле существует более глубокая проблема с кодом. Функция setInterval не будет вызываться во время работы цикла. Он будет вызываться после завершения цикла. Поэтому, когда он вызывается, i будет иметь значение menu.length, тем самым находясь вне массива. Чтобы исправить это, попробуйте что-то вроде этого: (скрипка: http://jsfiddle.net/bKY9y/5/)

var menu = document.getElementsByClassName("menu-item"); 
console.log(menu); 

for (var i = 0; i<menu.length; i++) 
{ 

    console.log(menu[i].addEventListener) 
    menu[i].addEventListener("mouseover",function() { 
     var obj = this; 
     setTimeout(function(){ 
      console.log(obj); 
      var a = obj.getElementsByTagName("a"); 
      for (var j = 0; j < a.length; j++){ 
       a[j].style.color = "red"; 
      }   
     },1000) 
     }) 
} 
+0

Код OP применяет цвет ко всем тегам «a», найденным с помощью 'getElementsByTagName()'. Это не то, что делает ваш код. – jfriend00

+0

Извините, не читал правильно. Отредактировано, что теперь? – pax162

+0

OP использует mouseenter, вы используете mouseover и другое время на интервале. Я думаю, что вы исправили основные ошибки с кодом OP, но, когда я прокомментировал вопрос OP, я не вижу, как запуск нового 'setInterval()' в каждом событии мыши может быть правильным. Интервалы будут накапливаться, и тогда у вас будет много интервалов, выполняющихся на одном и том же объекте навсегда. – jfriend00

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