2009-10-27 45 views
4

我寫了一個綁定到頁面上8個元素的jQuery插件,我想用.live()將點擊操作綁定到鏈接在每個元素中。當你點擊鏈接時,它應該使用ajax發佈一個表單。問題是所有8個元素的所有鏈接都提交頁面上第一個元素的表單。當我使用.click()時,一切正常。我寧願使用.live(),因爲我將動態添加更多元素。jQuery .live('click')只綁定頁面上的第一個元素

這是類似於我在做什麼一些代碼:

var $container = $(this); 
var $form  = $container.find('form.some_form'); 
var $button = $container.find('a.some_link'); 

這隻會提交表單的第一個元素:

$button 
.live('click', function() { 
    // some code that submits $form via ajax 
}); 

然而,這總是提交正確的表格:

$button 
.click(function() { 
    // identical code that submits $form via ajax 
}); 

有什麼關於.live(),我應該知道嗎?難住了。

回答

9

jQuery documentation:當 針對選擇使用

現場活動目前只工作。例如, 這將工作:$(「li a」)。live(...) 但這不會:$(「a」, someElement).live(...)和 會這樣: $( 「A」)。父()。住(...)。

在你的情況下,你調用了一個find()調用結果的變量的live()。這不是選擇器。你需要找出一個標識你想要的元素的選擇器。


編輯補充:任何人發現這個後,首選的方法是現在使用的功能on()這一點。 on()函數沒有相同的限制 - 因爲它在jQuery對象上運行(而不是隱式綁定到文檔),所以它可以設置在原始問題中通過鏈接到達的一組元素上。

+0

這將解釋奇怪的行爲:)在這種情況下,我沒有看到任何使用.live()替換.click()的好方法...猜猜我插入新元素後插入新元素DOM,當然不是世界的盡頭。 – a10s 2009-10-28 03:45:03

+0

你應該能夠通過連接容器的ID(假設它有一個)和你想要的元素/類來構造一個選擇器。例如,如果您的容器的ID爲「myDiv」,那麼您可以執行$(「#myDiv> a.some_link」)。live()。您可能需要通過執行類似「#」+ this.id +「> a.some_link」的方式來構建該選擇器字符串,但這應該是可能的。 – 2009-10-28 13:12:35

2

嘗試這樣的事情。除了選擇器之外,您不能使用「live」。

$('a.some_link').live('click', function() { 
    // some code that submits $form via ajax 
}); 

希望它有幫助!

+1

海報可能需要比這更復雜的選擇器,因爲它看起來像他正在尋找與您選擇器相匹配的元素,但只在給定的容器內。但目前還不清楚容器是什麼。 – 2009-10-27 17:43:26

+0

@JacobM你的權利!我確實認爲你的回答說明瞭一切。如果我在回覆之前看過你的帖子,我可能不會去別的地方! ;) – Frankie 2009-10-27 18:01:07

相關問題