За последние 24 часа нас посетили 20850 программистов и 1700 роботов. Сейчас ищут 1485 программистов ...

Можификация скрипта калькулятора на javascript

Тема в разделе "JavaScript и AJAX", создана пользователем olga_0630, 4 сен 2018.

  1. olga_0630

    olga_0630 Новичок

    С нами с:
    16 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Здравствуйте, просьба помочь, кто разбирается в JS, сама не смогла реализовать данный момент...

    1. Нужно, чтобы калькулятор был всегда включённый, то есть 0 всегда был на экране, в данный момент, калькулятор начинает работать, при наборе каких-либо цифр и при клике на клавишу С он просто выключается, то есть на экране ничего нет, а нужно чтобы всегда был 0.
    Первоначально на калькуляторе должен быть 0, производим подсчёт (работает нормально), сбрасываем должен быть 0, т.е как на обычном калькуляторе, только он не должен выключаться.

    Собственно сам код.
    HTML:
    Код (Text):
    1. <div id="calculator">
    2.         <div class="top">
    3.             <span class="clear" title="Очистить">C</span>
    4.             <div class="screen"></div>
    5.         </div>
    6.        
    7.         <div class="keys">
    8.             <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>.</span><span class="eval">=</span><span class="operator">x</span>
    9.         </div>
    10.     </div>
    Код JS:
    Код (Text):
    1. // calc_get all the keys from document -----------------------------------------------------------------------------------
    2. var keys = document.querySelectorAll('#calculator span');
    3. var operators = ['+', '-', 'x', '÷'];
    4. var decimalAdded = false;
    5.  
    6. // Add onclick event to all the keys and perform operations
    7. for(var i = 0; i < keys.length; i++) {
    8.     keys[i].onclick = function(e) {
    9.         // Get the input and button values
    10.         var input = document.querySelector('.screen');
    11.         var inputVal = input.innerHTML;
    12.         var btnVal = this.innerHTML;
    13.        
    14.         // Now, just append the key values (btnValue) to the input string and finally use javascript's eval function to get the result
    15.         // If clear key is pressed, erase everything
    16.         if(btnVal == 'C') {
    17.             input.innerHTML = '';
    18.             decimalAdded = false;
    19.         }
    20.        
    21.         // If eval key is pressed, calculate and display the result
    22.         else if(btnVal == '=') {
    23.             var equation = inputVal;
    24.             var lastChar = equation[equation.length - 1];
    25.            
    26.             // Replace all instances of x and ÷ with * and / respectively. This can be done easily using regex and the 'g' tag which will replace all instances of the matched character/substring
    27.             equation = equation.replace(/x/g, '*').replace(/÷/g, '/');
    28.            
    29.             // Final thing left to do is checking the last character of the equation. If it's an operator or a decimal, remove it
    30.             if(operators.indexOf(lastChar) > -1 || lastChar == '.')
    31.                 equation = equation.replace(/.$/, '');
    32.            
    33.             if(equation)
    34.                 input.innerHTML = eval(equation);
    35.                
    36.             decimalAdded = false;
    37.         }
    38.        
    39.         // Basic functionality of the calculator is complete. But there are some problems like
    40.         // 1. No two operators should be added consecutively.
    41.         // 2. The equation shouldn't start from an operator except minus
    42.         // 3. not more than 1 decimal should be there in a number
    43.        
    44.         // We'll fix these issues using some simple checks
    45.        
    46.         // indexOf works only in IE9+
    47.         else if(operators.indexOf(btnVal) > -1) {
    48.             // Operator is clicked
    49.             // Get the last character from the equation
    50.             var lastChar = inputVal[inputVal.length - 1];
    51.            
    52.             // Only add operator if input is not empty and there is no operator at the last
    53.             if(inputVal != '' && operators.indexOf(lastChar) == -1)
    54.                 input.innerHTML += btnVal;
    55.            
    56.             // Allow minus if the string is empty
    57.             else if(inputVal == '' && btnVal == '-')
    58.                 input.innerHTML += btnVal;
    59.            
    60.             // Replace the last operator (if exists) with the newly pressed operator
    61.             if(operators.indexOf(lastChar) > -1 && inputVal.length > 1) {
    62.                 // Here, '.' matches any character while $ denotes the end of string, so anything (will be an operator in this case) at the end of string will get replaced by new operator
    63.                 input.innerHTML = inputVal.replace(/.$/, btnVal);
    64.             }
    65.            
    66.             decimalAdded =false;
    67.         }
    68.        
    69.         // Now only the decimal problem is left. We can solve it easily using a flag 'decimalAdded' which we'll set once the decimal is added and prevent more decimals to be added once it's set. It will be reset when an operator, eval or clear key is pressed.
    70.         else if(btnVal == '.') {
    71.             if(!decimalAdded) {
    72.                 input.innerHTML += btnVal;
    73.                 decimalAdded = true;
    74.             }
    75.         }
    76.        
    77.         // if any other key is pressed, just append it
    78.         else {
    79.             input.innerHTML += btnVal;
    80.         }
    81.        
    82.         // prevent page jumps
    83.         e.preventDefault();
    84.     }
    85. }
    Заранее благодарна и буду признательна за помощь
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @olga_0630, для начала надо добавить 0 в <div class="screen"></div>.
    Далее, при нажатии "C" - инициализировать символом '0' (строка 17 в js коде).
    И убирать этот ноль при наборе числа... например, перед 79-й строкой добавить:
    Код (Javascript):
    1. if(inputVal === '0') {
    2.     input.innerHTML = '';
    3. }
     
  3. olga_0630

    olga_0630 Новичок

    С нами с:
    16 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Спасибо, всё почти работает, только код JS нужно вставлять перед 81 строкой иначе он не работает.

    1. В данный момент на экране 0, всё правильно, только при попытке ввода любой цыфры, 0 пропадает и на экране ничего нет и нужно ещё раз кликнуть по этой или другой цифре, то есть после второго клика всё работает, а после первого 0 сбрасывается и экран пустой и нужно ещё раз кликнуть по цифре и тогда она появляется на экране.

    2. Со сбросом всё нормально. После каких-либо операций, нажимаем на сброс и всё обнуляется сразу.

    Заранее благодарна.
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Именно в блок else, для которого комментарий: "if any other key is pressed, just append it", перед прибавлением цифры к input.innerHTML.
     
  5. olga_0630

    olga_0630 Новичок

    С нами с:
    16 фев 2018
    Сообщения:
    47
    Симпатии:
    0
    Спасибо вам за помощь, всё работает, разобралась.