A <button>
без указания свойства type = по умолчанию является кнопкой типа submit. Вот почему вы часто будете видеть странно выглядящий <button type="button">
. Вероятно, именно поэтому ваша страница обновляется, хотя вы обычно видите такое поведение, когда кнопка находится внутри формы. Возможно, этот тег формы просто не виден в вашем HTML отрывке.
Как упоминал @Rory McCrossan, у вас есть один обработчик событий, предположительно связанный с высокоуровневым элементом в вашем HTML (DOM), и затем внутри него вы используете оператор switch, чтобы определить, что на самом деле было нажато. Если у вас нет веских причин для этого, имеет смысл использовать ie обработчики событий для определенных c элементов, к которым они относятся. То, как у вас это получается, может работать , но вы делаете, но это гораздо менее чисто, более подвержено ошибкам и труднее работать таким образом.
Если бы это был я, я настроил это так для вашей DOM:
<th><button type="button" class="js-add-row">Add Row</button></th>
Тогда в вашем JS:
var rowCount = 1;
$( '.js-add-row' ).on('click', function(){
const template = `<tr class="row-${rowCount}"> ... </tr>`;
$( this ).closest( 'table' ).find( 'tbody' ).append(template);
rowCount++;
});
Очевидно, вы захотите вставить туда весь свой шаблон. Вместо того, чтобы хранить шаблон в JS, вы можете просто клонировать строку, которая там есть, но это работает, только если вы не хотите, чтобы пользователь удалил все строки. Или, иногда, люди будут хранить этот шаблон в DOM, но скрытый, чтобы он не был настоящей строкой. Или как элемент данных на одном из элементов таблицы. Лучшая практика может зависеть от вашего варианта использования.
Часть $( this ).closest( 'table' ).find( 'tbody' )
позволяет использовать его более многократно. Буквально говорится, откуда была нажата эта кнопка, найдите таблицу, в которой она находится, затем возьмите тег tbody. У вас может быть несколько таблиц с собственными кнопками добавления, и это все равно будет работать (в этом случае шаблон должен быть либо одинаковым, либо клонированным из этой первой строки).
Вы можете увидеть преимущество здесь изолировать этот обработчик событий. У вас есть чистая функция для этого. Его легко найти, легко изменить, легко развернуть и скопировать.
Демонстрация: JSFiddle