$ (document) .on ('click', '#id', function () {}) vs $ ('# id'). on ('click', function () {}) [closed]


82

Я намагався з'ясувати, в чому різниця між

$(document).on('click', '#id', function(){});

і

$('#id').on('click', function(){});

Я не зміг знайти жодної інформації про те, чи є якась різниця між ними, і якщо так, то яка ця різниця може бути.

Хтось може пояснити, чи є якась різниця взагалі?


2
Чи прочитали ви документацію чи здійснили пошук на цьому сайті. На вибір має бути кілька мільйонів відповідей?
adeneo

9
Ви отримаєте відповідь на це "голодних" бегемотів, незважаючи на те, що це чітко задокументовано. Перший код говорить "коли документ клацають, якщо це щось з ідентифікатором #id, тоді запускайте цей код". Другий говорить: "коли натискається все, що зараз існує з ідентифікатором #id, активуй цей код". Перший призначений для присвоєння події елементам, які на той момент не існують, але будуть діяти в майбутньому. Другий не буде спрацьовувати для будь-яких елементів, доданих пізніше.
Відновити Моніку Челліо

6
Я робив і те, і інше, очевидно, недостатньо ретельно. Пошук важкий, бо я не знав, що шукати. Я б не знав, як це називається.
Стифон

1
Це пояснено в документації до on(). Тільки трохи читання, щоб зробити :)
Поновити Моніку Челліо

8
Якщо це слід закрити як неконструктивне або тому, що для нього існує документація, то близько 99,9% запитань щодо stackoverflow слід закрити, і в цьому випадку вдало знайти решту 0,1%, оскільки це, мабуть, вийде з ладу. Те саме стосується принизливого зауваження про "голодних бегемотів".
цезоїд

Відповіді:


69

Перший приклад демонструє делегування подій . Обробник подій прив'язаний до елемента вище дерева DOM (в даному випадку - document) і буде виконаний, коли подія досягне цього елемента, що виник у елементі, що відповідає селектору.

Це можливо, оскільки більшість подій DOM пускають дерево з місця початку. Якщо клацнути на #idелементі, генерується подія кліку, яка буде проникати через усі елементи-предки ( примітка до сторони: перед цим насправді є фаза, яка називається `` фаза захоплення '', коли подія спускається по дереву до ціль ). Ви можете зафіксувати подію на будь-якому з цих предків.

Другий приклад прив’язує обробник події безпосередньо до елемента. Подія все одно буде міхуром (якщо ви не запобігнете цьому в обробнику), але оскільки обробник прив'язаний до цілі, ви не побачите наслідків цього процесу.

Делегуючи обробник події, ви можете переконатися, що він виконується для елементів, які не існували в DOM на момент прив'язки. Якби ваш #idелемент був створений за вашим другим прикладом, ваш обробник ніколи б не виконав. Прив’язуючи до елемента, який, як ви знаєте, точно знаходиться в DOM на момент виконання, ви гарантуєте, що ваш обробник насправді буде приєднаний до чогось і може бути виконаний за необхідності пізніше.


1
Я хотів би знати, хто делегує подію швидше. Я хочу поліпшити якість мого коду jquery. Оскільки делегування події з DOM займає трохи більше часу, ніж делегування події з #Element. Будь ласка, поділіться своїми думками
Арун Г

1
@James Allardice - використовуючи останній метод, $(document).on('click', $('#id'), function()...як я можу використовувати $(this)посилання $('#id')? $(this)в даний час посилається document- що я розумію.
cheshireoctopus

13

Розгляньте наступний код

<ul id="myTask">
  <li>Coding</li>
  <li>Answering</li>
  <li>Getting Paid</li>
</ul>

Тепер тут різниця

// Remove the myTask item when clicked.
$('#myTask').children().click(function () {
  $(this).remove()
});

А що, якщо ми знову додамо myTask?

$('#myTask').append('<li>Answer this question on SO</li>');

Натиснувши цей елемент myTask, ви не видалите його зі списку, оскільки він не має жодних обробників подій. Якби замість цього ми використовували .on, новий елемент працював би без особливих зусиль з нашого боку. Ось як виглядатиме версія .on:

$('#myTask').on('click', 'li', function (event) {
  $(event.target).remove()
});

Короткий зміст:

Різниця між .on()та .click()може полягати в тому, що .click()може не працювати, коли елементи DOM, пов’язані з .click()подією, додаються динамічно пізніше, в той час як .on()можуть використовуватися в ситуаціях, коли елементи DOM, пов’язані із .on()викликом, можуть генеруватися динамічно в більш пізній момент.


Бхушан, чи є якась причина використовувати перше, а не друге?
Шон Мадьяр

@SzilardMagyar Думаю, я відповів на це в розділі "Підсумок" моєї відповіді ..
Bhushan Firake

Хороша інформація!
Абдул Азіз Аль Басир
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.