2012-05-19 65 views
0

这种方式不起作用(元素从函数中拉出来)。调用事件侦听器 - 两种方式之一工作,有什么不同?

function styleTwitter1(pair_array) 
    { 
     var i; 
     var input; 
     var label; 
     var font_size; 

     for (i = 0; i < pair_array.length; i+=2) 
     { 
/* 
*/ 
      input = document.getElementById(pair_array[ i ]); 
      label = document.getElementById(pair_array[ i + 1 ]); 
/* 
*/ 
      label.fontSize = window.getComputedStyle(label, null).getPropertyValue("font-size"); 
/* 
*/ 
      input.addEventListener("keypress", function() 
      { 
       label.style.opacity = 0; 
      }, false); 
/* 
*/ 
      input.addEventListener("focus", function() 
      { 
       if(input.value === '') 
       { 
        label.style.opacity = 0.2; 
        input.style.border = '1px solid #888888'; 
       } 
      } , false); 
/* 
*/ 
      input.addEventListener("blur", function() 
      { 
       if(input.value === '') 
       { 
        label.style.opacity = 1; 
        new EffectsFont(label).fade('up', 150); 
        input.style.border = '1px solid #dddddd'; 
       } 
      } , false); 
/* 
*/ 
     } 
    } 

但是,这样做(元素是从函数外部注入的)。

function initTwitterStyle(input, label) 
    { 
/* 
*/ 
     input.addEventListener("keypress", function() 
     { 
      label.style.opacity = 0; 
     }, false); 
/* 
*/ 
     input.addEventListener("focus", function() 
     { 
      if(input.value === '') 
      { 
       label.style.opacity = 0.2; 
       input.style.border = '1px solid #888888'; 
      } 
     }, false); 
/* 
*/ 
     input.addEventListener("blur", function() 
     { 
      if(input.value === '') 
      { 
       label.style.opacity = 1; 
       new EffectsFont(label).fade('up', 150); 
       input.style.border = '1px solid #dddddd'; 
      } 

     }, false); 
/* 
*/ 
    } 

我最终会做,如果我不能想出不同的是外面拉我的阵列循环,只是与元素注入twitterStyle2。

目前,我不能得到一个错误代码,但只有一对正在初始化..然后EffectsFont不起作用。

Jshint警告不要在循环中创建函数,但我不明白为什么?什么是问题?

+0

定义“不工作”,做他们没有工作,或做他们所有的行为,比如说,在最后一对数组? –

+0

你可以发布你用来调用这些函数的HTML吗?否则很难猜测你传递给函数的参数。 –

+0

需要知道第一个示例中实际上是什么'pair_array'。 –

回答

0

我称之为冻结一个闭包变量,基本上是通过使用自调用函数创建一个不共享的新闭包。

var divs = [...]; 
for (var i=0; i < 10; i++) { 
    // Here's the self calling function 
    div.onclick = (function(i){ 
    return function() { 
     console.log("Clicked div with index" + i); 
    } 
    })(i);// Passing the variable to the self calling function creating a new closure 
} 

我的首选方式,但是,就是用https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

var divs = [...]; 
for (var i=0; i < 10; i++) { 
    div.onclick = (function(i) { 
     console.log("Clicked div with index" + i + "and id" + this.id); 
    } 
    }).bind(div, i); 
} 
+1

** - 1 ** - 该代码将div.onclick设置为'undefined' ... – Eric

+0

我认为'.bind(div,i)'会更好... –

+0

@FelixKling同意 –

2

您有关闭问题。处理程序在变量label上关闭。但是,当循环完成时,label将是最后一个元素 - 所有处理程序将把它们视为最后一个元素。

+0

我刚刚注意到...我该如何修复它? –

+3

SO –

+0

@ CS_2013每天都会出现此问题:使用第二个示例中的功能 – Eric

相关问题