2011-01-04 8 views
0

Когда я пишу JavaScript, у меня есть набор интерфейсных кнопок, которые имеют свои события, назначенные при загрузке страницы. Моя проблема - это что-то, созданное динамически, не будет получать эти события.Обработка событий Javascript после загрузки страницы

Например, я делаю проверку URL-адреса, кто должен работать, чтобы удостовериться, что любая ссылка, которая идет в другой домен, вызывает интерфейс выхода, позволяя пользователю знать, что они уходят. Любые ссылки, созданные после загрузки страницы, отправляют ajax (не предназначен для каламбуров) или что-то еще не будет иметь это событие естественно, как те, которые существовали при загрузке страницы.

На практике, что является лучшим способом обеспечить, чтобы все вновь созданные элементы получали такие виды глобальных событий?

Мне нравится использовать jQuery, но это действительно концептуальный вопрос.

Должен ли я создать функцию для повторного применения любых глобальных эффектов ссылок, или есть более умный способ, помимо этого, по частям?

+0

Как курьез, кто-нибудь знают, как .live() работает? Это тайм-аут или фактическое событие dom? Также может ли он обрабатывать более сложные фильтры, например, когда href соответствует набору требований? (начинается с http и т. д.) –

+2

@Bob: из [jQuery's docs] (http://api.jquery.com/live/#event-delegation): * Метод .live() способен влиять на элементы, которые не имеют но был добавлен в DOM с помощью делегирования событий: обработчик, связанный с элементом предка, отвечает за события, которые запускаются на его потомках. Прошел обработчик.live() никогда не привязан к элементу; вместо этого .live() связывает специальный обработчик с корнем дерева DOM. * - Таким образом, это похоже на 'delegate()', но работает в корне DOM, и поэтому обычно имеет смысл использовать [ 'делегат()'] (http://api.jquery.com/delegate/). – treeface

+1

@Bob: поскольку с помощью селектора выбираются только атрибуты, начинающиеся с «http», см. Раздел [атрибут jQuery начинается с селектора] (http://api.jquery.com/attribute-starts-with-selector/). В вашем случае вы делаете что-то вроде '$ ('a [href^=" http "'). Live (...)' – treeface

ответ

3

При использовании jQuery вы можете использовать метод .live().

Обычно, привязывая обработчик событий, обработчик события привязан к определенному набору элементов. Элементы, добавленные в будущем, не получают обработчик событий, если он не переустанавливается.

Метод jQuery .live() работает вокруг этого, связывая свой собственный специальный обработчик событий с корнем дерева DOM (полагаясь на пузырьковое событие). Когда вы нажимаете на элемент, если у него нет привязанного обработчика события, событие пузырится по дереву DOM. Специальный обработчик события jQuery ловит событие, смотрит на его цель и выполняет любые пользовательские обработчики событий, которые были назначены цели через .live().

+0

Отличное объяснение, спасибо! –

0

Посмотрите на функцию jQuery's live. Это позволит вам присоединяться к событиям, когда управление создается во время загрузки, и всякий раз, когда создаются новые. Существует штраф за производительность, но это не существенно, если вы не загружаете множество элементов.

0

Вы можете использовать метод jQuery .live(), чтобы добавить слушателей в элементы, созданные после завершения загрузки страницы. Использование примера ссылки выхода (если я правильно понимаю):

$(function(){ 
    $('a.exitLink').live('click',function(event){ /* do stuff when a link of class exitLink is clicked */); 
}); 

Это будет реагировать на click событие на любой ссылке класса exitLink, независимо от того, когда она была создана (до или после onload пожаров).

Надеется, что это помогает :)

0

Да просто положить, где вы, возможно, были это раньше:

$('selector').click(function() {}); 

Замените его:

$('selector').live('click', function() {}); 
Смежные вопросы