#javascript #jquery #html #google-chrome
#javascript #jquery #HTML #google-chrome
Вопрос:
Надеюсь, мой заголовок понятен. У меня есть форма, которая должна учитывать динамическое количество наборов полей ввода. То есть пользователь может добавить новую строку таблицы, содержащую 5 текстовых полей. Я добавляю эти строки с помощью jQuery, беру базовую строку, клонирую ее, очищаю все текстовые значения в клоне и добавляю его в тело таблицы. Сокращенный код приведен ниже:
var num = $('#num').val().replace(/[^0-9]/g, '');
var numAdd = 1; // default, add only 1 new row
if (num.length > 0) {
var baseRow = $('#base'); // this is a tr tag
numAdd = parseInt(num);
if (numAdd >= 1) {
for (var i = 1; i <= numAdd; i ) {
var newRow = $(baseRow).clone();
$(newRow).find('input').val('');
$('#rows').append(newRow); // this is a tbody tag
}
}
}
Я заметил, что чем больше динамических строк я добавляю на страницу, тем больше задержка клавиатуры при вводе в эти поля, но она начинается довольно быстро, примерно с 10 строк (около 50 полей ввода).). Я думал, что это связано с каким-то событием ввода, но я отключил все и вся на странице, проблема сохраняется. Я также тестировал эту страницу в Firefox и Edge, и у них обоих нет проблем, кажется, они изолированы от Chrome.
Существуют ли какие-либо известные причины такого поведения в Chrome, или это скорее проблема с самим браузером?
Редактирование # 1 Добавление полного кода, который я использовал для воспроизведения этой проблемы:
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#add').click(function(){
var num = $('#num').val().replace(/[^0-9]/g, '');
var numAdd = 1;
if (num.length > 0) {
var baseRow = $('#base');
numAdd = parseInt(num);
if (numAdd >= 1) {
for (var i = 1; i <= numAdd; i ) {
var newRow = $(this).closest('tr').clone();
$(newRow).find('.bte').html('<span class="remove">remove</span>');
$(newRow).find('.btn').html('');
$(newRow).find('input').val('');
$('#rows').append(newRow);
}
}
}
});
});
</script>
</head>
<body>
<table id="list">
<thead>
<tr>
<th class="btg">Field 1</th>
<th class="btd">Field 2</th>
<th class="btm">Field 3</th>
<th class="btq">Field 4</th>
<th class="btv">Field 5</th>
<th class="bte"></th>
<th class="btn"></th>
</tr>
</thead>
<tbody id="rows">
<tr>
<td>
<input type="text" value="1" readonly="readonly" style="width:60px;">
</td>
<td>
<input type="text" value="" style="width:300px;">
</td>
<td>
<input type="text" value="" style="width:60px;">
</td>
<td>
<input type="text" value="" style="width:60px;">
</td>
<td>
<input type="text" value="" style="width:60px;">
</td>
<td class="bte">
<span id="add">add</span>
</td>
<td class="btn">
<input type="text" id="num" value="" maxlength="2" placeholder="num rows to add">
</td>
</tr>
</tbody>
</table>
</body>
</html>
При добавлении в 35 строк и начале ввода в одном я замечаю задержку, однако она кажется менее серьезной, в некоторых случаях почти не существует. Если у меня открыто другое окно Chrome с включением воспроизведения музыки, проблема становится намного более серьезной. Проблема продолжается и после закрытия этого окна. Трудно понять, связаны ли они.
Кроме того, если я просто создам эту страницу с более чем 35 строками напрямую, а не динамично, никогда не будет задержки клавиатуры.
В Firefox по-прежнему нет этой проблемы, даже если я запускаю несколько вкладок и включаю музыку.
Это странно. Возможно, это больше связано с моей фактической настройкой ноутбука, чем с самим Chrome или их комбинацией. Я собираюсь протестировать это, как только окажусь дома на своем рабочем столе.
Правка # 2 Изменила jQuery для удаленного извлечения, просто чтобы сделать его более переносимым и простым в использовании.
Комментарии:
1. Есть ли на входных данных какие-либо обработчики событий изменения?
2. Не могли бы вы воспроизвести проблему? Я не замечаю никакого замедления с 1000 строками по 5 входов в каждой ( codepen )
3. Никаких событий изменения, и я даже полностью отключил все ключевые события, все еще была проблема. Проблема все еще возникает, но я попытаюсь воспроизвести ее на совершенно новой, простой странице.
4. Отредактировал мой пост. Если ни у кого больше нет этой проблемы, я предполагаю, что это больше связано с машиной, чем с программным обеспечением, или, возможно, с их сочетанием.