Почему jQuery.after() не связывает новый элемент?
Мне любопытно, почему jQuery.after() не связывает или не предоставляет вам новый элемент, который вы создаете с ним. Мне кажется, что это нужно, но я не эксперт и надеялся, что кто-то может пролить свет на то, почему это плохая идея. Вот пример, чтобы увидеть, что я хотел бы от .after():
Вот несколько разметки:
<div id="content1">
<p id="hello1">Hello</p>
</div>
<div id="content2">
<p id="hello2">Hello</p>
</div>
Здесь я хочу, но это заменяет "Hello" на "World!":
$('#hello1').after('<p />').text('World!');
Это выполняет эту работу, но это обязательно уродливо:
$('#hello2').after('<p />');
var $newParagraph = $('#content2 p').last();
$newParagraph.text('World');
Это лучше, но я не полностью продаю: (может быть, я должен быть?)
$('#hello1').after( $('<p />').text('World') );
Обратите внимание, что это, очевидно, упрощенный пример, то есть "<p> World! </p> " не то, что я хочу добавить, моя проблема в мире сложнее, чем это.
Спасибо за любые мысли.
Ответы
Ответ 1
Предположительно .after()
работает так, как позволяет вам цепочки других методов, которые будут применяться к изначально выбранным элементам:
$('#hello1').after( $('<p />').text('World') )
.before( $('<p />').text('Before text') )
.remove();
Это совместимо с другими методами, поэтому вам не нужно пытаться запомнить, какие из них возвращают исходный объект и который возвращает какой-либо другой объект.
Обратите внимание, что в вашем случае $('#hello1')
выбирает ровно один элемент, поскольку вы выбираете по id, но вы можете применить .after()
к объекту jQuery, содержащему много элементов для добавления (клонированного) содержимого после нескольких элементов:
$('div.someclass').after( $('<p/>').text('whatever') );
В этом случае, на мой взгляд, определенно имеет смысл сохранить контекст цепочки как оригинальный объект jQuery.
Метод .insertAfter()
может быть ближе к тому, что вы хотите:
$('<p/>').insertAfter('#hello1').text('World');
(Он также возвращает объект jQuery, к которому он был применен, но вставляет его в "reverse".)
Вы можете написать свой собственный метод плагина, чтобы вернуть добавляемый элемент, но это будет запутать, поскольку оно будет работать против всех стандартных методов.
Ответ 2
Вот как это делается для большинства методов jQuery. Лучше для jQuery быть последовательным и возвращать исходный объект.
Исправление:
$('#hello1').after(
$('<p/>', { text: 'World!' })
);
или
$('#hello1').after(
$('<p/>').text('World!')
);
или даже:
$('<p/>').text('World!').insertAfter('#hello1');
Последний может быть действительно предпочтительным, поскольку он затем продолжает цепочку из нового элемента <p>
.
Ответ 3
Он не предоставляет вам созданный элемент, потому что вы не всегда создаете элемент, для JQuery потребуется значительная вычислительная мощность, чтобы обнаружить, что элемент создан, и имеет смысл иметь больше смысла он возвращает элемент, который был объектом операции.