2011-03-14 93 views
6

請看下面的表格:克隆形式和增量ID

<form> 
    <input type="button" value="Input Button"/> 
    <input type="checkbox" /> 

    <input type="file" id="file"/> 
    <input type="hidden" id="hidden"/> 
    <input type="image" id="image" /> 

    <input type="password" id="password" /> 
    <input type="radio" id="radio" /> 
    <input type="reset" id="reset" /> 
</form> 

利用的Javascript(和jQuery),這將是對中克隆整個窗體和增加每個人的ID,以確保唯一性的最簡單方法。

使用jQuery我會假設你會首先通過clone()克隆形式,並通過重複克隆的對象id和添加新的ID fieldname1fieldname2等。但是,我的jQuery的知識不是太大,這個項目幾乎是殺了我。

任何幫助將是偉大的!

+1

爲什麼你需要的ID? – nickf 2011-03-14 11:22:41

+1

@nickf:我需要將多個表單中的多個值作爲輸出的一部分進行組合和混合。我認爲ID是獲取這些值的最佳方式。 – 2011-03-14 11:28:28

+0

此外,通過'id'屬性IMO將'label'元素與'input'元素鏈接起來要容易得多。 – alex 2011-03-14 11:38:47

回答

13

你會clone()它,並且在將克隆的元素附加到DOM之前,你會運行並將該數字添加到每個id屬性。

(function() { 
    var count = 0; 

    window.duplicateForm = function() 

     var source = $('form:first'), 
      clone = source.clone(); 

     clone.find(':input').attr('id', function(i, val) { 
      return val + count; 
     }); 

     clone.appendTo('body'); 

     count++; 
    }; 

})(); 

jsFiddle

這一個從0開始,但你可以很容易地開始count1

你也可以使用一個closure,如果你想要的,即

var cloneForm = function(form, start) { 
    start = start || 0; 

    return function() { 
     var clone = form.clone(); 

     clone.find(':input').attr('id', function(i, val) { 
      return val + start; 
     }); 
     start++; 

     return clone; 
    }; 
}; 

然後你會怎麼做?

var cloneContactForm = cloneForm($('#contact-form'), 5); 

// Now I want to clone it and put it somewhere. 
$(cloneContactForm()).appendTo('body'); 

jsFiddle

+2

+1非常整潔的解決方案。 – karim79 2011-03-14 11:28:32

+0

是否有理由不使用:var clone = $('form:first')。clone();而不是創建源變量? – 2011-03-14 11:29:17

+0

@Steve該變量是不必要的,我只是認爲我會使用它,所以選擇器會更明顯。 – alex 2011-03-14 11:32:21

1

這裏有一個解決方案,而無需更新任何標識:

  1. 給所有形式相同class
  2. 給所有領域name
  3. 指相對於所有帶班形式克隆的形式
  4. 請參考字段

示例: 如何爲每個克隆表單分配一個不同的ID,然後使用每個輸入元素的name

<form class="theForm"> 
    <input type="password" name="password" /> 
</form> 

然後用

container.append($('.theForm:first').clone()); 

克隆它(或緩存在可變的第一種形式)。

最後,進入輸入的字段:

$('form.theForm:eq(0) [name=password]') // password from first form 
$('form.theForm:eq(1) [name=password]') // password from second form 
... 

如果選擇查找的效率是這裏的因素則有幾個微不足道的方式來加速這一過程,比如用不同形式的緩存變量,緩存$('.theForm')並使用eq()等方法

樣品的jsfiddle是在這裏:http://jsfiddle.net/orip/dX4sY

+0

+1用於提供ID濫用的替代 – 2011-03-14 13:18:00

+2

@ÁlvaroG.Vicario'id'屬性需要將標籤與它們的輸入連接起來(不要將輸入作爲標籤的後代)。 – alex 2014-11-13 00:02:24

+0

@alex - 有趣的評論,考慮到問題中的代碼不具有單個標籤:) – 2014-11-13 09:29:58