2010-05-25 15 views
12

我有兩個div,一個擁有一些東西,另一個擁有所有可能的東西。點擊其中一個div將傳送項目到其他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)將綁定到任何當前匹配的元素以及未來通過JavaScript操作添加到Dom中的元素。

例如:

$("#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 2010-05-25 22:10:18

+1

這不起作用。 'jQuery.fn.live'需要一個選擇器來處理...它不能與'$(this)'一起工作...... – James 2010-05-25 22:11:58

+0

我想是的。我知道「這個」正在搞亂事情。 – Legend 2010-05-25 22:13:21

1

你看過jQuery的live函數嗎?

+0

感謝您的指點。目前在看。 – Legend 2010-05-25 22:13:41

+1

'live'已被棄用 – craned 2016-03-03 17:50:15

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); 
    }); 
}); 

任何點擊任何元件(存在於綁定的時間或不)將冒泡(假設你沒有手動捕獲的事件並停止傳播)。因此,您可以使用該綁定僅綁定兩個事件,每個容器上一個事件。途經的第二個參數的選擇測試(在這種情況下,每一次點擊,> *,將刪除元素,然後將其追加到備用容器由things.eq(Number(!index))

+0

其實,它不會。除非你的意思是在元素被添加到DOM的時候解除綁定/重新綁定。我認爲你的意思是說.live('click',function(){ – 2010-05-25 22:01:03

+0

我的理解是,綁定不適用於未來的項目,但只有當前匹配給定選擇器的元素[引用jQuery中的'活躍'文檔) :「這個新元素也與選擇器.clickme相匹配,但由於它是在調用.bind()之後添加的,所以點擊它將什麼都不會做。」 – 2010-05-25 22:01:28

+0

我的意思是。活着,爲了混淆sry - 我正在接我的女朋友,急着在我的手機上輸入並鍵入habbit,lol – 2010-05-25 22:53:29

6

在這裏,你去當accesesed,使用更直觀的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:啊......剛接受約翰的解決方案。 +1的幫助。就好奇而言,使用委託在現場有什麼優勢嗎? – Legend 2010-05-25 22:17:46

+0

@Legend,是的,速度更快,因爲它不需要先冗餘地選擇'#header> *'和'#bucket> *'。 – James 2010-05-25 22:20:08

+0

@ J-P:有道理。感謝您的解釋。 – Legend 2010-05-25 22:25:50

1

首先,live已被棄用二,耳目一新的是不是你想要的你只需要點擊處理程序附加到右源,在這種情況下:文檔

瓦時。你做

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

點擊處理程序附加到文檔。加載頁面後,點擊處理程序將附加到元素的特定實例。當頁面重新加載時,該特定的實例不見了,所以處理程序不會註冊任何點擊。但頁面仍然如此將點擊處理程序附加到文檔。簡單而簡單。