Jquery игнорирует элементы с «отключенным» классом

#javascript #jquery

#javascript #jquery

Вопрос:

Я использую jquery и создаю обработчики событий, подобные этому:

 $('#some_selector a.add').live('click', function(){...});
  

Однако мне не нужно выполнять обработчики, когда элемент имеет disabled класс. Затем я написал следующее, чтобы добиться этого:

 $('#some_selector a.add:not(.disabled)').live('click', function(){...});
  

Но я устал следить за всеми местами, которые мне нужно добавить :not(.disabled) , иногда я забываю добавить это и так далее. Более того, если у меня есть элемент привязки, и мой обработчик предотвращает действие по умолчанию над ним, добавление :not(.disabled) приведет к тому, что браузер откроет следующую страницу вместо того, чтобы ничего не делать.

Итак, есть ли способ настроить автоматическое отключение при выполнении обработчика, когда элемент удовлетворяет некоторому условию (например, наличие «отключенного» класса)?

Ответ №1:

Вот что вы можете сделать:

Во-первых, привяжите обработчик событий к .disabled элементам, который предотвращает выполнение других обработчиков и предотвращает действие по умолчанию:

 $('#some_selector a.add.disabled').live('click', function(event){
    event.stopImmediatePropagation();
    event.preventDefault();
});
  

Затем вы можете связать свои другие обработчики событий, как вы делали раньше. Поскольку обработчики событий выполняются в том порядке, в котором они были привязаны, обработчик событий для disabled элементов всегда будет выполняться первым и препятствовать выполнению других обработчиков (через stopImmediatePropagation [docs] ).

ДЕМОНСТРАЦИЯ

Комментарии:

1. Хороший трюк! Но я не могу понять, как гарантируется, что этот обработчик будет выполнен первым? Я пытался использовать just event.stopPropagation() и event.preventDefault() , но это не сработало таким образом.

2. @dragoon: stopPropagation не будет работать из-за способа live работы. Порядок выполнения гарантируется jQuery. Я не могу сказать вам, как именно они это делают, но исходный код находится в свободном доступе 😉 Anwyays, вам действительно следует рассмотреть ответ @mu, который семантически более правильный.

Ответ №2:

Вы могли бы использовать <button> вместо <a> для этого. A <button> с установленным disabled атрибутом вообще не будет реагировать на клики:

Отключенный элемент управления формой должен предотвращать click отправку в элемент любых событий, которые находятся в очереди в источнике задачи взаимодействия с пользователем.

Например: http://jsfiddle.net/ambiguous/sCv8n /

Вы также можете стилизовать a <button> так, чтобы он выглядел практически так, как вы хотите.

Комментарии:

1. Спасибо, хорошее решение, но, к сожалению, для замены всех моих якорей необходимо выполнить неизвестный объем работы (проверьте css, селекторы рефакторинга), но я буду иметь это в виду на будущее.

2. @dragoon: я так и думал, но подумал, что это стоит упомянуть в любом случае. Жаль, что реальность продолжает мешать правильности 🙂