問題はあなたのclearCloneValues
機能にあります。クリアしたい要素のボタンとその他を区別しません。
次のように変更します。
// Sets an element's value to ''
function clearCloneValues(element){
if (element.attr('value') !== undefined && element.attr('type') !== 'button'){
element.val('');
}
}
上記のコメントで @PHPglue が指摘したように、新しいポジションが追加されると、新しくクローンされたものに誤って複製されます (ここでは想定しています)。
年の追加機能にも同様の問題があります。
簡単な修正は、元のフォーム フィールドのクローンを使用して変数を初期化することです。
var $template = $('div.kpSports').first().clone();
次に、addSport
ハンドラーを次のように変更します。
$('#addSport').click(function () {
//increment the value of our counter
$('#kpSport').val(Number($('#kpSport').val()) + 1);
//clone the first .item element
var newItem = $template.clone();
…
});
ただし、新しいボタンにはイベント バインディングがないため、フォーム要素の新しいセットにはまだ機能がありません。
デモフィドル
シンプルで素朴な文字列ベースのテンプレートを使用しても、コードを大幅に簡素化できます。Linked は、このアプローチを使用してどのように実行できるかを示すテストされていないフィドルです。
デモフィドル
コードは次のように簡略化されました。
function getClone(idx) {
var $retVal = $(templates.sport.replace(/\{\{1\}\}/g, idx));
$retVal.find('.jsPositions').append(getItemClone(idx, 0));
$retVal.find('.advtrain').append(getTrainingClone(idx, 0));
return $retVal;
}
function getItemClone(setIdx, itemIdx) {
var retVal = itemTemplate.replace(/\{\{1\}\}/g, setIdx).replace(/\{\{2\}\}/g, itemIdx);
return $(retVal);
}
function getTrainingClone(setIdx, trainingIdx) {
var retVal = trainingTemplate.replace(/\{\{1\}\}/g, setIdx).replace(/\{\{2\}\}/g, trainingIdx);
return $(retVal);
}
$('#kpSportPlayed').on('click', '.jsAddPosition', function() {
var $container = $(this).closest('.kpSports');
var containerIdx = $container.attr('data_idx');
var itemIdx = $container.find('.item').length;
$container.find('.jsPositions').append(getItemClone(containerIdx, itemIdx));
});
$('#kpSportPlayed').on('click', '.jsAddTraining', function() {
var $container = $(this).closest('.kpSports');
var containerIdx = $container.attr('data_idx');
var trainIdx = $container.find('.advtrain > div').length;
$container.find('.advtrain').append(getTrainingClone(containerIdx, trainIdx));
});
$('#addSport').click(function () {
var idx = $('.kpSports').length;
var newItem = getClone(idx);
newItem.appendTo($('#kpSportPlayed'));
});