编写一个JavaScript计算器



朋友们,美好的一天!

顾名思义,本文将编写一个简单的JavaScript计算器。

看了一个有关创建“简单计算器”的教程后,我就想到了编写计算器的愿望,事实证明这远非简单,而且实际上什么也做不了。

我们的计算器将非常简单(42行代码,包括块之间的空格),但功能全面且可扩展。这个出色的库(Math.js)

将用于计算 没有进一步介绍,我们开始做生意。



我们的标记如下所示:

<!-- head -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.6.4/math.js"></script>

<!-- body -->
<div class="calculator">
    <output></output>
</div>

在这里,我们连接库,为计算器创建一个容器,为输入字符和结果创建一个字段。

我们连接样式:
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  height: 100vh;
  background: radial-gradient(circle, skyblue, steelblue);
  display: flex;
  justify-content: center;
  align-items: center;
}

.calculator {
  width: 320px;
  height: 480px;
  background: #eee;
  border-radius: 5px;
  box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.2), -2px -2px 3px rgba(0, 0, 0, 0.2);
}

output {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 300px;
  height: 40px;
  background: #fff;
  margin: 10px auto;
  border-radius: 5px;
  font-size: 1.4em;
  font-weight: bold;
  box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.3),
    inset -1px -1px 1px rgba(0, 0, 0, 0.3);
}

.keyboard {
  height: 440px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-evenly;
  align-items: flex-start;
}

button {
  margin: 0.5em 1em;
  width: 40px;
  height: 40px;
  display: flex;
  justify-content: center;
  align-items: center;
  background: none;
  border: none;
  cursor: pointer;
  font-size: 1em;
  font-weight: bold;
}


这是我们目前所拥有的:



按钮将以编程方式生成。

我们传递给脚本。

我们定义一个用于输出结果的字段,并为键盘创建一个容器:

const output = document.querySelector('output')

const div = document.createElement('div')
div.classList.add('keyboard')
document.querySelector('.calculator').appendChild(div)

我们的字符行如下所示:

'C CE % / 7 8 9 * 4 5 6 - 1 2 3 + 0 ( ) ='

将此字符串转换为数组并创建按钮:

//    
//      ,       "CE"
'C CE % / 7 8 9 * 4 5 6 - 1 2 3 + 0 ( ) ='.split(' ')
    //   
    //   
    //      
    //      "value" 
    .map(symbol => {
        div.insertAdjacentHTML('beforeend', `<button value="${symbol}">${symbol}</button>`)
    })

我们找到创建的按钮,并向它们添加click事件处理程序:

document.querySelectorAll('button').forEach(button => {
    button.addEventListener('click', function () {
        //          
        calc(this.value)
    })
})

我们还希望能够使用键盘输入字符。为此,我们需要将``击键''事件处理程序添加到``文档''或``窗口''对象,然后过滤掉键的``键''属性的不必要值,例如使用正则表达式:

document.addEventListener('keydown', event => {
    if ((event.key).match(/[0-9%\/*\-+\(\)=]|Backspace|Enter/)) calc(event.key)
})

在这种情况下,match方法扮演过滤器的角色:它不允许将不匹配参数的参数传递给calc函数。

条件本身如下:如果event.key的值是方括号([]; 0到9之间的数字,除法,乘法,加法,减法,开括号,右括号或等号的符号;反斜杠; -转义)或(|-变更)Backspace,或Enter,然后我们将event.key作为参数调用calc,否则我们什么也不做(Shift也被成功丢弃)。

我们的主要(也是唯一的)calc函数如下(应从下至上读取代码):

//       
function calc(value) {
    //      Enter
    if (value.match(/=|Enter/)) {
        //   
        try {
            //   
            //     "evaluate"  "math"
            // Math.trunc      
            output.textContent = Math.trunc(math.evaluate(output.textContent))
            
        //    
        } catch {
            //   
            let oldValue = output.textContent
            //   
            let newValue = ' '
            //      
            output.textContent = newValue
            //       
            setTimeout(() => {
                output.textContent = oldValue
            }, 1500)
        }
        
    //    "C"
    } else if (value === 'C') {
        //  
        output.textContent = ''
    
    //    ""  Backspace
    } else if (value.match(/CE|Backspace/)) {
        //     
        output.textContent = output.textContent.substring(0, output.textContent.length - 1)
        
    //     ()   
    } else {
        //     
        output.textContent += value
    }
}

总之,关于已声明的可伸缩性和完整功能的几句话。

评估方法(以前为eval)和其他Math.js方法具有非常强大的功能。基于这些功能,我们可以通过向计算器添加新的字符和运算符来轻松扩展计算器的功能,从而可以使用浮点数(使用开关和“ toFixed”方法调整小数位数)等。

结果:



GitHub的 代码

感谢您的关注。希望您找到对自己有用的东西。周末愉快,编码愉快。

All Articles