Jquery Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ класс: Jquery Π·Π°ΠΌΠ΅Π½Π° класса? β€” Π₯Π°Π±Ρ€ Q&A

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Как ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ jQuery Π² соврСмСнном Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅: ΠΎΠΏΡ‹Ρ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ GitHub

НС Ρ‚Π°ΠΊ Π΄Π°Π²Π½ΠΎ GitHub ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ пСрСстал ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ jQuery Π² своём Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-ΠΊΠΎΠ΄Π΅. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π²Π΅Π»ΠΈ пост, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, с Ρ‡Π΅Π³ΠΎ Π½Π°Ρ‡Π°Π»Π°ΡΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π° с jQuery, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ поняли, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€Π° ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΎΡ‚ΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ, ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ смогли ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π±Π΅Π· использования Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΠ»ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ².

Π—Π°Ρ‡Π΅ΠΌ jQuery Π±Ρ‹Π» Π½ΡƒΠΆΠ΅Π½ Ρ€Π°Π½ΡŒΡˆΠ΅?

jQuery 1.2.1 Π²ΠΎΡˆΡ‘Π» Π² число зависимостСй GitHub Π² ΠΊΠΎΠ½Ρ†Π΅ 2007 Π³ΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π·Π° Π³ΠΎΠ΄ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Google выпустил ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Chrome. На Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ Π±Ρ‹Π»ΠΎ общСпринятого способа ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ элСмСнтам DOM с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CSS-сСлСктора, Π½Π΅ Π±Ρ‹Π»ΠΎ стандартного способа Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΡŽ ΠΊ ΡΡ‚ΠΈΠ»ΡŽ элСмСнта, Π° интСрфСйс XMLHttpRequest, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉΒ Internet Explorer, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ API, Π±Ρ‹Π» ΠΏΠ»ΠΎΡ…ΠΎ совмСстим с Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ.

Π‘ jQuery стало Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ DOM, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ AJAX-запросы. Π£ Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ соврСмСнныС, динамичСскиС сайты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π΅Π»ΡΠ»ΠΈΡΡŒ срСди ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. Π‘Π°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅, всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JavaScript, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ jQuery, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…. На Π·Π°Ρ€Π΅ GitHub, ΠΊΠΎΠ³Π΄Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Ρ€Π΅Ρ‚Π°Π»ΠΈ Ρ„ΠΎΡ€ΠΌΡƒ, появлСниС jQuery ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ нСбольшой ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² быстро ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ Π±Π΅Π· нСобходимости ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ интСрфСйс jQuery Ρ‚Π°ΠΊΠΆΠ΅ послуТил основой для создания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ стали ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° GitHub.com: pjax ΠΈ facebox.

Π’Π΅Π±-стандарты Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π³ΠΎΠ΄Ρ‹

Π‘ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ GitHub прСвратился Π² компанию с сотнями Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ постСпСннно ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π»Π°ΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π°, которая ΠΎΡ‚Π²Π΅Ρ‡Π°Π»Π° Π·Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ качСство JavaScript-ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ отправляСм Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌ. Одна ΠΈΠ· Π²Π΅Ρ‰Π΅ΠΉ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ мы постоянно слСдим, β€” тСхничСский Π΄ΠΎΠ»Π³, ΠΏΠΎΡ€ΠΎΠΉ Π²Ρ‹Ρ€Π°ΡΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ· Π½Π΅ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… зависимостСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ потСряли свою Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΠΏΡ€ΠΎΡˆΠ΅ΡΡ‚Π²ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

Когда ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ дошла Π΄ΠΎ jQuery, ΠΌΡ‹ сравнили Π΅Π³ΠΎ с Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΡΡ Π²Π΅Π±-стандартом Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ поняли, Ρ‡Ρ‚ΠΎ:

  • Π¨Π°Π±Π»ΠΎΠ½Β $(selector) ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°Β querySelectorAll();
  • ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ CSS-классов Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽΒ Element. classList;
  • CSS Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС анимации Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… стилСй, Π° Π½Π΅ Π² JavaScript;
  • $.ajax-запросы ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Fetch Standard;
  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΒ addEventListener() достаточно стабилСн для кроссплатформСнного использования;
  • Π¨Π°Π±Π»ΠΎΠ½ дСлСгирования событий Π»Π΅Π³ΠΊΠΎ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ лСгковСсной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ;
  • Π‘ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠ΅ΠΉ JavaScript Ρ‡Π°ΡΡ‚ΡŒ синтаксичСского сахара jQuery устарСла.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, синтаксис Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄ Π½Π΅ удовлСтворял Π½Π°ΡˆΠΈΠΌΒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡΠΌ ΠΎ ΠΊΠΎΠ΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹Β Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. НапримСр:

$('.js-widget')
  .addClass('is-loading')
  .show()

Π’Π°ΠΊΠΎΠΉ синтаксис прост Π² написании, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ нашим стандартам Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ намСрСния Π°Π²Ρ‚ΠΎΡ€Π°. Бколько элСмСнтов js-widget, ΠΏΠΎ Π΅Π³ΠΎ Π·Π°Π΄ΡƒΠΌΠΊΠ΅, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π½Π° страницС: ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ большС? А Ссли ΠΌΡ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΡƒ страницы ΠΈ случайно оставим имя класса js-widget, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сообщит Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ? По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ jQuery ΠΌΠΎΠ»Ρ‡Π° пропускаСт всё Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Π½Π΅Ρ‚ совпадСний ΠΏΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌΡƒ сСлСктору; ΠΎΠ΄Π½Π°ΠΊΠΎ для нас Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ большС Π±Π°Π³ΠΎΠΌ, Π½Π΅ΠΆΠ΅Π»ΠΈ Ρ„ΠΈΡ‡Π΅ΠΉ.

НаконСц, Π½Π°ΠΌ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ с Flow, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‚ΠΈΠΏΠΎΠ² Π²ΠΎ врСмя сборки, ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ синтаксис Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ ΠΏΠ»ΠΎΡ…ΠΎ поддаётся статичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° jQuery ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ°. Из Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Flow, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΈΠ΅ возмоТности, ΠΊΠ°ΠΊ Ρ€Π΅ΠΆΠΈΠΌ @flow weak, ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ Π½Π°ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ прогрСссивно ΠΈ эффСктивно ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΊ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅, которая ΠΏΠΎ большСй части Π±Ρ‹Π»Π° Π½Π΅Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счётС ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ jQuery ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ большС ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Π²Π΅Π±-стандарты, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Π±-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ MDN Π² качСствС ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ для Π½Π°ΡˆΠΈΡ… Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅Ρ€ΠΎΠ², ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ вСс Π½Π°ΡˆΠΈΡ… зависимостСй Π½Π° 30 ΠšΠ±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы ΠΈ выполнСния JavaScript.

ΠŸΠΎΡΡ‚Π΅ΠΏΠ΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄

Π₯отя наша конСчная Ρ†Π΅Π»ΡŒ Π±Ρ‹Π»Π° Π½Π΅ Π·Π° Π³ΠΎΡ€Π°ΠΌΠΈ, ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСцСлСсообразно Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ всС ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ рСсурсы Π½Π° пСрСписываниС всСго с jQuery Π½Π° чистый JS. Π’ΠΎ всяком случаС, Ρ‚Π°ΠΊΠΎΠ΅ поспСшноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ Π±Ρ‹ сказалось Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сайта, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π°ΠΌ Π±Ρ‹ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ. ВмСсто этого ΠΌΡ‹:

  • Начали ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² jQuery Π½Π° строку ΠΊΠΎΠ΄Π° ΠΈ слСдили Π·Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ Π½Π° протяТСнии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π»ΠΈΠ±ΠΎ Π½Π΅ мСняСтся, Π»ΠΈΠ±ΠΎ ΠΏΠ°Π΄Π°Π΅Ρ‚, Π½ΠΎ Π½Π΅ растёт.
  • ΠžΡ‚ΠΊΠ°Π·Π°Π»ΠΈΡΡŒ ΠΎΡ‚ использования jQuery Π² Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ этого с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΡ‹ создали eslint-plugin-jquery, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°Π» CI-тСсты ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности jQuery Π²Ρ€ΠΎΠ΄Π΅ $.ajax.
  • Π’ старом ΠΊΠΎΠ΄Π΅ появилось ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΉ ΠΏΡ€Π°Π²ΠΈΠ» eslint, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ» eslint-disable
    Π² коммСнтариях. Для Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ это Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ явным сигналом Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ здСсь Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ наши Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ написания ΠΊΠΎΠ΄Π°
  • ΠœΡ‹ написали Π±ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ pull request’а оставлял ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ нашСй ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠ°ΠΊ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Ρ…ΠΎΡ‚Π΅Π» Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ eslint-disable. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ провСсти Ρ€Π΅Π²ΡŒΡŽ ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π½Π½Π΅ΠΉ стадии ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹.
  • Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ старого ΠΊΠΎΠ΄Π° Π±Ρ‹Π»Π° явно связана с внСшними интСрфСйсами jQuery-ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² pjax ΠΈ facebox, поэтому ΠΌΡ‹ оставили ΠΈΡ… интСрфСйсы ΠΏΠΎΡ‡Ρ‚ΠΈ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π½Π° чистом JS. НаличиС статичСской ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² всСлило Π² нас ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌΠΎΠΌ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅.
  • Много старого ΠΊΠΎΠ΄Π° Π±Ρ‹Π»ΠΎ связано с rails-behaviors, нашим Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ΠΎΠΌ для Ruby on Rails, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ присоСдинял ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° AJAX ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΌ Ρ„ΠΎΡ€ΠΌΠ°ΠΌ:
    // Π£Π‘Π’ΠΠ Π•Π’Π¨Π˜Π™ ΠŸΠžΠ”Π₯ΠžΠ” $(document).on('ajaxSuccess', 'form.js-widget', function(event, xhr, settings, data) { // вставка Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² DOM })

    ВмСсто Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ всС эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ согласно Π½ΠΎΠ²ΠΎΠΌΡƒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ, ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΆΠ½Ρ‹Π΅ события ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° ajax*, ΠΈ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ асинхронно, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅; Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ использовался fetch().

  • ΠœΡ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»ΠΈ свою сборку jQuery, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ±ΠΈΡ€Π°Π»ΠΈ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ замСняли Π±ΠΎΠ»Π΅Π΅ Π»Ρ‘Π³ΠΊΠΎΠΉ вСрсиСй. НапримСр, послС избавлСния ΠΎΡ‚ всСх jQuery-спСцифичных CSS-псСвдосСлСкторов Π²Ρ€ΠΎΠ΄Π΅ :visible ΠΈΠ»ΠΈ :checkboxΒ ΠΌΡ‹ смогли ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Sizzle; Π° ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π°ΠΌΠ΅Π½ΠΈΠ»ΠΈ $.ajax-Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π½Π° fecth(), ΠΌΡ‹ смогли ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ модуля AJAX. ΠœΡ‹ ΡƒΠ±ΠΈΠ²Π°Π»ΠΈ Π΄Π²ΡƒΡ… Π·Π°ΠΉΡ†Π΅Π² Ρ€Π°Π·ΠΎΠΌ: ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π»ΠΈ врСмя выполнСния JavaScript, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ гарантируя Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
  • Глядя Π½Π° статистику нашСго сайта, ΠΌΡ‹ ΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Internet Explorer Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ быстро, насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ использованиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΉ вСрсии IE ΠΏΠ°Π΄Π°Π»ΠΎ Π½ΠΈΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ€ΠΎΠ³Π°, ΠΌΡ‹ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π»ΠΈ Π΅Ρ‘ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΈ Ρ„ΠΎΠΊΡƒΡΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π½Π° Π±ΠΎΠ»Π΅Π΅ соврСмСнных Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ…. ΠžΡ‚ΠΊΠ°Π· ΠΎΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ IE 8-9 Π½Π° Ρ€Π°Π½Π½Π΅ΠΌ этапС ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π½Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ возмоТности Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π±Ρ‹Π»ΠΎ Π±Ρ‹ слоТно Β«Π·Π°ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π»ΠΈΡ‚ΡŒΒ».
  • Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… нашСго ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ написанию Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° GitHub ΠΌΡ‹ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΠ»ΠΈΡΡŒ Π½Π° использовании ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ HTML ΠΏΠΎ-максимуму, добавляя JavaScript Π² качСствС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎΒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ. Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π΄Π°ΠΆΠ΅ Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ элСмСнты интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JS, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°ΠΆΠ΅ с Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ JavaScript. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π½Π°ΠΌ Π΄Π°ΠΆΠ΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ вмСсто Π΅Ρ‘ пСрСписывания Π½Π° чистом JS.

Благодаря этим ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ усилиям с Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΡ‹ постСпСнно смогли ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ jQuery Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°, ΡΡΡ‹Π»Π°ΡŽΡ‰Π΅ΠΉΡΡ Π½Π° эту Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

Custom Elements: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ элСмСнты

Одна тСхнология, надСлавшая ΡˆΡƒΠΌΡƒ Π² послСдниС Π³ΠΎΠ΄Ρ‹, β€” Custom Elements: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², встроСнная Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ отсутствиС нСобходимости для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ, ΠΏΠ°Ρ€ΡΠΈΡ‚ΡŒ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π°ΠΉΡ‚Ρ‹ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°.

ΠœΡ‹ создали нСсколько ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… элСмСнтов Π½Π° основС спСцификации v0 с 2014 Π³ΠΎΠ΄Π°. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стандарты Π² Ρ‚ΠΎ врСмя постоянно мСнялись, ΠΌΡ‹ сильно Π² это Π½Π΅ Π²ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΈΡΡŒ. А Π½Π°Ρ‡Π°Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с 2017 Π³ΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° спСцификация Web Components v1, рСализованная ΠΊΠ°ΠΊ Π² Chrome, Ρ‚Π°ΠΊ ΠΈ Π² Safari.

Π’ΠΎ врСмя ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° с jQuery ΠΌΡ‹ искали структуры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π² качСствС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… элСмСнтов. НапримСр, ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π»ΠΈ ΠΊΠΎΠ΄ facebox, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для отобраТСния ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ², Π² элСмСнт <details-dialog>.

Наша общая философия прогрСссивного ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ относится ΠΈ ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌ элСмСнтам. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ стараСмся Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π² Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ΅ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π½Π΅Ρ‘. НапримСр, <local-time> ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ, Π½ΠΎ с ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ врСмя Π² мСстный часовой пояс, Π° <details-dialog>, располоТСнный Π²Π½ΡƒΡ‚Ρ€ΠΈ элСмСнта <details>, ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Π΄Π°ΠΆΠ΅ Π±Π΅Π· JavaScript, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ Π΄ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… возмоТностСй доступа.

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ элСмСнт <local-time>:

// Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ local-time ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ врСмя Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ
// часовом поясС ΠΈ мСстополоТСнии ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
//
// ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
//   Sep 6, 2018
//
class LocalTimeElement extends HTMLElement {
  static get observedAttributes() {
    return ['datetime']
  }

  attributeChangedCallback(attrName, oldValue, newValue) {
    if (attrName === 'datetime') {
      const date = new Date(newValue)
      this.textContent = date.toLocaleString()
    }
  }
}

if (!window.customElements.get('local-time')) {
  window.LocalTimeElement = LocalTimeElement
  window.customElements.define('local-time', LocalTimeElement)
}

Один ΠΈΠ· аспСктов Web Components, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π½ΡΡ‚ΡŒ, β€”Β Shadow DOM. Π£ Shadow DOM Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» для раскрытия мноТСства возмоТностСй для Π²Π΅Π±Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Ρ‚Π°ΠΊΠΆΠ΅ услоТняСт ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π»ΠΈΠ½Π³. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π»ΠΈΠ½Π³ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ сниТСнию ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π°ΠΆΠ΅ для ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ управляСт частями DOM, Π½Π΅ относящихся ΠΊ Π²Π΅Π±-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ, для нас нСцСлСсообразно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π΅.

ΠŸΠΎΠ»ΠΈΡ„ΠΈΠ»Π»Ρ‹

Π—Π΄Π΅ΡΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ использованию встроСнных возмоТностСй Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. ΠœΡ‹ стараСмся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° это ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‚.Π΅. ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ JavaScript-Π±Π°Π½Π΄Π»Π° для совмСстимости с ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌΠΈ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°ΠΌΠΈ.

  • github/eventlistener-polyfill
  • github/fetch
  • github/form-data-entries
  • iamdustan/smoothscroll
  • javan/details-element-polyfill
  • jonathantneal/closest
  • kumarharsh/custom-event-polyfill
  • marvinhagemeister/request-idle-polyfill
  • mathiasbynens/Array.from
  • mathiasbynens/String.prototype.codePointAt
  • mathiasbynens/String.prototype.endsWith
  • mathiasbynens/String.prototype.startsWith
  • medikoo/es6-symbol
  • nicjansma/usertiming.js
  • rubennorte/es6-object-assign
  • stefanpenner/es6-promise
  • webcomponents/template
  • webcomponents/URL
  • webcomponents/webcomponentsjs
  • WebReflection/url-search-params
  • yola/classlist-polyfill

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅: Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования Π½Π° JavaScriptΒ»

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ Β«Removing jQuery from GitHub. com frontendΒ»

Alpine.js — лёгкая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° jQuery

Π― Π΄Π°Π²Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡΡŒ ΠΊ Alpine.js, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот js-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ выдСляСтся ΠΈΠ· ряда Π΄Ρ€ΡƒΠ³ΠΈΡ…. По своСй сути ΠΎΠ½ ΠΎΡ‡Π΅Π½ΡŒ Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊ Vue.js, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ jQuery.

Основной массС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² просто Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ всС Ρ‚Π΅ Β«Ρ„ΠΈΡˆΠΊΠΈΒ», Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ React ΠΈΠ»ΠΈ Vue. Π’ΠΎΠΎΠ±Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π° с JavaScript всСгда происходит ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ β€” Π²Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ элСмСнт/элСмСнты Π½Π° страницС, послС Π΄Π΅Π»Π°Π΅ΠΌ с Π½ΠΈΠΌΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ манипуляции.

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ систСма событий β€” прописали Π»ΠΈΠ±ΠΎ onclick ΠΊ Π½ΡƒΠΆΠ½ΠΎΠΌΡƒ html-элСмСнту, Π»ΠΈΠ±ΠΎ навСсили событиС Ρ‡Π΅Ρ€Π΅Π· Β«ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒΒ» addEventListener ΠΈ дальшС Ρ‡Π΅Ρ€Π΅Π· js-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π΄Π΅Π»Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ JavaScript ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠΆ многословСн, Π° Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΈ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½, Ρ‚ΠΎ ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ β€” jQuery ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ…. Π‘ ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с js Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ приятнСй.

Но соврСмСнныС js-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΏΠΎΠΌΠΈΠΌΠΎ своих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, основанный Π½Π° синтаксичСском «сахарС» β€” ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ смысла Π²Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°. Π’Π°ΠΊΠΎΠΉ синтаксис Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅ Π΄Π°ΠΆΠ΅ ΡƒΠ΄ΠΎΠ±Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ jQuery (ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²).

Π—Π° это приходится Ρ€Π°ΡΠΏΠ»Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ. ОсновноС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ β€” Ρ‚Π°ΠΊΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ для своСй Ρ€Π°Π±ΠΎΡ‚Ρ‹ Node.js, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ исходный ΠΊΠΎΠ΄ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€. Π”Π°, Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ сборки Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ React ΠΈΠ»ΠΈ Vue, Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΡ… js-Ρ„Π°ΠΉΠ»ΠΎΠ² достаточно большой: 120 ΠΈ 93Кб. Π”Π°ΠΆΠ΅ jQuery 3.5 вСсит мСньшС β€” 89Кб. Если ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ (Π° js-ΠΊΠΎΠ΄ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ Π²Π°ΠΆΠ΅Π½ для Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°), Ρ‚ΠΎ Π½Π΅Ρ‚ смысла ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Vue. И это ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΌΡ‹ лишаСмся всСх «плюшСк» синтаксичСского «сахара».

ИспользованиС Node.js Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла, Ссли Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ простыС Π²Π΅Ρ‰ΠΈ, Π²Ρ€ΠΎΠ΄Π΅ ΡΠΌΠ΅Π½ΠΈΡ‚ΡŒ css-класс ΠΈΠ»ΠΈ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ click Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅. Π‘Ρ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π΄ΠΈ этого гигантский Node.js Π½Π΅Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ.

Alpine.js выдСляСтся Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ нСбольшиС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ (всСго 25Кб), Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ компиляции, Π½ΠΎ ΠΏΡ€ΠΈ этом ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ синтаксичСский «сахар» ΠΊΠ°ΠΊ ΠΈ «большиС» Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ.

Π’Π°ΠΆΠ½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Alpine.js ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ BODY, Ρ‡Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ прирост скорости страницы. Если jQuery (ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈ) ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ HEAD (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ‚Π΅Π»Π΅ страницы ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ Π΅Ρ‘ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ), Ρ‚ΠΎ с Alpine.js ΠΌΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ задумываСмся ΠΎΠ± этом. Достаточно ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ js-Ρ„Π°ΠΉΠ»:

<script src="https://cdn.jsdelivr.net/gh/alpinejs/[email protected]/dist/alpine.min.js"></script>

ПослС этого Π½Π° страницС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности Alpine.

Π—Π΄Π΅ΡΡŒ я Ρ…ΠΎΡ‡Ρƒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сущСствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с jQuery ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ JS.

НапримСр Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ click Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ элСмСнтС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΌΡ‹ прописываСм css-класс ΠΈΠ»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ id ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ цСпляСмся ΠΊ Π½Π΅ΠΌΡƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ события onclick, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прописываСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

Π’ Alpine схСма заимствованна ΠΈΠ· Β«Π±ΠΎΠ»ΡŒΡˆΠΈΡ…Β» Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² (Π² основном β€” ΠΈΠ· Vue), Π³Π΄Π΅ примСняСтся ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’ Π½Ρ‘ΠΌ ΠΌΡ‹ объявляСм, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ элСмСнт, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ DIV Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»ΡΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, ΠΈΠ»ΠΈ Π² соврСмСнных Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… β€” Π΅ΠΌΡƒ добавляСтся Β«Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒΒ». Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой Π΅Π΄ΠΈΠ½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ: со своими Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ.

<div x-data>
	содСрТимоС	
</div>

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° x-data β€” это Ρ‚Π° самая инструкция, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Alpine Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ рСактивности Π² Π΄Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ. Всё, Ρ‡Ρ‚ΠΎ окаТСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ β€” ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

Π’ Alpine всСго 14 Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ² ΠΈ всС ΠΎΠ½ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с прСфикса x-. Основная x-data Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° сам ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π½ΠΎ ΠΈ позволяСт сразу ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅.

<div x-data="{t: false}">
	содСрТимоС
</div>

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создана пСрСмСнная t со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ false. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ js-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎ Π² Π½Ρ‘ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΡ… Π²Π΅Ρ€Π½Ρ‘Ρ‚).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сдСлаСм простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ событиС onclick ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ css-класс (аля-toggle).

<div x-data="{t: false}">
	<div x-on:click="t = !t" x-bind:class="{ 't-red': t }">Toggle class click</div>
</div>

Toggle class click

Π’ x-data ΠΌΡ‹ создаём ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС элСмСнта. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° x-on:click отслСТиваСт событиС onclick, Π³Π΄Π΅ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… указываСтся js-ΠΊΠΎΠ΄ β€” ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ-Π±Ρ‹ это обычная js-функция. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ t.

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ x-bind, которая связываСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ тэга (здСсь это class) с логичСскими выраТСниями. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ css-класс t-red добавится ΠΊ этому элСмСнту Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ссли t Π±ΡƒΠ΄Π΅Ρ‚ истинно (true).

ΠœΡ‹ ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ Π½Π° элСмСнтС, мСняСтся пСрСмСнная t, которая влияСт Π½Π° bind-связку ΠΈ css-класс Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌ добавляСтся. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ»ΠΈΠΊ ΠΈΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ t ΠΈ класс удаляСтся.

Π­Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΡ‰Π΅:

<div x-data="{t: false}">
	<div @click="t = !t" :class="{ 't-red': t }">Toogle class click</div>
</div>

Π’ΠΎ Π΅ΡΡ‚ΡŒ @ замСняСтся Π½Π° x-on:, Π° : Π½Π° x-bind:.

МоТно Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π±Π»ΠΎΠΊ, Ссли это ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ элСмСнт:

<div x-data="{t: false}" @click="t = !t" :class="{'t-red': t}">Toogle class click</div>

ΠŸΠΎΡ…ΠΎΠΆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ отслСТиваСм событиС аля-hover:

<div x-data="{t: false}">
	<div @mouseover="t = true" @mouseout="t = false" :class="{'t-red': t}">Toogle class hover</div>
</div>

Toogle class hover

Π­Ρ‚ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° Ρ‚ΠΎ с Ρ‡Π΅ΠΌ ΠΌΡ‹ постоянно сталкиваСмся Π² jQuery: ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ css-класс ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΎΠΌ-Ρ‚ΠΎ событии.

Рассмотрим Π΅Ρ‰Ρ‘ ΠΏΠ°Ρ€Ρƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΌΠ½Π΅ особСнно нравится:

<div x-data="{ open: false }">
    <button @click="open = true">Open</button>
    
    <div x-show="open" @click.away="open = false" x-cloak>
    	Content
    </div>
</div>

Content

Π­Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ dropdown, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ раскрываСт Π±Π»ΠΎΠΊ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ. Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ классы Berry CSS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сСмантичСски понятны.

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ опрСдСляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ open, которая Ρ…Ρ€Π°Π½ΠΈΡ‚ состояниС Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° (скрыт/ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚). Π£ Π±Π»ΠΎΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° x-show, которая содСрТит js-Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Если это false, Ρ‚ΠΎ x-show скроСт Π±Π»ΠΎΠΊ Ρ‡Π΅Ρ€Π΅Π· display: none. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ»ΠΈΠΊΠ½ΡƒΠ² Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π±Π»ΠΎΠΊ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ open.

Π£ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° @click.away, которая ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΊΠ»ΠΈΠΊ, Π½ΠΎ Π²Π½Π΅ этого Π±Π»ΠΎΠΊΠ°. ИмСнно поэтому, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΊΠ»ΠΈΠΊΠ°Π΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΈΠ»ΠΈ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ страницы, пСрСмСнная open становится false ΠΈ Π±Π»ΠΎΠΊ скрываСтся.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° x-cloak, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ это Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ тэга, особСнная. Π•Ρ‘ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΡ‡Π΅Π·Π½ΡƒΡ‚ΡŒ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Alpine Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½. Бмысл Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ js-Ρ„Π°ΠΉΠ» Alpine ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒΡΡ дольшС, Ρ‡Π΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π°Ρ‡Π½Ρ‘Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ страницу, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ Π±Π»ΠΎΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ скрыты β€” Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹. И ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сработаСт Alpine ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ отобразятся ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ. Π’ΠΎΡ‚ эта Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ нСприятному «мСльканию». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Ρ‚Π°ΠΊΠΈΡ… Π±Π»ΠΎΠΊΠΎΠ² достаточно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ x-cloak, Π° Π² css-стилях ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ:

<style>
	[x-cloak] {display: none;}
</style>

Пока Alpine Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π°, Π±Π»ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ скрыт. ΠŸΡ€ΠΈ этом Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΅Ρ‰Ρ‘ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с dropdown ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ для мСню, ΠΈ для ΠΌΠΎΠ΄Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½. ΠœΡ‹ ΠΏΠΎ сути Π½Π΅ написали Π½ΠΈ строчки js-ΠΊΠΎΠ΄Π°, Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΠΎΡ‚Ρ€ΡΡΠ°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π­Ρ‚ΠΎ Π½Π΅ сравнится Π½ΠΈ с jQuery, Π½ΠΈ с Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ JS.

Ну ΠΈ послСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Ρ‚Π°Π±Ρ‹.

<div x-data="{ tab: 'foo' }">
    <button :class="{ 'bg-blue': tab === 'foo' }" @click="tab = 'foo'">Foo</button>
    <button :class="{ 'bg-blue': tab === 'bar' }" @click="tab = 'bar'">Bar</button>
 
	<div>
    	<div x-show="tab === 'foo'">Π’ΠΊΠ»Π°Π΄ΠΊΠ° Foo</div>
    	<div x-show="tab === 'bar'" x-cloak>Π’ΠΊΠ»Π°Π΄ΠΊΠ° Bar</div>
    </div>
</div>

Π’ΠΊΠ»Π°Π΄ΠΊΠ° Foo

Π’ΠΊΠ»Π°Π΄ΠΊΠ° Bar

Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Π΅Π»Π°Π»ΠΈ свои Ρ‚Π°Π±Ρ‹, Ρ‚ΠΎ ΠΏΠΎΠΉΠΌΡ‘Ρ‚Π΅ насколько ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΌ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ получился этот ΠΊΠΎΠ΄. МнС каТСтся, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ простой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π½Π΅ сущСствуСт…

Π§Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅? Для мСня Alpine.js β€” настоящая Π½Π°Ρ…ΠΎΠ΄ΠΊΠ°, которая Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ js-ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π² html-ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. ΠŸΡ€ΠΈ этом возмоТности Alpine Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС β€” ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… рассчитаны Π½Π° ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Ρ… js-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Но ΠΈ для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… вСбмастСров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ простыС Π·Π°Π΄Π°Ρ‡ΠΈ, Alpine.js ΠΌΠΎΠΆΠ΅Ρ‚ пригодится ΠΊΠ°ΠΊ лёгкая Π·Π°ΠΌΠ΅Π½Π° jQuery.

Π Π°Π±ΠΎΡ‚Π° с Ajax Π² Alpine.js

Админ-панСль для Albireo

Ѐункция jQuery .closest() ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ чистому JavaScript – clubmate.fi

Ѐункция jQuery .closest() ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ чистому JavaScript свСдСниС ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ jQuery

.closest() ΠΈ Π΄Π²ΡƒΠΌ собствСнным Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°ΠΌ JavaScript.

Ѐункция jQuery .closest() Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½Π°! Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚:

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² Π½Π°Π±ΠΎΡ€Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствуСт сСлСктору, провСряя сам элСмСнт ΠΈ просматривая Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²Π΅ DOM.

По сути, Ρƒ блиТайшСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ Π²Π΅Ρ‰ΠΈ:

  1. ΠΠ°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Ρ‚ΠΎΡ‡ΠΊΠ° β€” Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΎΡ‚ΡΡŽΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ DOM Π²Π²Π΅Ρ€Ρ….
  2. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ для поиска β€” ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠΈ Π² этот элСмСнт ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ.

Π’ΠΎΡ‚ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

 
<навигация> <ΡƒΠ»>
  • элСмСнт1
  • элСмСнт2
  • элСмСнт 3
  • элСмСнт4
  • ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ с nav , Π½ΠΎ ваша «отправная Ρ‚ΠΎΡ‡ΠΊΠ°Β» β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· элСмСнтов li (ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅). Π£ вас ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ соблазн ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это:

     $('.nav-item-1')
      .parent() // ΡƒΠ».
      .parent() // навигация
      .parent() // Ρ€Π°Π·Π΄Π΅Π»
      .css('background-color', 'red') 

    Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΏΠ»ΠΎΡ…ΠΎ, Π½ΠΎ Ρ‡Ρ‚ΠΎ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ большСС расстояниС? Или Ссли Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Ρ‚ΡƒΠ΄Π° ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄. Closest создан ΠΈΠΌΠ΅Π½Π½ΠΎ для Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ:

     $('.nav-item-1').closest('nav').css('background-color', 'red') 

    Π’Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ $('.nav-item-1 ') ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ . closest('nav') , ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· DOM Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ достигнСт Ρ†Π΅Π»ΠΈ ΠΈ Π½Π΅ Π²Π΅Ρ€Π½Π΅Ρ‚ Π΅Π΅.

    Чистый JavaScript

    NearestByClass function

    НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ванильная функция JavaScript, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ блиТайший ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ класс. Из Π½Π΅Π³ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π° самом Π΄Π΅Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ блиТайшая функция:

     var NearestByClass = функция (эль, ΠΊΠ»Π°Π·Π·) {
      // ΠžΠ±Ρ…ΠΎΠ΄ΠΈΠΌ DOM Π²Π²Π΅Ρ€Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ†ΠΈΠΊΠ»Π° while
      Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ (el.className != clazz) {
        // Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Ρ†ΠΈΠΊΠ» Π΄ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΡƒΠ·Π»Π°
        эл = эл.Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π»
        Ссли (!эль) {
          Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ноль
        }
      }
      // Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ†ΠΈΠΊΠ» while остановлСн, ΠΈ `el` прСдставляСт элСмСнт
      // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ класс, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π²Π°ΠΌΠΈ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
      // `ΠΊΠ»Π°Π·`
      Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ эль
    } 

    ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования:

     document.onclick = function (e) {
      if (closestByClass(e.target, 'ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ класс')) {
        // Π‘Π΄Π΅Π»Π°ΠΉ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ
      } Π΅Ρ‰Π΅ {
        // Π”Π΅Π»Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅
      }
    } 

    Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ всС Ρ‚Π°ΠΊΠΎΠ΅, Π½ΠΎ ΠΎΠ½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½Π° классов, Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π° ID, просто Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ className Π½Π° id . Π₯отя этого ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΏΠΎΠ»Π½Π΅ достаточно Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв использования, ΠΎΠ½ всС Π΅Ρ‰Π΅ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ унивСрсалСн.

    РСкурсивный чистый JavaScript блиТайший

    Π’ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ гибкая функция, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΡ€ΠΎΡ‡Π΅:

     var Nearest = function (el, fn) {
      Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ el && (fn(el) ? el : блиТайший(el.parentNode, fn))
    } 

    Или Π·Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΊΠ°ΠΊ однострочный со стрСлочной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ:

     var блиТайший = (el, fn) => el && (fn(el) ? el : блиТайший(el.parentNode, fn)) 

    Π­Ρ‚ΠΎ довольно ΠΏΠ»ΠΎΡ‚Π½ΠΎ . Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° использованиС списка ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали Ρ€Π°Π½Π΅Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ класс, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ имя Ρ‚Π΅Π³Π°:

     var srcEl = document.getElementsByClassName('nav__item-3')
    // Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ с классом `.nav` являСтся Π½ΡƒΠΆΠ½Ρ‹ΠΌ элСмСнтом Π² этом случаС
    var nav = блиТайший (srcEl [0], функция (el) {
      // ΠŸΡ€Π΅Π»Π΅ΡΡ‚ΡŒ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ Ρ†Π΅Π»ΡŒΡŽ, здСсь
      // ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ имя класса `.nav`
      Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ el. className === 'nav'
    })
    // Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСмСнная `nav` содСрТит блиТайший элСмСнт с классом `.nav`
    console.log(навигация)
    // Π—Π΄Π΅ΡΡŒ Ρ†Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° ΠΊΠ°ΠΊ id `#nav-id`
    var nav = блиТайший (srcEl [0], el => el.id === 'nav-id')
    // Π—Π΄Π΅ΡΡŒ Ρ‚Π΅Π³ `

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСмСнная nav устанавливаСтся Π½Π° блиТайший элСмСнт, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠ΅Π½ΠΈ класса, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚Π΅Π³Π°. Π­Ρ‚ΠΎ просто обычная старая ссылка Π½Π° элСмСнт DOM, с Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ.

    Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ нСвСроятно Π»Π΅Π³ΠΊΠΈΠΉ ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ! Π­Ρ‚ΠΎ происходит ΠΈΠ· этого Π²Π΅Π»ΠΈΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° SO.

    Π’ΠΎΡ‚ нСбольшая дСмонстрация.

    Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠ°Ρ дСмонстрация Pure JavaScript

    JavaScript Β· Bootstrap v5.0

    Π˜Π½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈΠ»ΠΈ скомпилированныС

    ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ js/dist/*.js ), ΠΈΠ»ΠΈ всС сразу, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ bootstrap.js ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½Ρ‹ΠΉ bootstrap. min.js (Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°ΠΉΡ‚Π΅ ΠΎΠ±Π°).

    Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ сборщик (Webpack, Rollup…), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ /js/dist/*.js , ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ UMD.

    ИспользованиС Bootstrap Π² качСствС модуля

    ΠœΡ‹ прСдоставляСм Π²Π΅Ρ€ΡΠΈΡŽ Bootstrap, ΡΠΎΠ·Π΄Π°Π½Π½ΡƒΡŽ ΠΊΠ°ΠΊ ESM ( bootstrap.esm.js ΠΈ bootstrap.esm.min.js ), которая позволяСт Π²Π°ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Bootstrap Π² качСствС модуля Π² вашСм Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, Ссли ваши Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π΅Π³ΠΎ.

     <Ρ‚ΠΈΠΏ сцСнария = "ΠΌΠΎΠ΄ΡƒΠ»ΡŒ">
      ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ {Toast} ΠΈΠ· 'bootstrap.esm.min.js'
      Array.from(document.querySelectorAll('.toast'))
        .forEach(toastNode => Π½ΠΎΠ²Ρ‹ΠΉ Toast(toastNode))
    
     

    НСсовмСстимыС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹

    Из-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Dropdown, Tooltip ΠΈ Popover, нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ‚Π΅Π³Π΅