2010-05-03 169 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

您在“addEvent”调用中使用循环变量“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选项来“要求立即调用周围的parens”,它需要在作业的整个右侧都有parens,而不仅仅是函数。所以围绕函数本身的parens是多余的;我想你正在考虑包装整个调用? – 2010-05-03 17:22:58

+0

不,我习惯于包装函数定义本身,因为当您的表达式以函数定义开始时,它是必需的。我想,当明确的函数定义只是一个r值时,不需要parens。 – Pointy 2010-05-03 17:43:25

+0

为了澄清该评论:您需要明确地让Javascript解析器明白,您不是在为了立即调用而需要匿名函数的情况下声明函数。 (我知道你知道,@熊,但澄清是为后人:-) – Pointy 2010-05-03 17:50:15