jQuery
присоединять
Поиск…
Синтаксис
- $ (Селектор) .append (содержание)
- $ (Содержание) .appendTo (селектор)
параметры
параметры | подробности |
---|---|
содержание | Возможные типы: Элемент, HTML-строка, текст, массив, объект или даже функция, возвращающая строку. |
замечания
.append () & .after () может потенциально выполнить код. Это может произойти путем ввода тегов скрипта или использования атрибутов HTML, которые выполняют код (например,). Не используйте эти методы для вставки строк, полученных из ненадежных источников, таких как параметры запроса URL, файлы cookie или входные данные формы. Это может привести к уязвимостям межсайтового скриптинга (XSS). Удалите или удалите любой пользовательский ввод, прежде чем добавлять контент в документ.
jQuery официально не поддерживает SVG. Использование методов jQuery в SVG
документы, если они явно не документированы для этого метода, могут привести к неожиданному поведению. Примеры методов, поддерживающих SVG, начиная с
jQuery 3.0 - это addClass и removeClass.
Добавление элемента в контейнер
Решение 1:
$('#parent').append($('#child'));
Решение 2:
$('#child').appendTo($('#parent'));
Оба решения добавляют элемент #child
(добавление в конце) к элементу #parent
.
До:
<div id="parent">
<span>other content</span>
</div>
<div id="child">
</div>
После:
<div id="parent">
<span>other content</span>
<div id="child">
</div>
</div>
Примечание. Когда вы добавляете контент, который уже существует в документе, это содержимое будет удалено из исходного родительского контейнера и добавлено в новый родительский контейнер. Таким образом, вы не можете использовать .append()
или .appendTo()
для клонирования элемента. Если вам нужен клон, используйте .clone()
-> [ http://api.jquery.com/clone/][1]
Эффективное последовательное использование .append ()
Начинающийся:
HTML
<table id='my-table' width='960' height='500'></table>
JS
var data = [
{ type: "Name", content: "John Doe" },
{ type: "Birthdate", content: "01/01/1970" },
{ type: "Salary", content: "$40,000,000" },
// ...300 more rows...
{ type: "Favorite Flavour", content: "Sour" }
];
Добавление внутри цикла
Вы получили большой массив данных. Теперь пришло время пройти и отобразить его на странице.
Ваша первая мысль может состоять в том, чтобы сделать что-то вроде этого:
var i; // <- the current item number
var count = data.length; // <- the total
var row; // <- for holding a reference to our row object
// Loop over the array
for ( i = 0; i < count; ++i ) {
row = data[ i ];
// Put the whole row into your table
$('#my-table').append(
$('<tr></tr>').append(
$('<td></td>').html(row.type),
$('<td></td>').html(row.content)
)
);
}
Это совершенно верно и сделает то, что вы ожидаете, но ...
Не делайте этого.
Помните эти 300 + строк данных?
Каждый из них заставит браузер повторно рассчитать значения ширины, высоты и позиционирования каждого элемента вместе с любыми другими стилями - если они не разделены границей макета , которые, к сожалению, для этого примера (поскольку они являются потомками элемента <table>
), они не могут.
В небольших количествах и в нескольких столбцах этот штраф за исполнение, безусловно, будет незначительным. Но мы хотим, чтобы каждая миллисекунда считалась.
Лучшие варианты
Добавьте в отдельный массив, добавьте после завершения цикла
/**
* Repeated DOM traversal (following the tree of elements down until you reach
* what you're looking for - like our <table>) should also be avoided wherever possible.
*/
// Keep the table cached in a variable then use it until you think it's been removed
var $myTable = $('#my-table');
// To hold our new <tr> jQuery objects
var rowElements = [];
var count = data.length;
var i;
var row;
// Loop over the array
for ( i = 0; i < count; ++i ) {
rowElements.push(
$('<tr></tr>').append(
$('<td></td>').html(row.type),
$('<td></td>').html(row.content)
)
);
}
// Finally, insert ALL rows at once
$myTable.append(rowElements);
Из этих опций этот больше всего зависит от jQuery.
Использование современных методов Array. *
var $myTable = $('#my-table');
// Looping with the .map() method
// - This will give us a brand new array based on the result of our callback function
var rowElements = data.map(function ( row ) {
// Create a row
var $row = $('<tr></tr>');
// Create the columns
var $type = $('<td></td>').html(row.type);
var $content = $('<td></td>').html(row.content);
// Add the columns to the row
$row.append($type, $content);
// Add to the newly-generated array
return $row;
});
// Finally, put ALL of the rows into your table
$myTable.append(rowElements);
Функционально эквивалентный тому, который был до него, только легче читать.
Использование строк HTML (вместо встроенных методов jQuery)
// ...
var rowElements = data.map(function ( row ) {
var rowHTML = '<tr><td>';
rowHTML += row.type;
rowHTML += '</td><td>';
rowHTML += row.content;
rowHTML += '</td></tr>';
return rowHTML;
});
// Using .join('') here combines all the separate strings into one
$myTable.append(rowElements.join(''));
Отлично, но снова, не рекомендуется . Это заставляет jQuery анализировать очень большой объем текста одновременно и не требуется. jQuery очень хорош в том, что он делает при правильном использовании.
Вручную создавать элементы, добавлять к фрагменту документа
var $myTable = $(document.getElementById('my-table'));
/**
* Create a document fragment to hold our columns
* - after appending this to each row, it empties itself
* so we can re-use it in the next iteration.
*/
var colFragment = document.createDocumentFragment();
/**
* Loop over the array using .reduce() this time.
* We get a nice, tidy output without any side-effects.
* - In this example, the result will be a
* document fragment holding all the <tr> elements.
*/
var rowFragment = data.reduce(function ( fragment, row ) {
// Create a row
var rowEl = document.createElement('tr');
// Create the columns and the inner text nodes
var typeEl = document.createElement('td');
var typeText = document.createTextNode(row.type);
typeEl.appendChild(typeText);
var contentEl = document.createElement('td');
var contentText = document.createTextNode(row.content);
contentEl.appendChild(contentText);
// Add the columns to the column fragment
// - this would be useful if columns were iterated over separately
// but in this example it's just for show and tell.
colFragment.appendChild(typeEl);
colFragment.appendChild(contentEl);
rowEl.appendChild(colFragment);
// Add rowEl to fragment - this acts as a temporary buffer to
// accumulate multiple DOM nodes before bulk insertion
fragment.appendChild(rowEl);
return fragment;
}, document.createDocumentFragment());
// Now dump the whole fragment into your table
$myTable.append(rowFragment);
Мой личный фаворит . Это иллюстрирует общее представление о том, что делает jQuery на более низком уровне.
Погружение глубже
- Средство просмотра jQuery
- Array.prototype.join ()
- Array.prototype.map ()
- Array.prototype.reduce ()
- document.createDocumentFragment ()
- document.createTextNode ()
- Основы Google Web - производительность
jQuery append
HTML
<p>This is a nice </p>
<p>I like </p>
<ul>
<li>List item 1</li>
<li>List item 2</li>
<li>List item 3</li>
</ul>
<button id="btn-1">Append text</button>
<button id="btn-2">Append list item</button>
скрипт
$("#btn-1").click(function(){
$("p").append(" <b>Book</b>.");
});
$("#btn-2").click(function(){
$("ul").append("<li>Appended list item</li>");
});
});