Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.12.2014, 16:07
Аватар для BaBaKa
Интересующийся
Отправить личное сообщение для BaBaKa Посмотреть профиль Найти все сообщения от BaBaKa
 
Регистрация: 18.07.2014
Сообщений: 14

секундомер, проблемы с setTimeout
Привет всем!
У меня есть некий стрипт, который должен отображать количество секунд в неком блоке, основа находиться ниже. Проблема возникает при запуске таймера через setTimeout

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<meta http-equiv="content-type" content="text/html;" charset="utf-8"/>
		<title>Таймер</title>
		<script>
			function timer (id) {
				this.display = document.getElementById(id);
				this.main;
				this.base = 60;
				this.time = 0;
				this.init = 0;
				this.data = '';
				this.show = true;
				this.setValue = function (data) {
					if (this.display) {
						display.innerHTML = data || '00:00:00.00';
					}
				}
				*!*this.clear*/!* = function () {
					clearTimeout(this.main);
					this.time = 0;
					this.data = '';
					this.show = true;
					this.init = 0;
					this.setValue();
				};
				*!*this.fixed*/!* = function (data) {
					return (data < 10)?'0'+data:data;
				}
				*!*this.start*/!* = function () {
					this.ms = this.time % 100;
					this.ms = this.fixed(this.ms);
					
					this.sec = Math.floor(this.time/100) % this.base;
					this.sec = this.fixed(this.sec);
					
					this.min  = Math.floor(this.time/(100 * this.base)) % this.base;
					this.min = this.fixed(this.min);
					
					this.h = Math.floor(this.time/(100 * Math.pow(this.base,2))) % 24;
					this.h = this.fixed(this.h);
					
					this.data = this.h + ':' + this.min + ':'+this.sec+'.'+this.ms;
					
					if (this.show == true) {
						this.setValue(this.data);
						var _this = this;
						this.main = setTimeout(function() {
							_this.start()
						}, 10);
					}
					if (this.ms == 99 && this.sec == 59 && this.min == 59 && this.h == 23) {this.clear();}
					this.time++;
				};
				*!*this.toggle*/!* = function () {
					if (this.init == 0) {
						this.start();
						this.init = 1;
					} else {
						if (this.show == true) {
							this.show = false;
						} else {
							this.show = true;
							this.start();
						}
					}
				};
			}
			
			window.onload = function () {
				var tm = new timer('display');
				document.getElementById('toggle').onclick = function () {
					tm.toggle();
				};
				document.getElementById('clear').onclick = function () {
					tm.clear();
				};
			}
		</script>
	</head>
	<body>
		<div id="display"></div>
		<input type="button" id="toggle" value="Start/Pause" />
		<input type="button" id="clear" value="Reset" />
	</body>
</html>

Последний раз редактировалось BaBaKa, 11.12.2014 в 13:13. Причина: введение подсказок и исправление ошибок
Ответить с цитированием
  #2 (permalink)  
Старый 10.12.2014, 16:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

BaBaKa,
var _this = this;
this.main = setTimeout(function() {
   _this.start()
}, 1);
Ответить с цитированием
  #3 (permalink)  
Старый 10.12.2014, 16:23
Аватар для BaBaKa
Интересующийся
Отправить личное сообщение для BaBaKa Посмотреть профиль Найти все сообщения от BaBaKa
 
Регистрация: 18.07.2014
Сообщений: 14

спасибо) насколько все просто оказывается)
Ответить с цитированием
  #4 (permalink)  
Старый 10.12.2014, 16:24
Аватар для XelaNimed
Интересующийся
Отправить личное сообщение для XelaNimed Посмотреть профиль Найти все сообщения от XelaNimed
 
Регистрация: 07.02.2010
Сообщений: 23

Здравствуйте.
В 39й строке this ссылается на контекст функции. Поэтому, как и указал рони, Вам нужно сохранить ссылку на this в переменную и ниже использовать ее, а нее this. Наиболее частые названия для этой переменной _this, self.
Ответить с цитированием
  #5 (permalink)  
Старый 10.12.2014, 16:39
Аватар для BaBaKa
Интересующийся
Отправить личное сообщение для BaBaKa Посмотреть профиль Найти все сообщения от BaBaKa
 
Регистрация: 18.07.2014
Сообщений: 14

еще один вопрос, при нажатии оно останавливает секундомер, но только на несколько секунд, почему?
Ответить с цитированием
  #6 (permalink)  
Старый 10.12.2014, 16:52
Аватар для BaBaKa
Интересующийся
Отправить личное сообщение для BaBaKa Посмотреть профиль Найти все сообщения от BaBaKa
 
Регистрация: 18.07.2014
Сообщений: 14

простите за беспокойство, сам нашел, просто одну лишнею строку удалил
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с Settimeout alexandr_v-vich Events/DOM/Window 3 31.01.2012 00:13
Проблемы с setTimeout().... Panter7777 Events/DOM/Window 20 05.09.2011 10:38
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout в браузере IE и Opera leha66 Javascript под браузер 2 13.12.2010 13:02
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37