Перш ніж прочитати це, перетягніть цей список подій на іншу сторінку, сам API дуже корисний, і все, що я обговорюю нижче, пов’язане безпосередньо з цієї сторінки .
По-перше, .click(function)це буквально ярлик .bind('click', function), вони рівноцінні. Використовуйте їх, прив'язуючи обробник безпосередньо до елемента , наприклад:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Якщо цей елемент замінить або викине, цього обробника більше не буде. Також елементи, яких не було під час запуску цього коду для приєднання обробника (наприклад, селектор його знайшов тоді), не отримають обробник.
.live() і .delegate() подібні між собою, .delegate()насправді використовує .live()внутрішньо, вони обидва слухають, коли події перекидаються. Це працює для нових і старих елементів , вони кидають події однаково. Ви використовуєте їх, коли ваші елементи можуть змінюватися, наприклад, додаючи нові рядки, елементи списку тощо. Якщо у вас немає батьківського / загального предка, який залишиться на сторінці і не замінюється в будь-який момент, використовуйте .live()так:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Якщо ж у вас десь є батьківський елемент, який не замінюється (тому його обробники подій не збираються побачити), вам слід попрацювати з ним .delegate(), як це:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Це працює майже так само, як .live() , , але подія бульбашки менше разів, перш ніж бути захопленими та обробниками виконаними. Ще одне поширене використання обох із них - скажімо, що ваш клас змінюється на елементі, який більше не відповідає селектору, який ви використовували спочатку ... за допомогою цих методів селектор оцінюється в момент події , якщо він відповідає, обробник працює .. .так що елемент більше не відповідає селектору, він більше не буде виконуватись. З .click()проте, обробник подій пов'язаний , прямо на елемент DOM, той факт , що він не відповідає будь-селектор був використаний , щоб знайти його не має ніякого відношення ... ця подія неминуче , і це перебування , поки не зникне цей елемент, або обробник видаляється через .unbind().
Ще одне поширене використання .live()і .delegate()є продуктивність . Якщо ви маєте справу з безліччю елементів, приєднання обробника кліків безпосередньо до кожного елемента є дорогим і трудомістким. У цих випадках економніше налаштувати єдиний обробник і дозволити бульбашці виконувати роботу, погляньте на це питання, де це зробило величезну зміну , це хороший приклад програми.
Запуск - для оновленого питання
Доступні дві основні функції запускання обробника подій, вони підпадають під ту ж категорію "Додаток обробника подій" в API , це .trigger()і.triggerHandler() . .trigger('eventName')має вбудовані ярлики для загальних подій, наприклад:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Тут ви можете переглянути список, включаючи ці ярлики .
Що стосується різниці, .trigger() запускає обробник подій (але не дію за замовчуванням більшу частину часу, наприклад, клацнувши курсор у потрібному місці, натиснувши клацанням <textarea>). Це призводить до того, що обробники подій відбуваються в тому порядку, до якого вони були зв'язані (як це було б у рідній події), спрацьовують з нативними діями події та розгортаються DOM.
.triggerHandler()зазвичай для іншої мети, тут ви просто намагаєтеся запустити пов'язаний обробник (ів), це не спричиняє натиск нативного події, наприклад, подача форми. Він не міхур DOM, і це неможливо (він повертає те, що повертається останній обробник подій для цієї події). Наприклад, якщо ви хотіли викликати focusподію, але насправді не фокусували об'єкт, ви просто хочете код, з яким ви пов'язані.focus(fn) запустив, це зробить це, тоді як .trigger()це зробить так само, як і фактично сфокусував би елемент і міхур.
Ось приклад реального світу:
$("form").submit(); //actually calling `.trigger('submit');`
Це запустить будь-які оброблювачі подання, наприклад плагін перевірки jQuery , а потім спробуйте надіслати <form>. Однак якщо ви просто хотіли перевірити, оскільки він підключений через submitобробник подій, але не надсилати <form>після цього, ви можете використовувати .triggerHandler('submit'), як це:
$("form").triggerHandler('submit');
Плагін заважає обробнику подавати форму шляхом бомбардування, якщо перевірка перевірки не проходить, але за допомогою цього методу нам все одно, що це робить. Незалежно від того, перервали це чи ні, ми не намагаємося подати форму, ми просто хотіли запустити її повторно підтвердити і нічого більше не робити. ( Відмова: Це зайвий приклад, оскільки .validate()в плагіні є метод, але це гідна ілюстрація наміру)