2015-07-22 7 views
-1

У меня есть элемент <i>, имеющий класс comment-action edit-comment.jQuery: не селектор не применяется

Я слушаю на click событие на этом элементе и сразу вызвал добавить дополнительный класс disabled ко всем этим <i> с:

$('.comment-action.edit-comment').on('click', function(){ 
    this.addClass('disabled'); 
    // another logic ... 
}); 

Это приводит к небольшому изменению слушателя событий, таким образом, чтобы быть

$('.comment-action.edit-comment:not(.disabled)').on('click', function(){ /* ... */ }); 

К сожалению, это похоже, что селектор :not() полностью игнорируется, так как нажатие на <i> с классом disabled по-прежнему вызывает событие li Stener.

Я также попытался более читаемый вид:

$('.comment-action.edit-comment').not('.disabled').on('click', function(){ /* ... */ }); 

с тем же результатом (как я и ожидал).

Любая идея, где есть улов?

+0

$ ('. Comment-action.edit-comment').? означает использование двух разных классов или что? else создать jsfiddle для получения дополнительной помощи coz кажется, что селектор неверен –

+0

@HimeshAadeshara Не отвечайте, если вы не понимаете основы ... jQuery selector '$ ('. comment-action.edit-comment')' будет выбирать все HTML-элементы, имеющие 'class =" комментарий-действие edit-comment "' ... Соответственно '$ ('. Comment-action.edit-comment: not (.disabled) ') '** не должен ** выбирать элемент, имеющий' class = "комментарий-действие edit-comment disabled" '. – shadyyx

ответ

3

Когда вы устанавливаете свои события, вы устанавливаете их непосредственно на каждый элемент, который соответствует. Все, что связано с комментарием и классом редактирования-комментария, имеет событие, когда оно загружается. Даже когда вы добавляете: not (.disabled), так как эти элементы не имеют отключенного класса при загрузке страницы, он соответствует.

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

$(document).on('click', '.comment-action.edit-comment:not(.disabled)', function() { 
    //... 
}); 

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

+0

Да, вот ссылка на [$() .on()] (http://api.jquery.com/on/#direct-and-delegated-events). Вы также увидите, что это называется событиями, «пузырящимися». – AndrewR

2

Причина:

Проблема с

$('.comment-action.edit-comment:not(.disabled)') 

и

$('.comment-action.edit-comment').not('.disabled') 

является то, что он проверяет, если селектор, не имеющий класс disabled в момент связывания события, а не при возникновении события.

Решение:

Вы можете проверить, если целевой элемент имеет disabled класс в обработчик событий. Если элемент clicked имеет класс, вы можете использовать return false в начале обработчика события. Так что код обработчика не выполняется.

$('.comment-action.edit-comment').on('click', function() { 
    if ($(this).hasClass('disabled')) { 
     return false; 
    } 

    /* Code Here */ 
}); 
Смежные вопросы