Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как повесить два действия на кнопку? (https://javascript.ru/forum/events/65238-kak-povesit-dva-dejjstviya-na-knopku.html)

svinin_1989 06.10.2016 14:29

Как повесить два действия на кнопку?
 
Есть калькулятор простенький. Хочу от кнопки = избавится. Чтоб выводил ответ по клику на цифры. Есть 2 функции, одна вводит цифорку в инпут, а вторая считает по кнопке =. Как бы их объединить? Или создать другую функцию. Я чайник совсем
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)
}


кнопочки так выглядят
<td align="center"  ><input type="button" value="2" onclick="addChar(this.form.display, &#39;2&#39;)"></td>
<td align="center"  ><input type="button" value="3" onclick="addChar(this.form.display, &#39;3&#39;)"></td>
<td align="center"  ><input type="button" value="4" onclick="addChar(this.form.display, &#39;4&#39;)"></td>


Спасибо

warren buffet 06.10.2016 14:39

Нихера не понял, просто по ТЗ в теме.

element.addEventListener('click',foo);
element.addEventListener('input',bar);
element.addEventListener('keyup',baz);

сколько хочешь на один

Rise 06.10.2016 14:48

svinin_1989, это input.value == null всегда ложно можешь удалить...

svinin_1989 06.10.2016 15:10

Вот страничка с калькулятором, хочу убрать кнопку = вобще.
 
Чтоб решение появлялось во время набора цифр
<!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, &#39;1&#39;) "></td>
<td align="center"  ><input type="button" value="2" onclick="addChar(this.form.display, &#39;2&#39;)"></td>
<td align="center"  ><input type="button" value="3" onclick="addChar(this.form.display, &#39;3&#39;)"></td>
<td align="center"  ><input type="button" value="4" onclick="addChar(this.form.display, &#39;4&#39;)"></td>
<td align="center"  ><input type="button" value="5" onclick="addChar(this.form.display, &#39;5&#39;)"></td>
<td align="center"  ><input type="button" value="6" onclick="addChar(this.form.display, &#39;6&#39;)"></td>
<td align="center"><input type="button" value="7" onclick="addChar(this.form.display, &#39;7&#39;)"></td>
<td align="center"><input type="button" value="8" onclick="addChar(this.form.display, &#39;8&#39;)"></td>
<td align="center"><input type="button" value="9" onclick="addChar(this.form.display, &#39;9&#39;)"></td>
<td align="center"><input type="button" value="0" onclick="addChar(this.form.display, &#39;0&#39;)"></td>
<td align="center"><input type="button" value="." onclick="addChar(this.form.display, &#39;.&#39;)"></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, &#39;*&#39;)"></td>
<td align="center"><input type="button" value="-" onclick="addChar(this.form.display, &#39;-&#39;)"></td>
  
<td align="center"><input type="button" value="/" onclick="addChar(this.form.display, &#39;/&#39;)"></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, &#39;+&#39;)"></td>

 
<td align="center"><input type="button" value="(" onclick="addChar(this.form.display, &#39;(&#39;)"></td>
<td align="center"><input type="button" value=")" onclick="addChar(this.form.display, &#39;)&#39;)"></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>
	
	
	element.addEventListener('click',compute(form));

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
}

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

 
 

function square(form) {
	form.result.value = eval(form.display.value) * eval(form.display.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>



Вешаю на elem.onclick = function compute(form) {
form.result.value = eval(form.display.value)
}
не срабатывает

warren buffet 10.10.2016 05:56

Капец. Я думал там производственный калькулятор, а он бытовой пишет. Скачай готовое и не мучайся.

svinin_1989 12.10.2016 21:25

Калькулятор специализированный это его шаблончик
 
мне нужно просто решение чтоб ответ появлялся в поле сам, без нажатия на =. кнопку = вобще удалить за ненадобностью

Aetae 12.10.2016 21:53

form.display.addEventListener('input', compute);
И в каждой функции что меняет form.display.value добавить в конце
compute();
Что тут сложного?

svinin_1989 14.10.2016 12:54

Мне сложно, я совсем не профи
 
Вот так нужно?

function addChar(input, character) {
  	if(input.value == null || input.value == "0")
		input.value = character;
 	else
		input.value += character;
 return form.display.addEventListener('input', compute);
	}


<td align="center"  ><input type="button" value="2" onclick="addChar(this.form.display, &#39;2&#39; compute();)"></td>


не срабатывает
Не менее важно, чем код, еще куда код вставить))

warren buffet 14.10.2016 15:41

Цитата:

Сообщение от svinin_1989
'2'

Это что такое? Там же есть value="2"

warren buffet 14.10.2016 15:44

Короче, давай хтмл своего кулкулятора, который нужен, без абстракций, а то с таким уровнем боевой подготовки ты до победы не доживешь. )))

svinin_1989 14.10.2016 16:52

Вот такая заготовочка, пытаюсь избавится от кнопки =, лучший вариант наверно реакция
 
на нажатие цифр

<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
 <font color="RED" size="18"> <B>CALC</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, &#39;1&#39;) "></td>
<td align="center"  ><input type="button" value="2" onclick="addChar(this.form.display, &#39;2&#39; compute();)"></td>
<td align="center"  ><input type="button" value="3" onclick="addChar(this.form.display, &#39;3&#39;)"></td>
<td align="center"  ><input type="button" value="4" onclick="addChar(this.form.display, &#39;4&#39;)"></td>
<td align="center"  ><input type="button" value="5" onclick="addChar(this.form.display, &#39;5&#39;)"></td>
<td align="center"  ><input type="button" value="6" onclick="addChar(this.form.display, &#39;6&#39;)"></td>
<td align="center"><input type="button" value="7" onclick="addChar(this.form.display, &#39;7&#39;)"></td>
<td align="center"><input type="button" value="8" onclick="addChar(this.form.display, &#39;8&#39;)"></td>
<td align="center"><input type="button" value="9" onclick="addChar(this.form.display, &#39;9&#39;)"></td>
<td align="center"><input type="button" value="0" onclick="addChar(this.form.display, &#39;0&#39;)"></td>
<td align="center"><input type="button" value="." onclick="addChar(this.form.display, &#39;.&#39;)  "></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, &#39;*&#39;)"></td>
<td align="center"><input type="button" value="-" onclick="addChar(this.form.display, &#39;-&#39;)"></td>
  
<td align="center"><input type="button" value="/" onclick="addChar(this.form.display, &#39;/&#39;)"></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, &#39;+&#39;)"></td>

 
<td align="center"><input type="button" value="(" onclick="addChar(this.form.display, &#39;(&#39;)"></td>
<td align="center"><input type="button" value=")" onclick="addChar(this.form.display, &#39;)&#39;)"></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>
	
	
	element.addEventListener('click',compute(form));

function addChar(input, character) {
  
 
	if(input.value == null || input.value == "0")
		input.value = character;
 
	else
		input.value += character;
	 
	 
      
 return form.display.value
      
	}
 
 
form.display.addEventListener('input', compute);

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
}

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

 
 

function square(form) {
	form.result.value = eval(form.display.value) * eval(form.display.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>

warren buffet 14.10.2016 21:41

В общем очистка кодов от разложения обнажила кошмарную модель куркулятора. Обычно применяются 2 подхода - я не уверен в терминологии, своими словами - операционной и токенизатор. Первый - кнопки давишь, потом = и результат. Второй - производит вычисления из введенной строки раскладывая ее на токены. В рамках js можно записать вместо математических символов сразу названия методов и натравить на строку eval() - так и сделано, но, пилять - в кошмарном соединении с операционной моделью и к тому же с функциями текстового редактора. В итоге быстро формализовать эту бнопню не удалось. Похоже будет проще найти куда нафтыкать чего там надо в оригинале.

На чем остановился на данный момент процитировано ниже.

warren buffet 14.10.2016 21:41

<!DOCTYPE html>
<html lang="ru" dir="ltr">
<head>
<meta charset="utf-8">
<style>

.mega-calc{
	border-collapse:collapse;
}

.mega-calc tr {
	border:1px solid #eee;
}

.mega-calc td {
	text-align:center;
	padding:3px;
}

</style>
</head>
<body>
<font color="RED" size="18"><B>CALC</B></font> <br/>

<form name="sci-calc" id="form-mega-calc">

<table class="mega-calc"><tbody> 

<tr>

	<td><input type="button" value="1"></td>
	<td><input type="button" value="2"></td>
	<td><input type="button" value="3"></td>
	<td><input type="button" value="4"></td>
	<td><input type="button" value="5"></td>
	<td><input type="button" value="6"></td>
	<td><input type="button" value="7"></td>
	<td><input type="button" value="8"></td>
	<td><input type="button" value="9"></td>
	<td><input type="button" value="0"></td>
	<td><input type="button" value="."></td>

</tr>


<tr>

	<td colspan="6"><input name="display" value="0" size="55" maxlength="55"></td>
	<td><input type="button" d="display" value="X"></td> <!--  reset  display -->
	<td><input type="button" d="display" value="<"></td> <!-- deleteChar -->
	<td><input name="enter" type="button" value="="></td> <!-- ENTER -->

	<td colspan="3"><input name="result" size="20" maxlength="20"></td>
	<td><input type="button" d="result" value="X"></td> <!-- reset -->
	<td><input type="button" d="result" value="<"></td> <!--  delete char-->
	<td><input type="button" d="result" value="№"></td> <!-- sqrt -->
	<td><input type="button" d="result" value="^2"></td> <!-- square -->
	<td><input type="button" d="result" value="exp"></td> <!-- exp -->

</tr>

<tr>
 
	<td><input type="button" value="*"></td> <!-- addChar -->
	<td><input type="button" value="-"></td>  <!-- addChar -->
	<td><input type="button" value="/"></td>  <!-- addChar -->
	<td><input type="button" value="+/-"></td> <!-- changeSign -->
	<td><input type="button" value="+"></td>  <!-- addChar -->
	<td><input type="button" value="("></td>   <!-- addChar -->
	<td><input type="button" value=")"></td>   <!-- addChar -->
	<td><input type="button" value="ln"></td>
	<td><input type="button" value="cos"></td>
	<td><input type="button" value="sin"></td>
	<td><input type="button" value="tan"></td>
	
</tr>

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


<script>

var MegaCalc= new function(){

	var 
	D=document,
	form=D.getElementById('form-mega-calc'),
	fres=form.result,
	fdisp=form.display,
	
	M=function(n){
		if(['cos','sin','tan','sqrt','ln','exp'].indexOf(n)>-1)
			return fres.value = Math[n](fdisp.value);
		else if(n=='sqrt')
			return fres.value = eval(fdisp.value)*eval(fdisp.value);
	},
	
	delChar=function(el){
		el.value=el.value.substring(0,el.value.length-1);
	},
	
	chSign=function(el) {
		if(el.value.substring(0, 1) == "-")
			el.value = el.value.substring(1, el.value.length);
		else
			el.value = "-" + el.value;
	},

	checkNum=function(str) {

		for (var ch, i=0; i<str.length; i++) {
		
			ch=str.substring(i,i+1);
			
			if ((ch < 0 || ch > 9) && '/*+-.()'.indexOf(ch)==-1)
				return false

		}
		
		return true;
	},
	
	compute=function() {
		fres.value=eval(fdisp.value);
	},
	
	route=function(e){
		var el=e.target,v,d;
		if(el.type && el.type=='button'){
			v=el.value;
			d=el.getAttribute('d');
			/* todo */
			if(!M(v))
				fdisp.value+=v;
		}
	};

	form.addEventListener('click',route);
	
};

</script>

</body>
</html>

svinin_1989 15.10.2016 10:31

Сасибо что возитесь с моей проблемой))
 
А почему нельзя задать выполнение

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

при каждом нажатий цифровых кнопок?

нажал 1, в поле появился 1 и выполнилась функция compute(form)
В input name="result" 1

нажал + появился +
input name="result" 1

нажал 2 появилось 2 и выполнилась функция compute(form)
input name="result" 3

warren buffet 15.10.2016 12:39

Конечно можно, профессор до меня так и написал, просто он запутал нечаянно тебя листенером, листенер не нужен, впиши compute(this.form) во все онклики после того, что там уже написано через точку-запятая ;

Ты для себя пишешь, да? Это нереальный колхоз если задумывается для людей. Ну вот, если пишешь для себя, то спешить некуда и спокойно разберись. Я ниасилил индустриальное решение этого колхоза, умываю руки.

svinin_1989 15.10.2016 17:28

Не получается, впиши compute(this.form) во все онклики после ;
 
ТАК НЕ ПОЛУЧАЕТСЯ

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

ТАК НЕ ПОЛУЧАЕТСЯ
<td align="center" ><input type="button" value="2" onclick="addChar(this.form.display, '2') ;compute(this.form)"></td>

ТАК НЕ ПОЛУЧАЕТСЯ
<td align="center" ><input type="button" value="2" onclick="addChar(this.form.display, '2') ;compute(this.form);"></td>


КАКОЙ ЖЕ ПРАВИЛЬНЫЙ ВАРИАНТ?

warren buffet 16.10.2016 14:28

Цитата:

Сообщение от svinin_1989
onclick="addChar(this.form.display, '2') ;compute(this.form);"

По идее должно работать. Открой консоль и посмотри может там ошибки какие-то. Оставь один компуте

onclick="compute(this.form);"

посмотри работает или нет.

И еще, ты вручную передаешь значение, которое уже записано в валуе

addChar(this.form.display, '2') == addChar(this.form.display, this.value)

svinin_1989 16.10.2016 16:28

обратно не работает
 
onclick="addChar(this.form.display, '2') ;compute(this.form);"

добавляет двойку просто, в поле result не выводит результат
результат выводит только равно

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

там присутствует compute(this.form)

плевая по идее ведь задача, никто решить не может))

warren buffet 17.10.2016 08:05

Никто не может, кроме тебя. Придумать такую запутанную хрень тямы хватило, значит хватит и на распутывание. Иначе это несправедливо: запутал ты - а требуешь с других. Кстати, в истории был такой случай, про царя Гордия почитай. )


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