#javascript #jquery #html
#javascript #jquery #HTML
Вопрос:
У меня есть одна таблица. Когда я фокусируюсь на последнем элементе строки, я хочу скопировать последнюю строку таблицы и добавить ее в последнюю позицию. Это я могу сделать в соответствии с моим кодом.
Теперь эта новая строка станет моей последней строкой. После этого я не могу генерировать строку при нажатии на ее элемент. Фактически он генерирует строку при нажатии на предыдущую строку (которая является последней ранее).
Как я могу этого добиться?
$('.ankita').focus(function(){
var $tr = $(this).closest('.trbar');
var $clone = $tr.clone();
$clone.find(':text').val('');
$tr.after($clone);
$(this).removeClass("ankita");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<table id='tbl'>
<tbody>
<tr>
<td>
<p>Cell1</p>
</td>
<td>
<p>Cell2</p>
</td>
</tr>
<tr class="trbar">
<td>
<p>Cell3</p>
</td>
<td>
<input id="" class="ankita" type="text" />
</td>
</tr>
</tbody>
</table>
Ответ №1:
Вам просто нужно создать прослушиватель событий делегирования, который будет реагировать только на события фокусировки из последней строки.
$('#tbl').on('focus', 'tr:last .ankita', function(){
var $tr = $(this).closest('.trbar');
var $clone = $tr.clone();
$clone.find(':text').val('');
$tr.after($clone);
$(this).removeClass("ankita");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<table id='tbl'>
<tbody>
<tr>
<td>
<p>Cell1</p>
</td>
<td>
<p>Cell2</p>
</td>
</tr>
<tr class="trbar">
<td>
<p>Cell3</p>
</td>
<td>
<input id="" class="ankita" type="text" />
</td>
</tr>
</tbody>
</table>
Комментарии:
1. нам не нужно удалять class, если мы используем способ делегирования, потому что мы делегируем last tr всегда
2. @SandeepSaroha верно, это просто оставшаяся логика из исходного фрагмента, доступного для запуска операционной системы.
Ответ №2:
Анкита, тебе просто не хватает параметра метода clone
var $clone = $tr.clone(true);
этот параметр указывает, что обработчики событий в clone obj также будут скопированы.
$('#tbl').on('focus', 'tr:last .ankita', function(){
var $tr = $(this).closest('.trbar');
var $clone = $tr.clone(true);
$clone.find(':text').val('');
$tr.after($clone);
$(this).removeClass("ankita");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<table id='tbl'>
<tbody>
<tr>
<td>
<p>Cell1</p>
</td>
<td>
<p>Cell2</p>
</td>
</tr>
<tr class="trbar">
<td>
<p>Cell3</p>
</td>
<td>
<input id="" class="ankita" type="text" />
</td>
</tr>
</tbody>
</table>
Комментарии:
1. Учитывая, что прослушиватель событий находится в таблице, какие события клонируются?
2. @taplar, в исходном коде в таблице нет прослушивателя. Прослушиватель находится на входе, который является частью clone obj.
3. Верно, но мое решение и ваше решение имеют это в таблице. Таким образом, хотя clone (true) выполняет то, что вы говорите, это необязательно
4. @taplar, сказанное верно для объекта-клона, и таблица не была частью объекта-клона 🙂 Я также добавил контекст в ответ
5. Ваш ответ также использует делегирование. В tr добавлено изменение clone (true), которое будет клонировать обработчики событий в tr, которые вообще не указаны в исходном вопросе как существующие.