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

Вопрос по эвенту во встроенной функции.
Добрый день.
Решил немного упростить код, скрывания объектов, но тут появилась небольшая загвоздка.
Вот код.
$('.js_show_sferi').on('click',sferi_change_visible);

function sferi_change_visible(e){
		sferi_block=$(this).parent().find('.sferi_block_wrap').children();
		sferi_block.stop();
		if (sferi_block.is(':visible'))
			sferi_block.fadeOut(1000);
		else {
			//e.preventDefault();
			sferi_block.fadeIn(1000);
			sferi_block.hide_by_click();
			}
}

jQuery.fn.hide_by_click=function(){
	array_list=$('body').data('hide_by_click_list');
	if (!full_null(array_list)){
		array_list.push($(this));
	}else{
		array_list=[$(this)];
	}
	$('body').data('hide_by_click_list',array_list);
	//setTimeout(function(){
		$('body').on('click',function (event){
			//if (event.isDefaultPrevented()==true) return;
			array_list=$('body').data('hide_by_click_list');
			array_list[0].remove();
			})	
	//},300);
}

Тут для теста.Объект не стирается, а удаляется. Проблема в том, что объект появляется и одновременно удаляется. Т.е.
$('.js_show_sferi').on('click',sferi_change_visibl e) срабатывает и за ним сразу задается обработчик и запускается $('body').on('click',function (event). Т.е. объект появляется и удаляется одновременно.
Нашел 2 варианта решения. -
1) добавить. e.preventDefault(); в основную функцию и event.isDefaultPrevented()во встроеную. Так все работает, но проблема в том, что прописывать e.preventDefault(); приходится прописывать в основной фунции, чего мне бы не хотелось. Нужно чтобы просто в коде можно запускать метод .hide_by_click(); и не заботится больше ни о чем. Встроенная функция jQuery.fn.hide_by_click=function(e) - эвент не обрабатывает, выдает ошибку. Возможно как-нибудь это обойти?
2) Вариант более тупой - через таймаут.
Ответить с цитированием