2012-08-16 29 views
0

使用$ .map函數我正在循環一個對象並追加我製作的元素。但我的情況下,我正確地獲取控制檯信息,但最終返回對象只能追加,我的代碼中有什麼問題?

我的代碼:

$('body').append(
$.map(val.fields, function (val, i) { 
    var element; 
    if (val.label) { 
     element = $('<label />', { 
      text: val.label 
     }); 
     console.log(element); //properly consoles 3 lables but not appending why? 
    } 
    if (val.type) { 
     element = val.type === 'text' || val.type === 'submit' ? $('<input />', { 
      type: val.type, 
      name: val.name, 
      value: val.value, 
      id: val.vlaue 
     }) : val.type === 'select' ? $('<select />', { 
      name: val.name 
     }) : ''; 
     console.log(element); // properly console 3 element and only this is appending 
    } 

    return element; 
})) 
+0

請您澄清一下「但最終返回的對象只能追加」是什麼意思?你是說你創建多個對象,但只有最後創建的一個被附加? – nnnnnn 2012-08-16 08:48:37

+0

是的。我想追加所有的標籤和輸入元素。但我得到了附加元素的類型 – 3gwebtrain 2012-08-16 08:57:59

回答

2

問題似乎是從調用$.map返回的對象的類型。

如果您改變了地圖調用return element[0](創建而不是被包裝的jQuery對象的實際的DOM元素),那麼它的工作原理:

$('body').append(
    $.map(val.fields, function (val, i) { 
     var element; 
     if (val.label) { 
      element = $('<label />', { 
       text: val.label 
      }); 
      console.log(element); //properly consoles 3 lables but not appending why? 
     } 
     if (val.type) { 
      element = val.type === 'text' || val.type === 'submit' ? $('<input />', { 
       type: val.type, 
       name: val.name, 
       value: val.value, 
       id: val.vlaue 
      }) : val.type === 'select' ? $('<select />', { 
       name: val.name 
      }) : ''; 
      console.log(element); // properly console 3 element and only this is appending 
     } 

     return element[0]; // <----- Added [0] here 
    }) 
) 

示例 - http://jsfiddle.net/nhds6/

這是假設總會出現是一個元素。如果不是這種情況,你可能想添加一些錯誤處理。

+0

你的建議是正確的。現在主體追加3個標籤和1個輸入類型,而不是3個輸入類型... – 3gwebtrain 2012-08-16 09:08:39

+0

但您的代碼是正確的。我同意。 – 3gwebtrain 2012-08-16 09:09:41

0

你傳遞給$.map可以在同一時間,element返回的只有一件事,但在一排你的兩個if語句你可能嘗試創建兩件事情的回調函數 - 但是如果您確實創建了兩個元素,則只有第二個元素以您返回的element變量結束。

如果val.labelval.type均設置和val.label應優先考慮再更改第二ifelse if

如果您需要同時創建兩個,那麼$.map可能不是最好的方法。

1

您可能誤解了地圖的作用。

$ .map()方法將函數應用於數組或對象中的每個項目,並將結果映射到新數組中。

你可能需要考慮增加一個jQuery集合:

var collection = $(); 


$.map(val.fields, function (val,i) { 
    var element; 
    if(val.label){ 
     element = $('<label />',{text:val.label}); 
     collection.add(element); 
    } 
    if(val.type) { 
     element = val.type === 'text' || val.type === 'submit' ? $('<input />',{ 
      type:val.type, 
      name:val.name, 
      value:val.value, 
      id:val.vlaue 
     }) : 
     val.type === 'select' ? $('<select />',{name:val.name}) : ''; 
     collection.add(element); 
    } 
}); 

$('body').append(collection); 

的主要區別user338128的答案是,你並不需要多個循環。

+0

如果你不使用'$ .map()'的返回值,那麼它可能就是'$ .each()'。我建議將'collection.add(element)'移動到_both_'if if塊的末尾,因爲這兩個塊都可以創建元素... – nnnnnn 2012-08-16 09:08:03

+0

好點。 'collection.add()'在if語句之後,所以元素總是被添加。無需再寫兩遍。 – 2012-08-16 09:24:28

+0

我的意思是,如果'val.label'和'val.type'屬性都在同一個迭代__上設置,第一個'if'會創建一個元素,然後第二個'if'會創建一個元素 - 但只有第二個實際上會被添加到集合中。 (也許這對於OP所使用的數據來說永遠不會發生,但是因爲我們還沒有顯示出這些數據......) – nnnnnn 2012-08-16 09:48:18