Jaka jest najszybsza metoda wybierania elementów potomnych w jQuery?
Z tego, co wiem, Istnieje wiele sposobów wybierania elementów potomnych w jQuery .
//Store parent in a variable
var $parent = $("#parent");
Metoda 1 (za pomocą zakresu)
$(".child", $parent).show();
Metoda 2 (metoda find ())
$parent.find(".child").show();
Metoda 3 (tylko dla dzieci)
$parent.children(".child").show();
Metoda 4 (poprzez selektor CSS) - sugerowany przez @ spinon
$("#parent > .child").show();
Metoda 5 (identyczna z metodą 2) - według @Kai
$("#parent .child").show();
Nie jestem zaznajomiony z profilowaniem, by móc zbadać to na własną rękę, więc chciałbym zobaczyć, co masz do powiedzenia.
P. S. rozumiem, że jest to możliwy duplikat tego pytania , ale nie obejmuje wszystkich metod.
3 answers
Metoda 1 i Metoda 2 są identyczne z tą jedyną różnicą, że Metoda 1 musi przeanalizować przekazany zakres i przetłumaczyć go na wywołanie $parent.find(".child").show();
.
Metoda 4 I Metoda 5 muszą przeanalizować selektor, a następnie wywołać odpowiednio: $('#parent').children().filter('.child')
i $('#parent').filter('.child')
.
Więc Metoda 3 zawsze będzie najszybsza, ponieważ musi wykonać jak najmniej pracy i użyć najbardziej bezpośredniej metody, aby uzyskać pierwszy poziom dzieci.
Na podstawie poprawionych testów prędkości Anurag tutaj: http://jsfiddle.net/QLV9y/1/
Speed test: (More is Better)
Na Chrome, Metoda 3 jest najlepsza potem metoda 1/2 a potem 4/5
Alt text http://tinyurl.com/2clyrbz
Na Firefox Metoda 3 jest nadal najlepsza potem metoda 1/2 a potem 4/5
Alt text http://tinyurl.com/2e89tp5
Na Opera Metoda 3 jest nadal najlepsza wtedy metoda 4/5 a następnie 1/2
Alt text http://tinyurl.com/2a9r9r8
Na IE 8, choć ogólnie wolniej niż w innych przeglądarkach, nadal stosuje metodę 3, 1,2,4,5.
Alt text http://tinyurl.com/2a8ag59
Ogólnie Rzecz Biorąc, Metoda 3 jest ogólnie najlepszą metodą do użycia, ponieważ jest wywoływana bezpośrednio i nie musi przekraczać więcej niż jednego poziomu elementów potomnych w przeciwieństwie do metody 1/2 i nie musi być analizowana jak metoda 4/5
Należy jednak pamiętać, że w niektórych z nich porównujemy jabłka do pomarańczy, ponieważ metoda 5 patrzy na wszystkie dzieci zamiast na dzieci pierwszego poziomu.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-05 15:38:03
Metoda 1
Nie może być krótszy i szybszy przy użyciu jQuery. To połączenie bezpośrednio sprowadza się do$(context).find(selector)
(Metoda 2 , ze względu na optymalizację), która z kolei wywołuje getElementById
.
Metoda 2
Robi to samo, ale bez niepotrzebnych wewnętrznych wywołań funkcji.
Metoda 3
Użycie children()
jest szybsze niż użycie find()
, ale oczywiście children()
znajdzie tylko bezpośrednie dzieci elementu głównego, podczas gdy find()
będzie wszystkie elementy potomne(w tym elementy podrzędne) są rekurencyjnie przeszukiwane od góry do dołu]}
Metoda 4
Używanie selektorów w ten sposób musi być wolniejsze. Ponieważ sizzle
(który jest silnikiem selektora z jQuery) działa od prawej do lewej , najpierw dopasuje wszystkie klasy .child
, zanim sprawdzi, czy są bezpośrednio potomkami z id 'parent'.
Metoda 5
Jak podałeś poprawnie, to wywołanie utworzy również $(context).find(selector)
wywołanie, ze względu na pewną optymalizację w ramach funkcji jQuery
, w przeciwnym razie może również przejść przez (wolniejszy) sizzle engine
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-15 04:37:33
Jak to jest stary post, a rzeczy zmieniają się z czasem. Zrobiłem kilka testów na ostatnich wersjach przeglądarki do tej pory, i zamieszczam go tutaj, aby uniknąć nieporozumień.
Używając jQuery 2.1 w przeglądarkach zgodnych z HTML5 i CSS3 Wydajność się zmienia.
Oto scenariusz i wyniki testu:
function doTest(selectorCallback) {
var iterations = 100000;
// Record the starting time, in UTC milliseconds.
var start = new Date().getTime();
for (var i = 0; i < iterations; i++) {
// Execute the selector. The result does not need to be used or assigned
selectorCallback();
}
// Determine how many milliseconds elapsed and return
return new Date().getTime() - start;
}
function start() {
jQuery('#stats').html('Testing...');
var results = '';
results += "$('#parent .child'): " + doTest(function() { jQuery('#parent .child'); }) + "ms";
results += "<br/>$('#parent > .child'): " + doTest(function() { jQuery('#parent > .child'); }) + "ms";
results += "<br/>$('#parent').children('.child'): " + doTest(function() { jQuery('#parent').children('.child'); }) + "ms";
results += "<br/>$('#parent').find('.child'): " + doTest(function() { jQuery('#parent').find('.child'); }) + "ms";
$parent = jQuery('#parent');
results += "<br/>$parent.find('.child'): " + doTest(function() { $parent.find('.child'); }) + "ms";
jQuery('#stats').html(results);
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=7, IE=8, IE=9, chrome=1" />
<title>HTML5 test</title>
<script src="//code.jquery.com/jquery-2.1.1.js"></script>
</head>
<body>
<div id="stats"></div>
<button onclick="start()">Test</button>
<div>
<div id="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
</html>
więc za 100 000 iteracji dostaję:
(dodałem je jako img do formatowania cele.)
Możesz sam uruchomić fragment kodu do przetestowania;)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-19 02:24:27