これは実際には、私が思っていたよりも難しい質問です。どうやら SELECT 要素のセットを複製すると、表示されていないものに変更することはできません。何が起こっているのかを正確に把握するのに約 1 時間ほどかかりました。良い挑戦です。ありがとう!
私がやったことは、テンプレートのクローンを作成し、値を手動で変更し、「変更」イベントを手動で呼び出して、2 次および 3 次の SELECT 要素で正しいオプションを使用できるようにすることです。
バージョン 1: http://jsfiddle.net/m4JTQ/2/
バージョン 2 (これはiイテレータを削除した修正バージョンです: http://jsfiddle.net/Zf7xb/1/
jsfiddle が最終的になくなる場合のコードを次に示します。
// Version 1
$(function() {
// Iterator for the dupe ids
var i = 0;
$('#clone').click(function() {
// put the clone() into cloned
var cloned = $('#template').clone();
// Add .dupe class to cloned
$(cloned).addClass('dupe');
// Set the id of cloned, use i++ instead of incrementing it elsewhere.
$(cloned).attr('id', 'duplicate'+ i++);
// Append cloned to #filter
$(cloned).appendTo('#filter');
// Passing selector rather than iteration
chainItWithId($(cloned));
// If this is NOT the first addition, do some kludge
if ($('#filter div.dupe').length!==1) {
// Set the previous clone to lastClone
var lastClone = $(cloned).siblings('div.dupe:last');
// Set the value of .pais to the value of the previous .pais
$(cloned).find('.pais').val($(lastClone).find('.pais').val());
// Do the "change" event manually.
$(cloned).find('.pais').change();
// Set the value of .provincia to the value of the previous .provincia
$(cloned).find('.provincia').val($(lastClone).find('.provincia').val());
// Do the "change" event manually
$(cloned).find('.provincia').change();
// Set the value of .ciudad to the value of the previous .cudad
$(cloned).find('.ciudad').val($(lastClone).find('.ciudad').val());
}
// Show the hidden div
$('#filter div:hidden').show();
});
$('#remove').click(function() {
// Remove all but the very last set of options
if ($('#filter > div').length > 1) {
$('#filter > div').last().remove();
}
});
// Manually do the "click" event
$('#clone').click();
});
// Here I'm getting the cloned full selector
function chainItWithId(cloned) {
// Chain .provincia to .pais in the current clone
$(cloned).find('.provincia').chained($(cloned).find('.pais'));
// Chain .ciudad to .provincia in the current clone
$(cloned).find('.ciudad').chained($(cloned).find('.provincia'));
}
このバージョンのiイテレータはありません。少しすっきりしています。
// Version 2
$(function() {
$('#clone').click(function() {
// put the clone() into cloned
var cloned = $('#template').clone();
// Add .dupe class to cloned
$(cloned).addClass('dupe');
// Set the id to the count of div.dupe elements in #filter
// This will increment 0,1,2,3 as you add elements.
$(cloned).attr('id', 'duplicate'+ $('#filter div.dupe').length);
// Append cloned to #filter
$(cloned).appendTo('#filter');
// Passing selector rather than iteration
chainItWithId($(cloned));
// If this is NOT the first addition, do some kludge
if ($('#filter div.dupe').length!==1) {
// Set the previous clone to lastClone
var lastClone = $(cloned).siblings('div.dupe:last');
// Set the value of .pais to the value of the previous .pais
$(cloned).find('.pais').val($(lastClone).find('.pais').val());
// Do the "change" event manually.
$(cloned).find('.pais').change();
// Set the value of .provincia to the value of the previous .provincia
$(cloned).find('.provincia').val($(lastClone).find('.provincia').val());
// Do the "change" event manually
$(cloned).find('.provincia').change();
// Set the value of .ciudad to the value of the previous .cudad
$(cloned).find('.ciudad').val($(lastClone).find('.ciudad').val());
}
// Show the hidden div
$('#filter div:hidden').show();
});
$('#remove').click(function() {
// Remove all but the very last set of options
if ($('#filter > div').length > 1) {
$('#filter > div').last().remove();
}
});
// Manually do the "click" event
$('#clone').click();
});
// Here I'm getting the cloned full selector
function chainItWithId(cloned) {
// Chain .provincia to .pais in the current clone
$(cloned).find('.provincia').chained($(cloned).find('.pais'));
// Chain .ciudad to .provincia in the current clone
$(cloned).find('.ciudad').chained($(cloned).find('.provincia'));
}