2010-05-25 4 views
12

У меня есть два divs, один из которых содержит некоторые вещи, а другой - все возможное. Щелчок по одному из divs перенесет элементы в другой div. Код, который я придумал это:jQuery: Любой способ «обновить» обработчики событий?

$("#holder > *").each(function() { 
    $(this).click(function(e) { 
     $(this).remove(); 
     $("#bucket").append(this); 
    }); 
}); 

$("#bucket > *").each(function() { 
    $(this).click(function(e) { 
     $(this).remove(); 
     $("#holder").append(this); 
     }); 
}); 

Это один работает отлично, за исключением того, что обработчики событий должны быть обновлены, как только я добавить или удалить элементы. Я имею в виду, что если я сначала нажму на элемент, он будет добавлен в другой div, но если я снова нажму на этот элемент, ничего не произойдет. Я могу сделать это вручную, но есть ли лучший способ достичь этого?

ответ

20

Попробуйте jquery live events .. $ .live (eventname, function) будет привязываться к любым текущим элементам, которые соответствуют, а также к элементам, добавленным в Dom в будущем с помощью обработки javascript.

пример:

$("#holder > *").live("click", function(e) { 
     $(this).remove(); 
     $("#bucket").append(this); 
}); 

$("#bucket > *").live("click", function(e) { 
     $(this).remove(); 
     $("#holder").append(this); 
}); 

Важно:

Обратите внимание, что $.live с тех пор были удалены из JQuery (1.9 и выше), и что вы должны использовать вместо $.on.

Я предлагаю вам обратиться к this answer за обновленным примером.

+0

@John: Спасибо за ответ. Я не уверен, что мне не хватает, но когда я заменяю свой код этим, ничего не происходит. Я использую jQuery-1.4.2.Я что-то упускаю? Я имею в виду, что даже начальные события не работают. – Legend

+1

Это не сработает. 'jQuery.fn.live' нужен селектор для работы с ... он не может работать с' $ (this) '... – James

+0

Я так думаю. Я знал, что «это» все испортило. – Legend

1

Вы посмотрели функцию jQuery's live?

+0

Спасибо за указатели. В настоящее время смотрю на это. – Legend

+1

'live' устарел – craned

2

РЕДАКТИРОВАТЬ: не использовать вживую, это не рекомендуется!

Воспользуйтесь тем, что события пузырь. Использование .on():

var = function(el1, el2) { 

var things = $('#holder, #bucket'); 
things.each(function(index) { 
    // for every click on or in this element 
    things.eq(index).on('click', '> *', function() { 
    // append will remove the element 
    // Number(!0) => 1, Number(!1) => 0 
    things.eq(Number(!index)).append(this); 
    }); 
}); 

любой нажмите на любой элемент (существующий в момент привязки или нет) будет пузыриться (если вы не вручную захватили событие и прекратил распространение). Таким образом, вы можете использовать это event delegation для привязки только двух событий, по одному на каждый контейнер. Каждый щелчок, который прошел тест на селектор 2-го аргумента (в данном случае, > *, удалит что элемента, а затем добавить его в альтернативный контейнер, как accesesed по things.eq(Number(!index))

+0

Собственно, это не так. Если вы не хотите отвязать/открепить, когда элементы добавлены в DOM. Я думаю, вы хотите сказать .live ('click', function() { –

+0

Насколько я понимаю, bind не работает с будущими элементами, но только с элементами, которые в данный момент соответствуют данному селектору [цитата из документации 'live' в jQuery) : «Этот новый элемент также соответствует селектору .clickme, но поскольку он был добавлен после вызова функции .bind(), клики на нем ничего не сделают». –

+0

Я действительно имел в виду. Живет, сижу за путаницу - я подбирал свою подругу и спешил печатать ее на своем телефоне и набрал bind из habbit, lol –

6

Здесь вы идете, используя более интуитивный delegate API: ..

var holder = $('#holder'), 
    bucket = $('#bucket'); 

holder.delegate('*', 'click', function(e) { 
    $(this).remove(); 
    bucket.append(this); 
}); 

bucket.delegate('*', 'click', function(e) { 
    $(this).remove(); 
    holder.append(this); 
}); 
+0

@ J-P: Ahh ... Просто принял решение Джона. +1 за помощь. Как любопытство, есть ли какие-либо преимущества, связанные с использованием делегата над живым? – Legend

+0

@Legend, Да, это быстрее, потому что это не требует лишнего выбора '#header> *' и '#bucket> *' first. – James

+0

@ J-P: Делает смысл. Спасибо за объяснение. – Legend

1

во-первых, live осуждается во-вторых, освежающий, не то, что вы хотите, Вам просто нужно прикрепить обработчик щелчка к правильному источнику, в данном случае: документ

Wh. en do

$(document).on('click', <id or class of element>, <function>); 

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

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