2009-10-27 4 views
4

Я написал плагин jQuery, который связывает 8 элементов на странице, и я хотел использовать .live() для привязки действия click к ссылке в каждом элементе. Когда вы нажимаете ссылку, она должна отправить форму с помощью 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 (...) и ни не будет: $ ("а"). родитель(). жить (...).

В вашем случае вы вызываете live() на переменную, которая является результатом вызова find(). Это не селектор. Вам нужно определить селектор, который идентифицирует нужные элементы.


Edited добавить: для тех, кто найти это позже, предпочтительный подход в настоящее время является использование функции on() для этого. Функция on() не имеет того же ограничения - поскольку она работает с объектом jQuery (а не подразумевает привязку к документу), его можно установить на набор элементов, полученных посредством цепочки, как в исходном вопросе.

+0

Это объясняет странное поведение :) В этом случае я не вижу никакого приятного способа использования .live() для замены .click() ... думаю, я просто обновляю свой плагин после вставки новых элементов в DOM, конечно, не конец света. – a10s

+0

Вы должны иметь возможность построить селектор, объединив идентификатор контейнера (при условии, что он есть) с нужным элементом/классом. Например, если в вашем контейнере есть идентификатор «myDiv», вы можете сделать $ («# myDiv> a.some_link»). Live(). Возможно, вам придется построить эту селекторную строку на лету, сделав что-то вроде «#» + this.id + »> a.some_link», но это должно быть возможно. –

2

Попробуйте что-нибудь подобное. Вы не можете использовать «живой», кроме селекторов.

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

Надеюсь, это поможет!

+1

Возможно, для плаката может понадобиться более сложный селектор, поскольку он выглядит так, будто он ищет элементы, которые соответствуют выбранному вами селектору, но только внутри данного контейнера. Но неясно, что такое контейнер. –

+0

@ JacobM ваше право! Я думаю, ваш ответ говорит все. Если бы я видел ваше сообщение до моего ответа, и я, вероятно, не поеду куда-нибудь еще! ;) – Frankie

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