jQuery
Dodać
Szukaj…
Składnia
- $ (selektor) .append (treść)
- $ (content) .appendTo (selektor)
Parametry
Parametry | Detale |
---|---|
zawartość | Możliwe typy: Element, ciąg HTML, tekst, tablica, obiekt, a nawet funkcja zwracająca ciąg. |
Uwagi
.append () i .after () mogą potencjalnie wykonać kod. Może to nastąpić przez wstrzyknięcie znaczników skryptu lub użycie atrybutów HTML wykonujących kod (na przykład). Nie należy używać tych metod do wstawiania ciągów uzyskanych z niezaufanych źródeł, takich jak parametry zapytania URL, pliki cookie lub dane wejściowe formularza. Takie postępowanie może wprowadzić luki w zabezpieczeniach XSS. Usuń lub usuń wszelkie dane wprowadzone przez użytkownika przed dodaniem treści do dokumentu.
jQuery oficjalnie nie obsługuje SVG. Korzystanie z metod jQuery na SVG
dokumenty, chyba że są wyraźnie udokumentowane dla tej metody, mogą powodować nieoczekiwane zachowania. Przykłady metod obsługujących SVG od dnia
jQuery 3.0 to addClass i removeClass.
Dołączanie elementu do kontenera
Rozwiązanie 1:
$('#parent').append($('#child'));
Rozwiązanie 2:
$('#child').appendTo($('#parent'));
Oba rozwiązania #child
element #child
(dodając na końcu) do elementu #parent
.
Przed:
<div id="parent">
<span>other content</span>
</div>
<div id="child">
</div>
Po:
<div id="parent">
<span>other content</span>
<div id="child">
</div>
</div>
Uwaga: Po dodaniu treści, która już istnieje w dokumencie, zawartość ta zostanie usunięta z oryginalnego kontenera nadrzędnego i dołączona do nowego kontenera nadrzędnego. Więc nie możesz użyć .append()
lub .appendTo()
do sklonowania elementu. Jeśli potrzebujesz klon, użyj .clone()
-> [ http://api.jquery.com/clone/][1]
Wydajne kolejne użycie .append ()
Zaczyna się:
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" }
];
Dołączanie w pętli
Właśnie otrzymałeś duży wachlarz danych. Teraz nadszedł czas, aby przejść przez pętlę i wyświetlić ją na stronie.
Twoją pierwszą myślą może być zrobienie czegoś takiego:
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)
)
);
}
Jest to całkowicie poprawne i renderuje dokładnie to, czego można oczekiwać, ale ...
Nie rób tego.
Pamiętasz te ponad 300 wierszy danych?
Każdy z nich zmusi przeglądarkę do ponownego obliczenia wartości szerokości, wysokości i położenia każdego elementu, a także wszelkich innych stylów - chyba że są one oddzielone obwiednią układu , która niestety w tym przykładzie (ponieważ są potomkami elementu <table>
), oni nie mogą.
Przy niewielkich kwotach i kilku kolumnach kara za wyniki będzie z pewnością nieistotna. Ale chcemy, aby każda milisekunda się liczyła.
Lepsze opcje
Dodaj do osobnej tablicy, dołącz po zakończeniu pętli
/**
* 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);
Spośród tych opcji ta opiera się na jQuery najbardziej.
Korzystanie z nowoczesnych metod 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);
Funkcjonalnie równoważny poprzedniej, tylko łatwiejszy do odczytania.
Używanie ciągów HTML (zamiast wbudowanych metod 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(''));
Idealnie ważne, ale znowu nie zalecane . Zmusza to jQuery do parsowania bardzo dużej ilości tekstu na raz i nie jest konieczne. jQuery jest bardzo dobry w tym, co robi, gdy jest używany poprawnie.
Ręcznie twórz elementy, dołącz do fragmentu dokumentu
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);
Mój osobisty faworyt . To ilustruje ogólną koncepcję tego, co robi jQuery na niższym poziomie.
Zanurz się głębiej
- Przeglądarka źródeł jQuery
- Array.prototype.join ()
- Array.prototype.map ()
- Array.prototype.reduce ()
- document.createDocumentFragment ()
- document.createTextNode ()
- Podstawy Google Web - wydajność
Dołącz jQuery
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>
Scenariusz
$("#btn-1").click(function(){
$("p").append(" <b>Book</b>.");
});
$("#btn-2").click(function(){
$("ul").append("<li>Appended list item</li>");
});
});