2010-01-05 4 views
4

Я добавляю новые элементы через jQuery в некоторые из моих проектов, и я наткнулся на немного громоздкой проблемы.Перерегистрировать события с помощью jQuery

Рассмотрим следующий пример:

$('span.claim').click(function() { 
    $(this).parent().html('<span class="unclaim">Unclaim</span>'): 
}); 

$('span.unclaim').click(function() { 
    $(this).parent().html('<span class="claim">Claim</span>'): 
}); 

И следующей разметке ...

<ul> 
    <li><span class="claim">Claim</span></li> 
    <li><span class="unclaim">Unclaim</span></li> 
    <li><span class="claim">Claim</span></li> 
    <li><span class="unclaim">Unclaim</span></li> 
</ul> 

К сожалению, после того, как начальное событие вызывается, не последующие события не обрабатываются.

Я понимаю, что могу полностью перестроить и использовать функцию .bind(), но из-за сложности моего проекта это на самом деле не все, что возможно.

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

+0

Любая причина для создания новых элементов HTML вместо изменения имени и имени класса при нажатии? – David

+0

Существует гораздо больше, чем просто создание элементов. Это просто предназначалось для простого примера того, что происходит, а не буквального. – Skudd

ответ

6

Вы, наверное, хотите посмотреть на JQuery живых событий: http://docs.jquery.com/Events/live

+0

+1 - Я не знал о живых, это очень, очень удобно. – sberry

+0

Это именно то, что мне нужно. Благодаря! – Skudd

+2

Метод live() заносится в jquery1.7. http://api.jquery.com/live/ – Yeonho

1

Вариант 1:

$('a.claim').click(function() { 
    $(this).html('Unclaim').addClass('unclaim').removeClass('claim'); 
}); 

$('a.unclaim').click(function() { 
    $(this).html('Claim').addClass('claim').removeClass('unclaim'); 
}); 

Вариант 2:

function bindClaim(){ 
$('a.claim').unbind('click').click(function() { 
    $(this).parent().html('<span class="unclaim">Unclaim</span>'); 
    bindUnclaim(); 
}); 
} 

function bindUnclaim(){ 
$('a.unclaim').unbind('click').click(function() { 
    $(this).parent().html('<span class="claim">Claim</span>'); 
    bindClaim(); 
}); 
} 

bindClaim(); 
bindUnclaim(); 

Вариант 3 (рекомендуется):

http://docs.jquery.com/Events/live вместо привязки.

+0

+1 для предоставления нескольких вариантов. – sberry

1

Нет необходимости в .live() или переустанавливать этот. Вам нужен только один метод:

$('.claim,.unclaim').click(function() { 
    var claimed = $(this).hasClass('claim') ? 'Unclaim' : 'Claim'; 
    $(this).text(claimed).attr('class', claimed.toLowerCase()); 
}); 
+0

Это не очень жизнеспособное решение из-за сложности реальных событий. Приведенный пример был предназначен только для простого примера; в каждом случае происходит нечто большее. – Skudd

+0

По-прежнему рекомендуется держать событие простым и применять методы в зависимости от цели (делегирование событий) – David

Смежные вопросы