2015-06-30 2 views
1

У меня есть это, и она отлично работает:высыхание JQuery селекторы

$(document).delegate("tr.updating input, tr.updating a, tr.updating label", 'click', function(event){ 

было бы лучше, хотя, чтобы не иметь три экземпляра «tr.updating» туда и вместо того, чтобы сделать что-то вдоль линий от "tr.updating (input|a|label)".

Какое кратчайшее (с точки зрения символов в селекторе) способ сделать это?

+2

Почему вы не используете 'on'? – epascarello

+0

Во-первых, вы действительно не можете сделать это из-за использования 'delegate()'. Во-вторых, 'delegate()' само устарел. Вместо этого вы должны использовать 'on()'. –

+0

Не уверен, но если ваш 'tr' имеет' input, a, label, span', и вам нужно нажать на первые 3; вы можете использовать '' tr.updating *: not (span) ''. ИМО селектор уже высох. –

ответ

2

tr.updating input, tr.updating a, tr.updating label предполагает, что у вас есть элементы внутри tr.

Так * - all selector могут быть использованы,

$(document).delegate("tr.updating *", 'click', function(event){ 

Если tr также другие элементы, которые нужно игнорировать, скажем span; использование

$(document).delegate("tr.updating *:not(span)", 'click', function(event){ 
+0

спасибо.На самом деле нет ничего особенного в отношении входов, а также ярлыков, это просто то, что я специально хотел предотвратить стандартное поведение кликов. * работает так же хорошо и на самом деле заранее ухаживает за другими вещами, о которых я мог забыть :) спасибо! –

+0

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

+0

@tic Селектор был уже уменьшен на 'tr'. Я согласен с использованием '> *'. Но * катастрофический * является преувеличением. Это просто предотвращение событий щелчка по умолчанию. –

0
$('tr.updating').on('click', 'input, a, label', function(e) { ... 
+3

Если элементы 'tr' динамически созданы или динамический класс добавляется динамически , это не сработает, но код OPs '.delegate() будет работать.Эта проблема в том, что делает это сложнее. – jfriend00

+0

Как @ jfriend00 говорит, что у меня есть динамически созданные элементы, поэтому нужно использовать делегат. –

-1

Вы можете использовать find

$('tr.updating').find('input,a,label').click(function(e) { 
}); 

или on

$('tr.updating').on('click', 'input,a,label', function(e) { 
}); 

https://jsfiddle.net/49z3917p/2/

+0

' find', в вашем 1-й и 3-й примеры не будут работать, потому что он добавляет события щелчка к элементам, присутствующим при загрузке страницы. Начало поиска на уровне документа не имеет значения: события все еще добавляются к элементам tr. код события находится в документе, поэтому c ачи снова добавлены элементы. –

+0

@MaxWilliams Из jsfiddle, который я опубликовал, он работает нормально. Удалите 'label' из селектора' find', и теперь только метки не будут запускать функцию – tic

+0

Не думаю, что ваш jsfiddle добавляет некоторые дополнительные строки после запуска исходного javascript, не так ли? (вот почему мне нужно использовать делегата) Если я чего-то не хватает. –

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