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, время: 12:03. |