JS калькулятор+динамика
<div id="calculator"> <div class="top"> <span class="clear">C</span> <div class="screen"></div> </div> <div class="keys"> <span>7</span> <span>8</span> <span>9</span> <span class="operator">+</span> <span>4</span> <span>5</span> <span>6</span> <span class="operator">-</span> <span>1</span> <span>2</span> <span>3</span> <span class="operator">÷</span> <span>0</span> <span class="eval">=</span> <span class="operator">x</span> </div> </div> Задание в том что надо все это написать в JS файле... Плюс есть калькулятор в JS. Я делаю любую операцию, получаю число, начинаю вводить снова число, а оно просто дописывается к результату. А должно начать заново... К примеру 2+2, выдает 4. Ввожу 3, а результат пишет 43, и т.д.
var keys = document.querySelectorAll('#calculator span');
var operators = ['+', '-', 'x', '÷'];
var decimalAdded = false;
for(var i = 0; i < keys.length; i++) {
keys[i].onclick = function(e) {
var input = document.querySelector('.screen');
var inputVal = input.innerHTML;
var btnVal = this.innerHTML;
if(btnVal == 'C') {
input.innerHTML = '';
decimalAdded = false;
}
else if(btnVal == '=') {
var equation = inputVal;
var lastChar = equation[equation.length - 1];
equation = equation.replace(/x/g, '*').replace(/÷/g, '/');
if(operators.indexOf(lastChar) > -1 || lastChar == '.')
equation = equation.replace(/.$/, '');
if(equation)
input.innerHTML = eval(equation);
document.querySelector("#history").innerHTML += equation + "=" + input.innerHTML + "<br>";
decimalAdded = false;
}
else if(operators.indexOf(btnVal) > -1) {
var lastChar = inputVal[inputVal.length - 1];
if(inputVal != '' && operators.indexOf(lastChar) == -1)
input.innerHTML += btnVal;
else if(inputVal == '' && btnVal == '-')
input.innerHTML += btnVal;
if(operators.indexOf(lastChar) > -1 && inputVal.length > 1) {
input.innerHTML = inputVal.replace(/.$/, btnVal);
}
decimalAdded =false;
}
else if(btnVal == '.') {
if(!decimalAdded) {
input.innerHTML += btnVal;
decimalAdded = true;
}
}
else {
input.innerHTML += btnVal;
}
e.preventDefault();
}
}
|
DarkPhoenix,
на всякий случай, для строки 25 нет элемента в вашем html!!! |
Цитата:
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</head>
<body>
<div id="calculator">
<div class="top">
<div id="history"></div>
<span class="clear">C</span>
<div class="screen"></div>
</div>
<div class="keys">
<span>7</span>
<span>8</span>
<span>9</span>
<span class="operator">+</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span class="operator">-</span>
<span>1</span>
<span>2</span>
<span>3</span>
<span class="operator">÷</span>
<span>0</span>
<span class="eval">=</span>
<span class="operator">x</span>
</div>
</div>
<script>
var keys = document.querySelectorAll('#calculator span');
var operators = ['+', '-', 'x', '÷'];
var decimalAdded = false;
var endEquation;
for(var i = 0; i < keys.length; i++) {
keys[i].onclick = function(e) {
var input = document.querySelector('.screen');
var inputVal = input.innerHTML;
var btnVal = this.innerHTML;
if(btnVal == 'C') {
input.innerHTML = '';
decimalAdded = false;
}
else if(btnVal == '=') {
var equation = inputVal;
var lastChar = equation[equation.length - 1];
equation = equation.replace(/x/g, '*').replace(/÷/g, '/');
if(operators.indexOf(lastChar) > -1 || lastChar == '.')
equation = equation.replace(/.$/, '');
if(equation){
input.innerHTML = eval(equation);
endEquation = true;
}
document.querySelector("#history").innerHTML += equation + "=" + input.innerHTML + "<br>";
decimalAdded = false;
}
else if(operators.indexOf(btnVal) > -1) {
var lastChar = inputVal[inputVal.length - 1];
if(inputVal != '' && operators.indexOf(lastChar) == -1)
input.innerHTML += btnVal;
else if(inputVal == '' && btnVal == '-')
input.innerHTML += btnVal;
if(operators.indexOf(lastChar) > -1 && inputVal.length > 1) {
input.innerHTML = inputVal.replace(/.$/, btnVal);
}
decimalAdded =false;
}
else if(btnVal == '.') {
if(!decimalAdded) {
input.innerHTML += btnVal;
decimalAdded = true;
}
}
else {
input.innerHTML = (endEquation ? "" : input.innerHTML) + btnVal;
endEquation = false;
}
e.preventDefault();
}
}
</script>
</body>
</html>
|
Есть. Скинул старую версию.
А как все спаны и т.д. Сделать в JS файле?(
<DOCTYPE! html>
<html>
<head>
<meta charset="utf-8">
<title>Calculator</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="calculator">
<div class="top">
<span class="clear">C</span>
<div class="screen"></div>
</div>
<div class="keys">
<span>7</span>
<span>8</span>
<span>9</span>
<span class="operator">+</span>
<span>4</span>
<span>5</span>
<span>6</span>
<span class="operator">-</span>
<span>1</span>
<span>2</span>
<span>3</span>
<span class="operator">÷</span>
<span>0</span>
<span class="eval">=</span>
<span class="operator">x</span>
</div>
</div>
<div id = "history">
<h1>History</h1>
</div>
<script src="calculator.js"></script>
</body>
</html>
|
Цитата:
Кстати у вас получился не арифметический калькулятор! Т. е. если набрать 2+5*7= то у вас не получится 49 И именно то, за что так любят калькуляторы у вас эпично сломано! 2+= выдаёт 2, а не 4. И 1+==== выдаёт 1, а не 5. И 5×= выдаёт 5, а не 25. Какой баг! А почему логика работы калькулятора должна зависеть от HTML-элементов? Разве новое состояние калькулятора не должно вычисляться на основе текущего состояния и нажатой кнопки? (CalculatorState, PressedButton) => CalculatorState И также есть проблема с работой над вычисленным значением... Если набрать 2+1=+1= то у вас получается 1, а не 4 CalculatorState нужен чтобы там можно было хранить, например, текущее вводимое число, операцию, предыдущее введённое число, и т. д. А PressedButton может быть и √ и ± и sin и др. и без состояния это оборачивается в жестокую манипуляцию над HTML-элементом! |
| Часовой пояс GMT +3, время: 06:54. |