Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по jquery. Как запретить один из скриптов при клике (https://javascript.ru/forum/misc/26419-vopros-po-jquery-kak-zapretit-odin-iz-skriptov-pri-klike.html)

vuler 07.03.2012 21:48

Вопрос по jquery. Как запретить один из скриптов при клике
 
В общем что-то бьюсь в одном месте, уже много чего перепробовал, но не хочет корректно работать.
в общем есть два скрипта. Первый скрипт показывает или скрывает форму сообщения об ошибке.
function show_error_descr()
{
clearTimeout(open_timer);
block_click();
$(this).parent().find(".error_descr_block").slideToggle();
	if($(this).parent().find(".error_descr_block").attr("show")=="yes")
	{
		$(this).parent().find(".error_descr_block").attr("show","no");
	}
	else 
		{
		$(this).parent().find(".error_descr_block").attr("show","yes");
		}
}

Второй скрипт при клике в любую область экрана - закрывает форму сообщения об ошибке.

function hide_error_descr()
	{
	clearTimeout(open_timer);
	block_click();
	if($(".error_descr_block").attr("show")=="yes")
	{
	$(document).off('click', hide_error_descr);
	$(".error_descr_block[show=yes]").slideToggle();
	$(this).parent().find(".error_descr_block").attr("show","no");
	}
	}

Функция block_click()
блокирует все обработчики событий на секунду.
function block_click(){
	$(document).off('click', '.bottom_open', open_full_descr);
	$(document).off('click', '.good,.bad', add_rating);
	$(document).off('click', '.show_error_descr',show_error_descr);
	$(document).off('click', hide_error_descr);
	open_timer=setTimeout(function(){
	$(document).on('click', '.bottom_open', open_full_descr);
	$(document).on('click', '.good,.bad', add_rating);
	$(document).on('click', '.show_error_descr',show_error_descr);
	$(document).on('click', hide_error_descr);
	},1000);	
	}


Проблема в том что при клике на блок .show_error_descr выполняется функция show_error_descr, в начале ее идет блокировка всех обработчиков событий (функция block_click()), но почему-то после выполнения функции show_error_descr сразу же запускается функция hide_error_descr, хотя она была заблокирована функцией block_click на секунду, такое ощущение что при клике сразу запускается обе функции, а надо чтобы сработала только одна первая. Помогите решить задачку :(

vuler 07.03.2012 22:35

Решилось вообще каким-то тупорыльным способом.
Может есть лучше решение?

function block_click(){
	$(document).off('click', '.bottom_open', open_full_descr);
	$(document).off('click', '.good,.bad', add_rating);
	$(document).off('click', '.show_error_descr',show_error_descr);
	$(document).off('click', hide_error_descr);
	open_timer=setTimeout(function(){
	$(document).on('click', '.bottom_open', open_full_descr);
	$(document).on('click', '.good,.bad', add_rating);
	$(document).on('click', '.show_error_descr',show_error_descr);
	$(document).on('click', hide_error_descr);
	},1000);	
	}
	
	
	
	function hide_error_descr()
	{
	clearTimeout(open_timer);
	block_click();
	if($(".error_descr_block").attr("show")=="yes")
	{
	$(".error_descr_block[show=yes]").slideToggle();
	setTimeout(function(){
	$(".error_descr_block").attr("show","no");
		},100);
	}
	
	}
	
	function show_error_descr()
	{
	clearTimeout(open_timer);
	block_click();
	$(this).parent().find(".error_descr_block").slideToggle();
	if($(this).parent().find(".error_descr_block").attr("show")=="yes")
	{
		var temp=$(this).parent().find(".error_descr_block")
		$(this).parent().find(".error_descr_block").attr("show","no");
	}
	else 
		{
		var temp=$(this).parent().find(".error_descr_block")
		setTimeout(function(){
		temp.attr("show","yes");
		},100);
		}
	}


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