Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.03.2015, 12:43
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

Обработчик срабатывает сразу же после установки
Хочу еще раз вернуться к вопросу установки обработчика событий внутри функции.
Функция 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);
	},
Ответить с цитированием
  #2 (permalink)  
Старый 24.03.2015, 12:59
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,979

vuler,
может дело в коде скрытия и без полноценного рабочего макета сложно.
Ответить с цитированием
  #3 (permalink)  
Старый 24.03.2015, 13:24
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

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

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

Сейчас собственно так и происходит, только с установленным timeoutom - Хотелось бы без него обойтись.
Ответить с цитированием
  #4 (permalink)  
Старый 24.03.2015, 13:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,979

vuler,
ок ждите телепата
Ответить с цитированием
  #5 (permalink)  
Старый 24.03.2015, 14:06
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

Упростил код, немного покапался в этом вопросе и нашел старанную особенность.
Вот код:
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), казалось бы разница не велика, но в результате при первом клике появится НАЖАЛИ В ЛЕВОМ МЕСТЕ, т.е. событие установленное в функции сразу запустится. Это как-то обойти можно?
Ответить с цитированием
  #6 (permalink)  
Старый 24.03.2015, 14:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,979

vuler,
остановите всплытие
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В IE6 не сразу срабатывает onchange Metallic Events/DOM/Window 3 26.03.2012 13:54
ThickBox сразу после загрузки страници benzapila jQuery 0 20.02.2012 12:29
Не сразу срабатывает действие onClick в IE Ant0ni0 Internet Explorer 0 11.01.2012 14:21
функция внутри Live() срабатывает после второго клика Ad1r jQuery 7 09.08.2011 13:11
Как получить размер блока сразу после изменения его содержимого? Cooskon Events/DOM/Window 6 17.09.2010 15:15