.replaceWith() не работает в jQuery 1.9+
Я пытаюсь клонировать <textarea>
и клонировать и заменить цифру в метке <label> Number 1 <label>
увеличивается на 1 при каждом нажатии кнопки добавления (поэтому первая метка будет иметь номер 1, метка под номером 2 и т. д.).
Это работает с jQuery 1.8 и ниже, но все, что выше, не клонируется и добавляет 1 к цифре.
HTML
<div>
<label for="number">Number <span class="one">1</span></label>
<textarea id="number"></textarea>
</div>
<button>Add</button>
JQuery
var $row = $('div').clone(),
cloneCount = 2;
$('button').click(function () {
$row.clone().insertBefore($("button"));
$('span').clone().attr('span', cloneCount++).replaceWith($('[class=one]:last')).text(cloneCount - 1);
});
JSFIDDLE: http://jsfiddle.net/wba6jvkj/
2 ответа
Я не знаю, с чем ты пытался .attr('span'
и почему это работает в < 1.8, или почему вы вычитаете одно из cloneCount
, но это должно делать то, что вы хотите:
var $row = $('div').clone(),
cloneCount = 2;
$('button').click(function () {
$row.clone().insertBefore($("button"));
$('span.one:last').text(cloneCount++);
});
(Отвечая на этот старый вопрос, поскольку Google привел меня сюда.)
Поведение.replacewith()
с отключенными узлами было изменено в jQuery1.9. Вы можете найти следующее объяснение в документации replaceWith() (раздел «Дополнительные примечания»), а также в руководстве по обновлению jQuery1.9 :
До jQuery1.9 пытался добавить или изменить узлы в текущем наборе jQuery, если первый узел в наборе не был подключен к документу, и в этих случаях возвращал новый набор jQuery, а не исходный набор. Метод мог вернуть или не вернуть новый результат в зависимости от количества или связности его аргументов! Начиная с jQuery1.9,
.after()
,.before()
и всегда возвращайте исходный неизмененный набор. Попытка использовать эти методы на узле без родителя не имеет никакого эффекта, то есть ни набор, ни содержащиеся в нем узлы не изменяются.
В вашем коде вы используете.replaceWith()
на клонированном элементе, который еще не был вставлен в DOM.