Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обработчик срабатывает сразу же после установки (https://javascript.ru/forum/misc/54602-obrabotchik-srabatyvaet-srazu-zhe-posle-ustanovki.html)

vuler 24.03.2015 13:43

Обработчик срабатывает сразу же после установки
 
Хочу еще раз вернуться к вопросу установки обработчика событий внутри функции.
Функция 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);
	},

рони 24.03.2015 13:59

vuler,
может дело в коде скрытия и без полноценного рабочего макета сложно.

vuler 24.03.2015 14:24

Да нет..в нем ничего сложного нет, он особо и не нужен для этого примера. Для теста написал строчку console.log('dele');.
Т.е. при первом нажатии mousedown должно появится контекстное меню, а фраза dele не должна появляться в консоле.
А при втором нажатии в любую область, она должна появляться.

Исходное событие -"mousedown .tree_line_header": "show_edite_sub_menu",

Сейчас собственно так и происходит, только с установленным timeoutom - Хотелось бы без него обойтись.

рони 24.03.2015 14:43

vuler,
ок ждите телепата

vuler 24.03.2015 15:06

Упростил код, немного покапался в этом вопросе и нашел старанную особенность.
Вот код:
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), казалось бы разница не велика, но в результате при первом клике появится НАЖАЛИ В ЛЕВОМ МЕСТЕ, т.е. событие установленное в функции сразу запустится. Это как-то обойти можно?

рони 24.03.2015 15:17

vuler,
остановите всплытие


Часовой пояс GMT +3, время: 09:15.