Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Предотвращение выполнения функции ещё раз. (https://javascript.ru/forum/jquery/45267-predotvrashhenie-vypolneniya-funkcii-eshhjo-raz.html)

xTODx 21.02.2014 11:20

Предотвращение выполнения функции ещё раз.
 
Всем привет!
В общем задача такая:
кликаю на объект, начинает выполняться функция.
Как сделать, что бы если я кликну ещё раз на объек(во время выполнения функции), то функция не начинала выполняться опять.

рони 21.02.2014 11:23

xTODx,
начали - проверили флаг -- ок -- запустились - поставили флаг в не ок -- отработали снова флаг в ок

ruslan_mart 21.02.2014 11:33

1.
function test() {
   if(arguments.callee.clicked) return;
   arguments.callee.clicked = true;
   //code...
}


2.
var flag;

function test() {
   if(flag) return;
   flag = true;
   //code...
}


Ну а когда нужно, то просто менять значение на false, чтобы ф-цию можно было снова запустить.

ksa 21.02.2014 13:21

Цитата:

Сообщение от xTODx
кликаю на объект, начинает выполняться функция.
Как сделать, что бы если я кликну ещё раз на объек(во время выполнения функции), то функция не начинала выполняться опять.

Как вариант...
- при клике удалить обработчик с элемента
- поокончании действа опять "навесить" обработчик

xTODx 21.02.2014 13:25

в общем поковырял, сделал так
function  openclose(spd, obj){
		if(flag==0){
			 flag = 1;
			img = $(obj).parent().find('#img');
			src = $(img).attr('src');
			obj = $(obj).parent().find('#effect');
			obj.toggleClass( "newClass", spd );
			if(src == '/img/minus.gif'){
				$(img).attr("src",'/img/plus.gif');
			}else{
				$(img).attr("src",'/img/minus.gif');
			}
		
			setTimeout(function(){ flag = 0;},spd+400);
			}
		}

Уверен, можно сделать рациональней, но как?
та и тут в чём то ошибочка(всё-равно если кликать во время смены класса, то опять поймаем ту же проблему, функция выполниться)

xTODx 21.02.2014 13:25

тоже задумался об этом, но будет ли это рационально?

Deff 21.02.2014 13:42

function  openclose(spd, obj){
		if(flag==1) return;
                      flag=1
		//Наши действия
		setTimeout(function(){ flag = 0;},spd+400);
		}

Aetae 21.02.2014 13:44

Зависит от конкретного случая. Флага обычно достаточно.
Однако его лучше всё-же привязать к функции дабы не засорять зря.
function openclose(){
    if(openclose.running) return;
    openclose.running= true;
    // code
    openclose.running= false;
}

xTODx 21.02.2014 13:50

cпасибо, сейчас)

xTODx 21.02.2014 13:52

попробовал. и не пойму, то ли сани не едут то ли я...)) но скорее всего второй вариант. в общем не работает:help:


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