Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Выполнения и остановка кода по клику (https://javascript.ru/forum/misc/28121-vypolneniya-i-ostanovka-koda-po-kliku.html)

Партизан 08.05.2012 15:53

Выполнения и остановка кода по клику
 
Добрый день.

Столкнутся с такой проблемой - мне надо что бы код (функция или цикл) начинал выполнятся по клику на кнопку при этом, условие его остановке - второй клик по этой кнопку.
Побывал сделать так:

var keytest =-1;
function stopkey ()
{
keytest =keytest *(-1);
			
}

function run()
{
	if (keytest==(-1)){btest();}
		
		for(;;){код}
}

$(document).ready(function(){
$("#btn0").click(stopkey);		
$("#btn0").click(run);	<!--btn0 - та самая кнопка на которую нужно нажать -->	
});


Но это код не работает - страница наглухо виснет. Что тут может помочь? Может какой нибудь хитрый тайм-аут или плагин JQuery?

zebra 08.05.2012 15:57

setTimeout

Партизан 09.05.2012 14:01

Можно поподробней?
 
А можно по подробней как это сделать, делал так - не сработало.

var keytest =-1;
	function runtest()
	{
		keytest =keytest *(-1);
		alert(keytest);
		if (keytest==(-1)){btest();}
		for(;;){
		setTimeout(runfun(),3000);
		}
	}
	function runfun()
	{	
		alert("test");
        }

$(document).ready(function(){
	
$("#btn0").click(runtest);	
});


По идеи функция должна вызываться каждые 3 секунды, но она вызывается один раз.

Партизан 09.05.2012 14:12

Нашел свою ошибку
 
Нашел ошибку в вызове функции runfun, правильно так:
setTimeout(function(){runfun();},3000);


Но теперь браузер виснет при запуски функции.

zebra 09.05.2012 14:21

Бесконечный цикл уберите

Партизан 09.05.2012 16:37

Цикл выполнится один раз?
 
Да но без цикла код выполнится только один раз. Я переписал функцию runtest:

function runtest()
	{
	keytest =keytest *(-1);
	if (keytest == (-1)){var intervalID = setInterval(function()   runfun();},3000);}
		if (keytest == (1)){clearInterval(intervalID);}
	}

Но это не останавливает цикл. Подскажите где я мог опять ошибётся?

zebra 09.05.2012 16:50

intervalID вынесите выше функции

var intervalID;
function runtest()
	{
	keytest =keytest *(-1);
	if (keytest == (-1)){intervalID = setInterval(function()   runfun();},3000);}
		if (keytest == (1)){clearInterval(intervalID);}
	}

vadim5june 09.05.2012 17:33

Цитата:

Сообщение от Партизан (Сообщение 173281)
Добрый день.

Столкнутся с такой проблемой - мне надо что бы код (функция или цикл) начинал выполнятся по клику на кнопку при этом, условие его остановке - второй клик по этой кнопку.
Побывал сделать так:

Ничего не поможет когда javascript выполняет цикл то до его окончания он нереагирует на прерывания ни мышки ни таймера и комп будет виснуть

Партизан 12.05.2012 20:14

Спасибо за помощь
 
Спасибо Вам zebra :thanks: , переменную intervalID, я глобальной объявить то объявил, только "var" в функцию в писал ещё, вот она каждый раз и объявлялась заново. :)

vadim5june - тут вы немного не правы, как видите это проблему можно решить решить таймъаутом.

P.S.

Надеюсь что когда нибудь в JavaScript добавят потоки

vadim5june 12.05.2012 20:27

Цитата:

vadim5june - тут вы немного не правы, как видите это проблему можно решить решить таймъаутом.
Не может быть
Что в итоге получилось-код не приведете?

Партизан 13.05.2012 18:04

Получилось так:
 
В итоге у меня получилось так:
У меня две функции это runtest и runfun и две глобальных переменных intervalID и keytest

При нажатии на кнопку, я вызываю функцию runtest она либо создаёт setInterval или на оборот удаляет его. А setInterval вызывает функцию runfun каждые 3 секунды.

Вот код:

var keytest = 1;
var intervalID;
function runtest()
	{
	keytest =keytest *(-1);<!-- 1 меняется на -1 и на оборот -1 на 1 --> 
	if (keytest == (-1)){intervalID = setInterval(function()   runfun();},3000);} <!-- можно поставить любое время, тут это 3 секунды -->
		if (keytest == (1)){clearInterval(intervalID);}
	}
function runfun()
	{
            <!--Функция вызывается каждые три секунды-->  
        }

$(document).ready(function(){
$("#btn0").click(runtest);  <!--btn0 - кнопка  -->   
});


Всё работает как запланировано - функция вызывается работает пока второй раз не нажать на кнопку, при этом другие элементы странице тоже работают.
Конечно есть и другие, более правильные решения: http://javascript.ru/blog/tenshi/mno...ktor-processov

vadim5june 13.05.2012 18:29

Цитата:

Сообщение от Партизан (Сообщение 174237)
Всё работает как запланировано

А где бесконечный цикл-я не вижу?


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