2013-06-28 48 views
0

我有一個函數定義如下 -的Jquery的foreach通過可變

function populate() { 
     $('input[id^=User]:visible').each(function() { 
      currentVal = this.val; 
      if (this.id == 'User.FirstName') { 
       $('input[id*=FirstName]:visible').each(function (currentVal) { 
        if (this.id.indexOf("User") < 0) 
         this.value = currentVal; 
       }); 
      } 
     }); 
    } 

本質上講,我試圖做的是與User開始我想通過元素的另一個集合來填充循環,並將其分配的每一個元素來自父循環的值。 問題是通過currentval到第二個foreach - 由於某種原因它結束爲0,1,2。

這很明顯,我不明白關於jQuery的一些非常基本的東西,但我無法表達這足以讓谷歌有所幫助,我試過了。 謝謝!

回答

1

$.each需要2個參數第一個是索引,第二個是元素,並且你正在用outerscope覆蓋你的currentVal,其中每個函數內部的每個函數回調作用域中定義爲參數。

function populate() { 
     $('input[id^=User]:visible').each(function() { 
      currentVal = this.value; //<-- Not val it should be value 
      if (this.id == 'User.FirstName') { 
       $('input[id*=FirstName]:visible').each(function() {//<-- and here 
        if (this.id.indexOf("User") < 0) 
         this.value = currentVal; 
       }); 
      } 
     }); 
    } 

簡介與您的代碼EXPN:

function populate() { 
     $('input[id^=User]:visible').each(function() { 
      currentVal = this.val; 
//<-- Ok now this currentVal is available in this scope and for its subsequest each, but wait 
      if (this.id == 'User.FirstName') { 
       $('input[id*=FirstName]:visible').each(function (currentVal) { 
//<-- Now you defined the index argument of second each loop as the same variable name so this variable inside this callback takes a new scope and not the one from its parent each. 
        if (this.id.indexOf("User") < 0) 
         this.value = currentVal; 
       }); 
      } 
     }); 
    } 
1

你需要閱讀的jQuery each()函數的文檔。

回調接收兩個參數,indexvalue,所以currentVal得到0,1,2,因爲你必須用3個條目的陣列(索引0,1和2)

function populate() { 
    $('input[id^=User]:visible').each(function() { 
     currentVal = this.val; 
     if (this.id == 'User.FirstName') { 
      $('input[id*=FirstName]:visible').each(function (idx, val) { 
       if (this.id.indexOf("User") < 0) 
        this.value = currentVal; 
      }); 
     } 
    }); 
}