フィールドセットのクローンを作成して同じ親に追加するには:
var fieldset = $("#question1"); // Get the fieldset
var clone = fieldset.clone(); // Clone it
clone.attr("id", "question2"); // Set its ID to "question2"
clone.appendTo(fieldset.parent()); // Add to the parent
同じIDを持つ2つの要素を持つことはできないため、ツリーに追加する前にIDを変更していることに注意してください。
その中の要素を処理するには、.children()
またはセレクターを使用.find()
してclone
変数を使用し、必要な子/子孫を選択します(親にクローンを追加した後)。たとえばid
、入力のをクリーンアップするには、次のようにします。
clone.find('input').each(function() {
if (this.id) {
// It has an ID, which means the original had an ID, which
// means your DOM tree is temporarily invalid; fix the ID
this.id = /* ...derive a new, unique ID here... */;
}
});
each
コールバック内では、jQueryインスタンスでthis
はなく、生の要素であることに注意してください。(したがって、私の設定はthis.id
直接です。)要素のjQueryインスタンスを取得したい場合は、取得してから代わりvar $this = $(this);
に使用$this.attr("id", ...)
します。ただし、IDを変更する以外のことをしない限り、特に必要はありません。
IDの番号の付け直しに関する質問に答えるには、入力要素の実際のIDだけでなく、それらのIDを使用しているものもすべて更新する必要があります。
ただし、入力要素の更新を行うという点では、数値を読み取り、使用されていない数値が得られるまで数値をインクリメントすることで、更新を行うことができます。
clone.find('input').each(function() {
var id;
if (this.id) {
id = this.id;
do {
id = id.replace(/[0-9]+$/g, function(num) {
return String(Number(num) + 1);
});
}
while ($("#" + id).length > 0);
this.id = id;
}
});
...元のIDが「input_radio1」の場合は「input_radio2」になりますが、代わりに別の命名規則を使用すると思います。たとえば、さまざまな入力IDの前に質問のIDを付けることができます。
<fieldset id='question1'>
...
<input id=-'question1:input_radio1' />
</fieldset>
...次に、複製されたIDの「question1」を「question2」に置き換えます。(コロン[ :
]はIDで完全に有効です。)
ただし、すべての入力にIDを設定することを回避できる場合は、それが最善の方法です。たとえば、マークアップが別の理由でそれを妨げない限り、:を使用するのではなく、を経由して封じ込めinput
に関連付けることができます。label
for
<label>First name: <input type='text' ... /></label>
たくさんのオプション。:-)