Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.06.2019, 19:22
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 11.05.2019
Сообщений: 30

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();
  } 
}
Ответить с цитированием
  #2 (permalink)  
Старый 28.06.2019, 20:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

DarkPhoenix,
на всякий случай, для строки 25 нет элемента в вашем html!!!
Ответить с цитированием
  #3 (permalink)  
Старый 28.06.2019, 20:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Сообщение от DarkPhoenix
А должно начать заново...
<!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>
Ответить с цитированием
  #4 (permalink)  
Старый 28.06.2019, 21:01
Аспирант
Отправить личное сообщение для DarkPhoenix Посмотреть профиль Найти все сообщения от DarkPhoenix
 
Регистрация: 11.05.2019
Сообщений: 30

Есть. Скинул старую версию.

А как все спаны и т.д. Сделать в 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>
Ответить с цитированием
  #5 (permalink)  
Старый 28.06.2019, 21:38
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от DarkPhoenix
А как все спаны
Этот позор замените на нормальные кнопки...

Кстати у вас получился не арифметический калькулятор! Т. е. если набрать 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-элементом!

Последний раз редактировалось Malleys, 28.06.2019 в 21:47.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вакансия JavaScript разработчик / JS / Frontend developer (Санкт-Петербург) Сергей Грачёв Работа 0 21.09.2015 12:31
JS калькулятор, работа с отрицательными числами. TOPHOP Общие вопросы Javascript 1 24.06.2015 13:13
Помогите к js коду, написать html код Modrih Элементы интерфейса 8 16.06.2015 18:08
Пример тестовых заданий на js junior elshaarawy Учебные материалы 3 26.03.2015 15:17
Помогите найти калькулятор на js GennadiyZm Общие вопросы Javascript 1 29.07.2011 16:26