JQuery Добавление объекта несколько раз

Я не уверен, что именно происходит здесь, я думаю, что переменная является объектом jquery.

Это только один раз добавляется, мой вопрос: почему?

var newInput = $('<input/>');
$('#newDiv').append(newInput);
$('#newDiv').append(newInput);

Хотя это работает так, как я предполагал

var newInput = '<input>';
$('#newDiv').append(newInput);
$('#newDiv').append(newInput);

Благодарим за помощь!

Ответ 1

Когда вы делаете $('<input/>'), jQuery создает для вас input DOM-элемент.

Когда вы .append() элемента DOM, он отсоединяет элемент от своей предыдущей позиции. (См. Скрипку). Из документов:

Если элемент, выбранный таким образом, вставляется в одно место в другом месте DOM, он будет перемещен в цель (не клонирован).

Таким образом, ваш второй .append() удалит его из того места, где он был добавлен первым, и поместит его в новую позицию.

Когда вы добавляете строку, элемент DOM создается так, как он добавляется.

Ответ 2

В первом случае $ проанализирует ваш html и создаст новый объект jQuery, который будет перенесен поверх HTMLInputElement.

В принципе, это нравится делать:

var $newDiv = $('#newDiv'),
    newInput = document.createElement('input');

$newDiv.append(newInput);
$newDiv.append(newInput);

Во втором случае он каждый раз анализирует html, генерируя для каждого экземпляра другой объект jQuery.

Здесь, как можно было бы исправить первый образец:

var newInput = $('<input/>');
$('#newDiv').append(newInput);
$('#newDiv').append(newInput.clone());

Ответ 3

Это связано с тем, что в первом случае это относится к тому же элементу object (добавляет один и тот же элемент, поэтому добавляется к новому месту), а во втором случае вы добавляете html в качестве строки, чтобы он добавлял несколько элементов (новый элемент каждый раз).

Ответ 4

Вы можете добавить несколько элементов, создавая новые элементы несколько раз с помощью цикла:

<!-- begin snippet: js hide: false console: true babel: false -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>