• 七十七:JavaScript之简易计算器实现


    HTML和CSS实现

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    body{background: #eee}
    #calculator{margin: 100px 0 0 150px;}
    </style>
    </head>
    <body>
    <div id="calculator">
    <p>
    <input type="text" class="formerInput" value="1">
    <span class="sign">+</span>
    <input type="text" class="laterInput" value="1">
    <span>=</span>
    <span class="resultOutput">2</span>
    </p>
    <p>
    <input type="button" value="+">
    <input type="button" value="-">
    <input type="button" value="x">
    <input type="button" value="÷">
    </p>
    </div>
    </body>
    </html>

    用js实现运算

    方法一(不推荐):

        <p>
    <input type="button" value="+" onclick="add();">
    <input type="button" value="-" onclick="subtract();">
    <input type="button" value="x" onclick="multiply();">
    <input type="button" value="÷" onclick="divde();">
    </p>
    </div>
    <script>
    // 获取元素
    var calculator = document.querySelector('#calculator'); // 父容器
    var formerInput = calculator.querySelector('.formerInput');
    var laterInput = calculator.querySelector('.laterInput');
    var sign = calculator.querySelector('.sign');
    var resultOutput = calculator.querySelector('.resultOutput');

    // 加法
    function add(){
    sign.innerHTML = '+';
    resultOutput.innerHTML = +formerInput.value + +laterInput.value; // 通过取正,强制把字符串转数字
    }

    // 减法
    function subtract(){
    sign.innerHTML = '-';
    resultOutput.innerHTML = formerInput.value - laterInput.value; // 字符串相减时,js会自动转为数字相减
    }

    // 乘法
    function multiply(){
    sign.innerHTML = 'x';
    resultOutput.innerHTML = formerInput.value * laterInput.value; // 字符串相乘时,js会自动转为数字相乘
    }

    // 除法
    function divde(){
    sign.innerHTML = '÷';
    resultOutput.innerHTML = formerInput.value / laterInput.value; // 字符串相除时,js会自动转为数字除时
    }
    </script>

    方法二:结构和行为分离,并且封装

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    body {background: #eee}
    #calculator {margin: 100px 0 0 150px;}
    </style>
    </head>
    <body>
    <div id="calculator">
    <p>
    <input type="text" class="formerInput" value="1"/>
    <span class="sign">+</span>
    <input type="text" class="laterInput" value="1"/>
    <span>=</span>
    <span class="resultOutput">2</span>
    </p>
    <p>
    <input type="button" value="+" class="btn" title="add">
    <input type="button" value="-" class="btn" title="subtract">
    <input type="button" value="x" class="btn" title="multiply">
    <input type="button" value="÷" class="btn" title="divide">
    <input type="button" value="%" class="btn" title="mod">
    </p>
    </div>
    <script>
    (function () {
    // 获取元素
    var wrapElem = document.querySelector('#calculator'); // 父容器
    var calculatorElem = {
    formerInput: wrapElem.querySelector('.formerInput'),
    laterInput: wrapElem.querySelector('.laterInput'),
    sign: wrapElem.querySelector('.sign'),
    resultOutput: wrapElem.querySelector('.resultOutput'),
    btns: wrapElem.querySelectorAll('.btn')
    }

    // 遍历取数组的值
    function each(array, fn) {
    for (var i = 0; i < array.length; i++) {
    fn(i, array[i]);
    }
    }

    // 更新符号
    function updateSign(symbol) {calculatorElem.sign.innerHTML = symbol;}

    // 输出结果
    function outputResult(result) {calculatorElem.resultOutput.innerHTML = result;}

    // 封装计算模块
    var operate = (function () {
    // 运算方法
    var operation = {
    add: function (num1, num2) {return +num1 + +num2},
    subtract: function (num1, num2) {return num1 - num2},
    multiply: function (num1, num2) {return num1 * num2},
    divide: function (num1, num2) {return num1 / num2},
    // 执行函数,提供接口给要新加计算方法的时候,通过addOperation添加,避免深入修改产生的错误
    addOperation: function (name, fn) {
    if (!operation[name]) {
    operation[name] = fn;
    return operation;
    }
    }
    }

    // 根据传入的运算名字从operation中取出对应的计算方式,并运算
    function operate(name, num1, num2) {
    if (!operation[name]) throw new Error('不存在名为' + name + '的计算方法');
    console.log(arguments);
    console.log([].slice.call(arguments, 1, arguments.length));
    return operation[name].apply(operation, [].slice.call(arguments, 1, arguments.length)); // 不定长参数
    }
    operate.addOperation = operation.addOperation;
    return operate;
    })();

    // 添加一个取余的运算
    operate.addOperation('mod', function (num1, num2) {return num1 % num2})

    // 遍历元素根据元素的title取对应的计算方法
    each(calculatorElem.btns, function (index, elem) {
    elem.onclick = function () {
    updateSign(this.value); // + - * /
    // 用title做取计算方式的识别:add、subtract、multiply、divide
    outputResult(operate(this.title, calculatorElem.formerInput.value, calculatorElem.laterInput.value));
    }
    })
    })();

    </script>
    </body>
    </html>

    讨论群:249728408
  • 相关阅读:
    汉诺塔
    协变和逆变随笔
    NetCore开发第一步 Log4Net日志引入
    插入排序算法
    选择排序算法
    冒泡排序算法
    排序算法
    线性链表
    SAN
    SAM -- Chap 8 提升方法 自我梳理
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/14213812.html
Copyright © 2020-2023  润新知