Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   setTimeout не хочет исполнять функцию (https://javascript.ru/forum/events/65201-settimeout-ne-khochet-ispolnyat-funkciyu.html)

svinin_1989 03.10.2016 20:34

setTimeout не хочет исполнять функцию
 
Помогите люди добрые. Делаю калькулятор, пытаюсь избавится от кнопки =. Хочу чтоб автоматом считал результат в поле результат.
Кнопочка равно инициализирует
function compute(form) {
	form.result.value = eval(form.display.value)
}


Все работает. Пытаюсь запустить
function compute(form) {
	form.result.value = eval(form.display.value)
}

setTimeout(compute(form), 1000);



Не срабатывает.

Вот страничка вся
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<font color="RED" size="18"> <B>КАЛЬКУЛЯТОР</B></font> <br/>
<form name="sci-calc">
<table table border="1"  >
<tbody> 
<tr>
<td align="center" style="background-color: red"  ><input type="button" value="1" onclick="addChar(this.form.display, '1')"></td>
<td align="center"  ><input type="button" value="2" onclick="addChar(this.form.display, '2')"></td>
<td align="center"  ><input type="button" value="3" onclick="addChar(this.form.display, '3')"></td>
<td align="center"  ><input type="button" value="4" onclick="addChar(this.form.display, '4')"></td>
<td align="center"  ><input type="button" value="5" onclick="addChar(this.form.display, '5')"></td>
<td align="center"  ><input type="button" value="6" onclick="addChar(this.form.display, '6')"></td>
<td align="center"><input type="button" value="7" onclick="addChar(this.form.display, '7')"></td>
<td align="center"><input type="button" value="8" onclick="addChar(this.form.display, '8')"></td>
<td align="center"><input type="button" value="9" onclick="addChar(this.form.display, '9')"></td>
<td align="center"><input type="button" value="0" onclick="addChar(this.form.display, '0')"></td>
<td align="center"><input type="button" value="." onclick="addChar(this.form.display, '.')"></td>
</tr>
 


<tr>
<td colspan="6" align="center"><input name="display" value="0" size="55" maxlength="55"></td>
<td align="center"><input type="button" value="X" onclick="this.form.display.value = 0 "></td>
<td align="center"  ><input type="button" value="<" onclick="deleteChar(this.form.display)"></td>

<td align="center"><input type="button" value="=" name="enter" onclick="if (checkNum(this.form.display.value)) { compute(this.form) }"></td>

 <td colspan="3" align="center"><input name="result"   size="20" maxlength="20"></td>
<td align="center"><input type="button" value="X" onclick="this.form.result.value = 0 "></td>
<td align="center"  ><input type="button" value="<" onclick="deleteChar(this.form.result)"></td>
<td align="center"><input type="button" value="№" onclick="if (checkNum(this.form.display.value)) { sqrt(this.form) }"></td>
<td align="center"><input type="button" value="^2" onclick="if (checkNum(this.form.display.value)) { square(this.form) }"></td>
<td align="center"><input type="button" value="exp" onclick="if (checkNum(this.form.display.value)) { exp(this.form) }"></td>

</tr>


<tr>
 
<td align="center"><input type="button" value="*" onclick="addChar(this.form.display, '*')"></td>
<td align="center"><input type="button" value="-" onclick="addChar(this.form.display, '-')"></td>
  
<td align="center"><input type="button" value="/" onclick="addChar(this.form.display, '/')"></td>
<td align="center"><input type="button" value="+/-" onclick="changeSign(this.form.display)"></td>
<td align="center"><input type="button" value="+" onclick="addChar(this.form.display, '+')"></td>

 
<td align="center"><input type="button" value="(" onclick="addChar(this.form.display, '(')"></td>
<td align="center"><input type="button" value=")" onclick="addChar(this.form.display, ')')"></td>

<td align="center"><input type="button" value="ln" onclick="if (checkNum(this.form.display.value)) { ln(this.form) }"></td>
 
<td align="center"><input type="button" value="cos" onclick="if (checkNum(this.form.display.value)) { cos(this.form) }"></td>
<td align="center"><input type="button" value="sin" onclick="if (checkNum(this.form.display.value)) { sin(this.form) }"></td>
<td align="center"><input type="button" value="tan" onclick="if (checkNum(this.form.display.value)) { tan(this.form) }"></td>
 </tr>

</tbody></table>
</form>


<script>

function addChar(input, character) {
	if(input.value == null || input.value == "0")
		input.value = character
	else
		input.value += character
}

function cos(form) {
	form.result.value = Math.cos(form.display.value);
}

function sin(form) {
	form.result.value = Math.sin(form.display.value);
}

function tan(form) {
	form.result.value = Math.tan(form.display.value);
}

function sqrt(form) {
	form.result.value = Math.sqrt(form.display.value);
}

function ln(form) {
	form.result.value = Math.log(form.display.value);
}

function exp(form) {
	form.result.value = Math.exp(form.display.value);
}

function deleteChar(input) {
	input.value = input.value.substring(0, input.value.length - 1)
}

function changeSign(input) {
	if(input.value.substring(0, 1) == "-")
		input.value = input.value.substring(1, input.value.length)
	else
		input.value = "-" + input.value
}



 




setTimeout(compute(form), 1000);

function compute(form) {
	form.result.value = eval(form.display.value)
}

function square(form) {
	form.result.value = eval(form.result.value) * eval(form.result.value)
}

function checkNum(str) {
	for (var i = 0; i < str.length; i++) {
		var ch = str.substring(i, i+1)
		if (ch < "0" || ch > "9") {
			if (ch != "/" && ch != "*" && ch != "+" && ch != "-" && ch != "."
				&& ch != "(" && ch!= ")") {
				alert("invalid entry!")
				return false
				}
			}
		}
		return true
}

    </script>


</body>
</html>

рони 03.10.2016 20:45

svinin_1989,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

ksa 04.10.2016 08:15

Цитата:

Сообщение от svinin_1989 (Сообщение 430609)
Пытаюсь запустить
function compute(form) {
	form.result.value = eval(form.display.value)
}
setTimeout(compute(form), 1000);

Не срабатывает.

А так?
setTimeout(function(){
   alert('begin');
   compute(form)
   alert('end');
}, 1000);

svinin_1989 04.10.2016 08:48

begin выводит, а дальше не работает
 
Мне тут умный человек подсказал
избавятся от setInterval

Просто передать функцию в обработчик.
Функция исполняется после каждого нажатия цифорки или арифметичекого символа.
Только я чайник совсем, пока не получается

function addChar(input, character) {
	if(input.value == null || input.value == "0")
		input.value = character
 
	else
		input.value += character
			 
}

ksa 04.10.2016 10:02

Цитата:

Сообщение от svinin_1989
Только я чайник совсем, пока не получается

Как намек... ;)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
$(function(){
	var tm;
	$('#val').keyup(function(){
		if (tm) {
			clearTimeout(tm);
		};
		tm=setTimeout(calc,1000);
	});
	function calc(){
		var val=$('#val').val();
		$('#txt').text(val);
	};
})
</script>
</head>
<body>
<input type='text' id='val'>
<p id='txt'></p>
</body>
</html>

Суть такая:
- пока идет набор, вычисления не делаются
- если набор завершен, производятся вычисления

svinin_1989 04.10.2016 11:07

Замечательный конечно код, но не хочется всяких angular плагинов
 
Слишком много на страничке всяких скриптов, уже ощутимо подтормаживает. Уже подумал, лучше всего мгновенная реакция на набор.
Бьюсь как бы грамотно вставить в
function addChar(input, character) {
	if(input.value == null || input.value == "0")
		input.value = character
 
	else
		input.value += character
		
 
		 
}


функцию
function compute(form) {
 form.result.value = eval(form.display.value)
}


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