- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Маркетинг для шоколадной фабрики. На 34% выше средний чек
Через устранение узких мест
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
В итоге мы по клику на первую из ссылок имеем 2 алерта.
Вопрос: как сделать так чтобы JQuery не назначал обработчик на OnClick элемента класса, если он там уже есть?
Dreammaker добавил 29.03.2009 в 19:56
update: Для конкретно своей задачи решил появившимся в 1.3.x методом live() .
У меня часть элементов уже существует при генерации страницы, а часть подгружается через ajax и вот, на при подгрузке обработчик вешался не только на последний элемент, но и на всё предыдущие, а они уже имели такой же.
Использование live вешает такой обработчик только на новосозданный элемент. Хотя субъективное ощущение, навешенная функция отработчик немного тормознее в этом случае работает.
О live можно прочитать вот здесь (собсно я, по этому блогу и разобрался): http://www.jstoolbox.com/2009/02/13/dinamicheskoe-naznachenie-obrabotchikov-sobytij-v-jquery-13/
Но всё же хотелось бы и знать решение задачи в чистом виде описанной в начале.
как-то слишком извращенно....
может вот это Вам поможет: http://docs.jquery.com/Events/unbind#typefn
DJ_AlieN, спасибо, на досуге попробую (сейчас сходу завести не получилось, а вот с live() вроде работает :) ).
Вот еще более красивый вариант:
http://docs.jquery.com/Selectors/attributeNotEqual#attributevalue
$("a.ajaxtest").click(function(){
нужно всего лишь заменить на
т.е. эвент пропишется только тому, где нету onClick
DJ_AlieN, хм, по-моему этот вариант касается только аттрибутов, а не эвентов.. :)
Нууу, все правильно!
Если аттрибут onclick не равен 123 или он отсуствует, то вешаем событие на эвент click
Добавлено
Быть может Вы внесете больше деталей в смысл этих манипуляций? :)
Добавлено2
Может быть эта ссылка первая появляется позже генерации страницы? Тогда можно снять онклики после события "появление ссылки":
$("a.ajaxtest").attr('onclick','');
DJ_AlieN, в базе хранятся данные о картинках привязанных к странице. Они выводятся в виде списка ul - li . В li там hidden поле с id картинки, картинка-ссылка зацепляя которую можно двигать картинки и менять их порядок + ссылка Delete. На onClick Delete висит запрос на удаление картинки. То есть, кликаем на Delete выскакивает запрос Да/Нет. Удалили.
Но, если картинка подгружается аяксом, то когда мы пытаемся прописать
эвент onclick путям запуска handleDeleteImage2()
то мы получаем, что он прописывается не только к ссылке в новосозданном блоке, но и ко всем остальным, при том, что не обращая внимания что там уже что-то присвоено. В реальности это выражается в том, что диалог Да/Нет, при удалении выскакивает по несколько раз за один клик.
Насколько я понял наиболее кошерным в моём случае будет использование именно live() ибо для этого он и создавался...
http://docs.jquery.com/Namespaced_Events
Давайте по порядку:
1) Функция, которую надо исполнить при клике на ссылку
2) Функция, которая присвоит onclick всем <a> класса ajaxtest без аттрибута onclick
3) HTML-код:
после каждого обновления ссылок нужно запускать BindOnClick
Обратите внимание, у первого элемента в коде нету onClick т.к. он пропишется автоматом.
В данном случае примочка НЕ НУЖНА ибо вариантов исполнения того что Вам нужно втроенными средствами в jQuery предостаточно
По моему стоит пересмотреть организацию самого процесса загрузки изображения.
Если загружая новое изображения вы добавляете в документ новый узел, то у него не может быть какого-либо обработчика и не должно возникнуть конфликтов если добавлять событие только вновь добавленному узлу.
Если же вы не добавляете новый узел а просто меняете его атрибуты или содержимое то у его просто этот обработчик уже есть и ничего с событиями делать не надо.
Дальше если используете Jquery может изящней будет сделать так:
и затем в программе вызывать только для нужных элементов что то вроде:
или когда добавляете новый узел
Обратите внимание, у первого элемента в коде нету onClick т.к. он пропишется автоматом.
тьфу, я уже сам себя запутал - сейчас гляну л первоначальный код, который ко мне попал и там был, как раз описанный вами случай. Первоначально у сcылки не было события, но после каждого "навешивания" на ссылки, он дублировался, и чем больше раз цеплялся новый узел, тем больше обработчиков висело на одной отдельно взятой ссылке.
2) Функция, которая присвоит onclick всем <a> класса ajaxtest без аттрибута onclick
Так-с, только теперь начинаю понимать, что вы имели в виду (надеюсь это для меня простительно, ибо JQeury я первый раз, как разработчик увидел вчера или позавчера :) ).
Вам нужно втроенными средствами в jQuery предостаточно
собсно live насколько я понимаю это как раз и есть встроенное средство, правда, начиная с версий 1.3.x
Я не буду трогать, что уже сделал с точки зрения "работает - не трогай" :), но ваш вариант буду иметь в виду на будущее.
http://docs.jquery.com/Namespaced_Events
Тоже интересный вариант, хотя кажется немного здесь идёт усложнение процесса.
$(document).ready(function(){ $("a.ajaxtest").handleDeleteImage2(); }
где-то из-за такого и навешивались по нескольку раз события. Или я же что-то не понимаю.
$(someNewNode).handleDeleteImage2();
Вот этот вариант довольно интересен я о нём не подумал, точнее думал, но сходу не мог придумать как получать id новодобавленного элемента. Уставший моск не мог придумать, что его можно генерировать. :)