2010-05-03 2 views
2

Это мой код snippt. Но код прерывается после внутреннего цикла. Но без сообщения об ошибке. Любая идея?Где ошибка в этом коде

Спасибо.

var lastnames = document.getElementsByClassName('box_nachname'); 
    var firstnames  = document.getElementsByClassName('box_vorname'); 
    var teilnehmer = document.getElementsByClassName('select'); 
    observers = []; 

    // iterate over nachname array. 
    for (var i = 0; i < lastnames.length; i++) { 

     // Create an observer instance. 
     observers[i] = new Observer(); 


     // Subscribe oberser object. 
     for(idx in teilnehmer) { 
      if(teilnehmer[idx].id.split("_")[0].toLowerCase() !== "zl") { 
       var anynum = function(element) { 
              observers[i].subscribe(element, updateTeilnehmerSelectbox); 
             }(teilnehmer[idx]); 
      } 
     } 


     //on blur the Observer fire the updated info to all the subscribers. 
     var anynumNachname = function(j, element, value, observer) { 
              cic.addEvent(lastnames[j], 'blur', observer.fire(element, value)); 
              } (i, lastnames[i], lastnames[i].value, observers[i]); 
     cic.addEvent(firstnames[i], 'blur', function(element, value, observer) {observer.fire(element, value)}(lastnames[i], lastnames[i].value, observers[i])); 

    } 

ответ

2

Вы используете переменную цикла «i» в вызове «addEvent». Это не сработает должным образом, потому что каждый из обработчиков событий будет разделять один и тот же «i», и поэтому каждый будет видеть только последнее значение, которое было установлено «i».

cic.addEvent(firstnames[i], 'blur', (function(index) { 
    return function(element, value, observer) { 
    observer.fire(element, value)}(lastnames[index], lastnames[index].value, observers[index]); 
    }; 
})(i)); 

Кроме того, хотя я не уверен, что это нужно, я бы поставил функцию вы призывающую «anynumNachname» в круглых скобках:

var anynumNachname = (function(j, element, value, observer) { 
    cic.addEvent(lastnames[j], 'blur', observer.fire(element, value)); 
})(i, lastnames[i], lastnames[i].value, observers[i]); 
+0

Что касается упаковки 'anyNachname' в круглых скобках: есть опция JSLint для «Требовать парсеры вокруг непосредственных вызовов», которые требуют парсенов вокруг всей правой части задания, а не только функции. Поэтому параны вокруг самой функции излишни; Думаю, ты думал об обертывании всего призыва? –

+0

Нет, у меня есть привычка обертывать определение функции, потому что это необходимо, когда ваше выражение начинается с определения функции. Я полагаю, когда однозначно, что определение функции является только значением r, parens не нужны. – Pointy

+0

Чтобы прояснить этот комментарий: вам нужно явно сделать Javascript-парсер понятным, что вы не объявляете функцию в том случае, если хотите анонимную функцию для немедленного вызова. (Я знаю, что вы это знаете, @Bears, но разъяснение для потомков :-) – Pointy

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