Лучший способ добавить исключения в пути селекторов jquery - PullRequest
4 голосов
/ 03 марта 2012

скажем, я хочу связать все элементы, которые находятся под

#mainDiv .user

За исключением

#mainDiv #exception .user

Я могу думать о

$('#mainDiv .user').bind('event',function(){
    if($(this).parents('#exception').length>0){}else{
       // do stuff;   
    }

});

или:

$('#mainDiv :not('#exception').find('.user').bind('event',function(){
    if($(this).parents('#exception').length>0){}else{
       // do stuff;   
    }

});

Что лучше?

Ответы [ 3 ]

14 голосов
/ 03 марта 2012

Я мог бы предложить вместо этого что-то вроде

$('#mainDiv .user').not('#mainDiv #exception .user').bind('event',function()
{
    //do stuff
});

функция not () берет ранее существующий набор jquery и удаляет из него элементы, которые соответствуют критериям селектора, переданного в качестве параметра.

предварительная фильтрация пула является более чистой и более производительной (вероятно, это не имеет значения, но это хорошая практика), чем использование и селектора, и оператора if, а после фильтрации оператор if не нужен. *

В качестве дополнительного примечания фильтрация для "#mainDiv #exception .user" кажется мне странной. «#exception» должен быть уникальным уникальным идентификатором - если вы не уверены, что по какой-то причине «#mainDiv» может быть потомком «#exception».

2 голосов
/ 03 марта 2012

Сначала получите все элементы, затем удалите те, которые вы хотите исключить:

$('#mainDiv .user').not('#mainDiv #exception .user').bind('event', function(){
  // do stuff
});
0 голосов
/ 03 марта 2012

Я бы делегировал событие:

$( '#mainDiv' ).on( 'event', '.user', function () {

    if ( $( this ).parent().is( '#exception' ) ) { return; }

    // do your thing

});

Вы также можете сделать this.parentNode.id === 'exception' проверку ...

...