Comments 28
Сэнкс. Намекни пожалуйста, когда лучше создавать *свои* события? Нутро чует что это полезно, но в голову не приходит.
Можно trigger заменить на triggerHandler — он отменяет «bubbling», событие не будет передано родительским элементам
docs.jquery.com/Events/triggerHandler
docs.jquery.com/Events/triggerHandler
Чтоб избежать ошибки в выполнении, лучше всегда использовать namespaces.А возвращение false в обработчике не поможет предотвратить выполнение обработчика в родителе?
Нет, так не будет работать, потому как функция callback будет вызвана в контексте функции trigger которая не возвращает результат работы callback'a. Да и нельзя такое делать. Представим ситуацию, когда вы добавляете несколько слушателей с одним и тем же событием для одного и того же элемента. Допустим 3 слушателя.
$('#container').bind('some_event', function() {
console.info('first');
return false;
});
$('#container').bind('some_event', function() {
console.info(‘second');
});
$('#container').bind('some_event', function() {
console.info('three');
});
Если бы это работало, как вы говорите, то два callback’а которые добавлены двумя другими слушателями, просто бы не отработали, это породило бы множество ошибок.
$('#container').bind('some_event', function() {
console.info('first');
return false;
});
$('#container').bind('some_event', function() {
console.info(‘second');
});
$('#container').bind('some_event', function() {
console.info('three');
});
Если бы это работало, как вы говорите, то два callback’а которые добавлены двумя другими слушателями, просто бы не отработали, это породило бы множество ошибок.
Делать такое можно и return false отлично останавливает всплытие и обработку события браузером, например клик по линке. Кроме того это никак не повлияет на обработку события другими слушателями если такие имеются
В посте я рассматривал не событие «click», посмотрите пример выше. Вы немного не в ту сторону смотрите. Для данного примере, ваше утверждение несправедливо.
Справедливо. return false останавливает всплытие для любого (пользовательского или системного) события, но не отменяет выполнения других обработчиков для этого события.
Т.е. утверждение
неверно
Т.е. утверждение
Если бы это работало, как вы говорите, то два callback’а которые добавлены двумя другими слушателями, просто бы не отработали, это породило бы множество ошибок.
неверно
Не понял, а причем здесь всплытие события, если в комменте обсуждали обработку этого события? я как раз и писал о слушателях события, и к этому и пример привел. Может я просто не так выразился и сбил вас столку.
Постараюсь обьяснить позицию.
На коммент
Вы ответили см. habrahabr.ru/blogs/jquery/70760/#comment_2022846
И были неправы. Т.к. return false предотвращает обработку события в родителе (предовращает всплытие события), return false НЕ предотвращает обработку других слушателей этого же события. Т.е. весь коментарий неверен. Это я и пытался исправить.
На коммент
А возвращение false в обработчике не поможет предотвратить выполнение обработчика в родителе?
Вы ответили см. habrahabr.ru/blogs/jquery/70760/#comment_2022846
И были неправы. Т.к. return false предотвращает обработку события в родителе (предовращает всплытие события), return false НЕ предотвращает обработку других слушателей этого же события. Т.е. весь коментарий неверен. Это я и пытался исправить.
namespace указывается после типа события, должно быть: some_event.container и some_event.subcontainer соответственно, как мне кажется.
Да, вы правы, посмотрел в документации
http://docs.jquery.com/Namespaced_Events
исправил в посте, спасибо
http://docs.jquery.com/Namespaced_Events
исправил в посте, спасибо
Возможно, немного не в статье, но тоже про события… гугл мне ничем не помог…
Как разделить в jQuery события Click и DblClick ??
Т.е. если в скрипте отслеживается 2 разных события (и выполняются различные действия), то при событии DblClick всегда вначале отлавливается и исполняется одиночный клик, и только после этого срабатывает «двойной». Каким образом их можно разделить?
Как разделить в jQuery события Click и DblClick ??
Т.е. если в скрипте отслеживается 2 разных события (и выполняются различные действия), то при событии DblClick всегда вначале отлавливается и исполняется одиночный клик, и только после этого срабатывает «двойной». Каким образом их можно разделить?
например проверить тип события о брабатывать нужный
if(event.type=='click'){..}
if(event.type=='click'){..}
поставил проверку
$('#work').click(function(e){
if (e.type=='dblclick'){alert(«TWO!»);}
if (e.type=='click'){alert(«ONE!»);}
Все равно ловит только «клик», до «Дабла» проверка не доходит… :(
$('#work').click(function(e){
if (e.type=='dblclick'){alert(«TWO!»);}
if (e.type=='click'){alert(«ONE!»);}
Все равно ловит только «клик», до «Дабла» проверка не доходит… :(
А это потому что алерт вызывает модальное окно, и второй клик, который и должен был вызвать обработку dblclick обрабатывает алерт. Если поставить задержку на выполнение кода, то dblclick обработается.
И конечно же нужно биндить оба события
$('#work').bind('click',function(e){})
И конечно же нужно биндить оба события
$('#work').bind('click',function(e){})
…
и
и
блин, сообщения сами коммитятся…
И конечно же нужно биндить оба события
$('#work').bind('click',function(e){})
$('#work').bind('dblclick',function(e){})
если прицепить таймер на клик, то по дблклику его нужно обнулять и код клика не будет обрабатыватся
И конечно же нужно биндить оба события
$('#work').bind('click',function(e){})
$('#work').bind('dblclick',function(e){})
если прицепить таймер на клик, то по дблклику его нужно обнулять и код клика не будет обрабатыватся
погодите, но в js нет такого понятия как пауза (вроде как?!).
Или же в бинде на «клик» все завернуть в функцию и именно ее вызывать через setTimeOut ???
Или я не правильно Вас понял?
P.S. Прошу прощения если «туплю» :)
Или же в бинде на «клик» все завернуть в функцию и именно ее вызывать через setTimeOut ???
Или я не правильно Вас понял?
P.S. Прошу прощения если «туплю» :)
совершенно верно. а в дблклике очищать таймер.
примерно так:
var clickTimer;
$('#container').bind('click', function(){
clickTimer = setTimeout('alert(«Click»)', 200);
});
$('#container').bind('dblclick', function(){
clearTimeout(clickTimer);
alert('dblclick');
});
примерно так:
var clickTimer;
$('#container').bind('click', function(){
clickTimer = setTimeout('alert(«Click»)', 200);
});
$('#container').bind('dblclick', function(){
clearTimeout(clickTimer);
alert('dblclick');
});
Огромное спасибо!
Поблагодарить плюсиком не хватает «заряда»… :(
Правда теперь столкнулся с проблемой передачи объекта вызываемой функции… т.е. у меня:
var clickTimer;
$('#work').dblclick(function(e){
clickTimer=1;
alert('dblclick');
});
//Обработка события CLICK в рабочей области
$('#work').click(function(e){
clickTimer=0;
CaseClick(e);
});
function CaseClick (e){
if (clickTimer==1){return false;}
var clicked = $(e.target);
if (clicked.attr(«class»)=='run') {
e.preventDefault();
… и т.д.
если пытаюсь вызвать СaseClick через
setTimeout(function(e){CaseClick(e)}, 200);
он теряет объект и показывает «в никуда»…
Погуглил — говорят, что это ограничение JS, как выход — объявление глобального объекта, но ИМХО — это как то криво… Может есть красивее решение, как его передать?
P.S. Вне зависимости, еще раз СПАСИБО!
Поблагодарить плюсиком не хватает «заряда»… :(
Правда теперь столкнулся с проблемой передачи объекта вызываемой функции… т.е. у меня:
var clickTimer;
$('#work').dblclick(function(e){
clickTimer=1;
alert('dblclick');
});
//Обработка события CLICK в рабочей области
$('#work').click(function(e){
clickTimer=0;
CaseClick(e);
});
function CaseClick (e){
if (clickTimer==1){return false;}
var clicked = $(e.target);
if (clicked.attr(«class»)=='run') {
e.preventDefault();
… и т.д.
если пытаюсь вызвать СaseClick через
setTimeout(function(e){CaseClick(e)}, 200);
он теряет объект и показывает «в никуда»…
Погуглил — говорят, что это ограничение JS, как выход — объявление глобального объекта, но ИМХО — это как то криво… Может есть красивее решение, как его передать?
P.S. Вне зависимости, еще раз СПАСИБО!
решается с пом замыкания
на хабре было пару статей на эту тему
в Вашем случае будет примерно так:
setTimeout(
(function(event){
return function(){CaseClick(event)}
})(e)
, 200);
на хабре было пару статей на эту тему
в Вашем случае будет примерно так:
setTimeout(
(function(event){
return function(){CaseClick(event)}
})(e)
, 200);
Заработало!
Еще раз ОГРОМНОЕ спасибо!
Вчера весь день на эти замыкания убил, с return видать не домудрил что то, вчера не работало никак. Сейчас тупо Вашу строчку скопипастил и все заработало как часики… :)
Еще раз ОГРОМНОЕ спасибо!
Вчера весь день на эти замыкания убил, с return видать не домудрил что то, вчера не работало никак. Сейчас тупо Вашу строчку скопипастил и все заработало как часики… :)
Sign up to leave a comment.
Еще раз о делегирование или как правильно использовать свои события