Pomagam młodym programistom obrać właściwą zawodową drogę
Sprawdź jak ograniczyć ilość event listenerów w JS!
Wprowadzenie
A po co ograniczać ilość event listenerów? Powodów jest kilka:
Szybsze budowanie się UI. Mniej listenerów do podpięcia to po prostu mniej kodu do wykonania. To także często mniej operacji na DOM – aby podpiąć listener do elementu musimy przecież pobrać go np za pomocą querySelector.
Płynniejsza obsługa UI. Mniej listenerów to mniej nasłuchiwania, szczególnie jeśli np w podpinamy bardzo dużo eventów
mouseenter/mouseleave
mouseenter/mouseleave do np tabelki.
W jaki sposób możemy więc ograniczyć ilość listenerów? To zależy od sytuacji, ale jeden ze sposobów może być wykorzystany nader często – mianowicie podpinanie listenerów na rodzicu zamiast na poszczególnych elementach.
W tym artykule porównamy szybkość podpinania listenerów w 2 przypadkach – gdy podepniemy jeden listener to całej tablicy a także gdy podepniemy listener do każdego przycisku w wierszach tablicy. Tablicę wypełnimy tysiącem wierszy z których każdy będzie miał 1 przycisk do usunięcia tego wiersza.
Porównanie sposobów
Szkielet przykładu
Aby mieć szkielet do porównania, potrzebować będziemy 2 przycisków do przełączania się między trybami:
Oraz tabelki która będzie wypełniona wierszami z przyciskiem:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<table>
<captionclass="caption">
Please click one of buttons to attach event listeners
</caption>
<thead>
<tr>
<th>Name</th>
<th>Surname</th>
<th>Actions</th>
</tr>
</thead>
<tbodyclass="tableBody">
<!-- To be filled with rows with elements -->
</tbody>
</table>
<table>
<caption class="caption">
Please click one of buttons to attach event listeners
</caption>
<thead>
<tr>
<th>Name</th>
<th>Surname</th>
<th>Actions</th>
</tr>
</thead>
<tbody class="tableBody">
<!-- To be filled with rows with elements -->
</tbody>
</table>
<table>
<caption class="caption">
Please click one of buttons to attach event listeners
</caption>
<thead>
<tr>
<th>Name</th>
<th>Surname</th>
<th>Actions</th>
</tr>
</thead>
<tbody class="tableBody">
<!-- To be filled with rows with elements -->
</tbody>
</table>
Tabelkę wypełnią elementy wygenerowane w następujący sposób:
Elementami na których kliknięcie będziemy reagować to przyciski. Przyciski umieszczone będą wewnątrz kolumny
<td>
<td> w wierszu
<tr>
<tr>, stąd potrzebować będziemy znaleźć wiersz w którym ten element się znajduje i go usunąć. Pomoże nam w tym metoda closest, która przeszuka rodziców w górę aż natrafi na wiersz. Wtedy będziemy mogli usunąć wiersz.
Ostatnią istotną funkcją ze szkieletu będzie funkcja mierząca czas wykonania:
Oczywiście – możesz powiedzieć, że nadal mówimy tu o milisekundach. Możesz powiedzieć również, że Moto G 2 to bardzo stary i wolny telefon (fakt, przycina się przy pisaniu na klawiaturze ).
Z drugiej strony, w sytuacji gdy mamy rzeczywistą stronę internetową może nałożyć się na siebie wiele takich sytuacji, co w konsekwencji spowoduje że będzie ona działać wolniej niż powinna.
Dodatkowo sytuacja opisana w artykule pokazuje, jak ważne jest testowanie również na wolniejszych urządzeniach, gdyż mniej optymalne rozwiązania oddziałują na słabsze urządzenia znacznie bardziej niż na te mocniejsze.
Oczywiście rozwiązanie zaciemnia nieco kod – dlatego jego zastosowanie powinno być poprzedzone testami na wolnym urządzeniu i potwierdzeniu, że faktycznie należy szukać optymalizacji wydajności.