Pull to refresh

Comments 28

Сэнкс. Намекни пожалуйста, когда лучше создавать *свои* события? Нутро чует что это полезно, но в голову не приходит.
Спасибо, буду знать и о таком решении данной задачи.
Чтоб избежать ошибки в выполнении, лучше всегда использовать 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’а которые добавлены двумя другими слушателями, просто бы не отработали, это породило бы множество ошибок.
Делать такое можно и return false отлично останавливает всплытие и обработку события браузером, например клик по линке. Кроме того это никак не повлияет на обработку события другими слушателями если такие имеются
В посте я рассматривал не событие «click», посмотрите пример выше. Вы немного не в ту сторону смотрите. Для данного примере, ваше утверждение несправедливо.
Справедливо. return false останавливает всплытие для любого (пользовательского или системного) события, но не отменяет выполнения других обработчиков для этого события.

Т.е. утверждение
Если бы это работало, как вы говорите, то два callback’а которые добавлены двумя другими слушателями, просто бы не отработали, это породило бы множество ошибок.

неверно
Не понял, а причем здесь всплытие события, если в комменте обсуждали обработку этого события? я как раз и писал о слушателях события, и к этому и пример привел. Может я просто не так выразился и сбил вас столку.
Постараюсь обьяснить позицию.
На коммент
А возвращение false в обработчике не поможет предотвратить выполнение обработчика в родителе?


Вы ответили см. habrahabr.ru/blogs/jquery/70760/#comment_2022846

И были неправы. Т.к. return false предотвращает обработку события в родителе (предовращает всплытие события), return false НЕ предотвращает обработку других слушателей этого же события. Т.е. весь коментарий неверен. Это я и пытался исправить.
Все спасибо, понял и проверил, действительно я ошибся, именно для родителя оно прекращает обработку. В споре рождается истина :) и в данном случае я для себя кое-что подчеркнул и это радует.
Всегда рад помочь в поисках истины )
namespace указывается после типа события, должно быть: some_event.container и some_event.subcontainer соответственно, как мне кажется.
Возможно, немного не в статье, но тоже про события… гугл мне ничем не помог…

Как разделить в jQuery события Click и DblClick ??
Т.е. если в скрипте отслеживается 2 разных события (и выполняются различные действия), то при событии DblClick всегда вначале отлавливается и исполняется одиночный клик, и только после этого срабатывает «двойной». Каким образом их можно разделить?
например проверить тип события о брабатывать нужный
if(event.type=='click'){..}
поставил проверку

$('#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('dblclick',function(e){})

если прицепить таймер на клик, то по дблклику его нужно обнулять и код клика не будет обрабатыватся
погодите, но в js нет такого понятия как пауза (вроде как?!).

Или же в бинде на «клик» все завернуть в функцию и именно ее вызывать через setTimeOut ???

Или я не правильно Вас понял?

P.S. Прошу прощения если «туплю» :)
совершенно верно. а в дблклике очищать таймер.
примерно так:
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. Вне зависимости, еще раз СПАСИБО!
решается с пом замыкания
на хабре было пару статей на эту тему

в Вашем случае будет примерно так:
setTimeout(
(function(event){
return function(){CaseClick(event)}
})(e)
, 200);

Заработало!
Еще раз ОГРОМНОЕ спасибо!

Вчера весь день на эти замыкания убил, с return видать не домудрил что то, вчера не работало никак. Сейчас тупо Вашу строчку скопипастил и все заработало как часики… :)
Пожалуйста. Но замыкания таки нужно освоить, открывает новые возможности в программирование на js.

P.S. И не верте тем кто говорит что у JS есть ограничения.
Sign up to leave a comment.

Articles