Обработчик срабатывает сразу же после установки
Хочу еще раз вернуться к вопросу установки обработчика событий внутри функции.
Функция show_edite_sub_menu вызывается при правом клике по элементу. Она добавляет контекстное меню, которое будет скрываться при клике в любой области отличной от контекстного меню(обработчик $('body').on('mousedown.poper',function....). Проблема в том, что установку этого обработчика приходится обертывать в setTimeout, иначе получается, что контекстное меню создается и сразу же скрывается, т.к. обработчик $('body').on('mousedown.poper' устанавливается и сразу же запускается. Можно как-то изменить код, чтобы не пользоваться таймаутом или это невозможно? show_edite_sub_menu:function(e){ if(e.which!=3) return; elem=$(e.currentTarget); shape=this.sh_context_menu.clone(); var offset = elem.offset(); var relativeX = (e.pageX - offset.left); var relativeY = (e.pageY - offset.top); shape.css({left:relativeX,right:relativeY}); setTimeout(function(){ $('body').on('mousedown.poper',function(e){ console.log('dele'); //Код скрытия $('body').off('mousedown.poper'); })},1); elem.prepend(shape); }, |
vuler,
может дело в коде скрытия и без полноценного рабочего макета сложно. |
Да нет..в нем ничего сложного нет, он особо и не нужен для этого примера. Для теста написал строчку console.log('dele');.
Т.е. при первом нажатии mousedown должно появится контекстное меню, а фраза dele не должна появляться в консоле. А при втором нажатии в любую область, она должна появляться. Исходное событие -"mousedown .tree_line_header": "show_edite_sub_menu", Сейчас собственно так и происходит, только с установленным timeoutom - Хотелось бы без него обойтись. |
vuler,
ок ждите телепата |
Упростил код, немного покапался в этом вопросе и нашел старанную особенность.
Вот код: HTML - ' <div id="page_central"> <div class="test w200 h200"></div> </div>'; // $('#page_central').on('mousedown','.test',function(e){ $('body').on('mousedown','.test',function(e){ elem=$(e.currentTarget); elem.html('НАЖАЛИ НА БЛОК.'); $('body').on('mousedown',function(e){ $('body').find('.test').html('НАЖАЛИ В ЛЕВОМ МЕСТЕ') }) }) Если обработчик стоит как $('body').on('mousedown','.test',function(e), то при нажатии на блоке в нем появляется надпись НАЖАЛИ НА БЛОК, а при втором клике в любом месте в нем появится НАЖАЛИ В ЛЕВОМ МЕСТЕ' А вот если обработчик записать так - $('#page_central').on('mousedown','.test',function (e), казалось бы разница не велика, но в результате при первом клике появится НАЖАЛИ В ЛЕВОМ МЕСТЕ, т.е. событие установленное в функции сразу запустится. Это как-то обойти можно? |
vuler,
остановите всплытие |
Часовой пояс GMT +3, время: 09:15. |