JS實現簡易計算器的7種方法

来源:https://www.cnblogs.com/chenyingying0/archive/2020/01/03/12143674.html
-Advertisement-
Play Games

先放圖(好吧比較挫) 方法一:最容易版 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <title>簡易計算器</title> <style> body { background-color: #eee; } ...


先放圖(好吧比較挫)

方法一:最容易版

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="+" onclick="addHandler();" />
        <input type="button" value="-" onclick="subtractHandler();" />
        <input type="button" value="×" onclick="multiplyHandler();" />
        <input type="button" value="÷" onclick="divideHandler();" />
    </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 addHandler() {
            sign.innerHTML = '+';
            resultOutput.innerHTML = +formerInput.value + +laterInput.value;
        }
        //
        function subtractHandler() {
            sign.innerHTML = '-';
            resultOutput.innerHTML = formerInput.value - laterInput.value;
        }
        //
        function multiplyHandler() {
            sign.innerHTML = '×';
            resultOutput.innerHTML = formerInput.value * laterInput.value;
        }
        //
        function divideHandler() {
            sign.innerHTML = '÷';
            resultOutput.innerHTML = formerInput.value / laterInput.value;
        }
</script>
</body>
</html>

方法二:結構和行為分離

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="+" onclick="addHandler();" />
        <input type="button" value="-" onclick="subtractHandler();" />
        <input type="button" value="×" onclick="multiplyHandler();" />
        <input type="button" value="÷" onclick="divideHandler();" />
    </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');
        var btns = calculator.querySelectorAll('.btn');

        // 綁定事件
        // +
        btns[0].onclick = addHandler;
        // -
        btns[1].onclick = subtractHandler;
        // ×
        btns[2].onclick = multiplyHandler;
        // ÷
        btns[3].onclick = divideHandler;

        //
        function addHandler() {
            sign.innerHTML = '+';
            resultOutput.innerHTML = +formerInput.value + +laterInput.value;
        }
        //
        function subtractHandler() {
            sign.innerHTML = '-';
            resultOutput.innerHTML = formerInput.value - laterInput.value;
        }
        //
        function multiplyHandler() {
            sign.innerHTML = '×';
            resultOutput.innerHTML = formerInput.value * laterInput.value;
        }
        //
        function divideHandler() {
            sign.innerHTML = '÷';
            resultOutput.innerHTML = formerInput.value / laterInput.value;
        }
</script>
</body>
</html>

方法三:迴圈綁定事件

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="+" onclick="addHandler();" />
        <input type="button" value="-" onclick="subtractHandler();" />
        <input type="button" value="×" onclick="multiplyHandler();" />
        <input type="button" value="÷" onclick="divideHandler();" />
    </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');
        var btns = calculator.querySelectorAll('.btn');

        // 綁定事件
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function () {
                switch (this.title) {
                    case 'add':
                        addHandler();
                        break;
                    case 'subtract':
                        subtractHandler();
                        break;
                    case 'multiply':
                        multiplyHandler();
                        break;
                    case 'divide':
                        divideHandler();
                        break;
                }
            };
        }

        //
        function addHandler() {
            sign.innerHTML = '+';
            resultOutput.innerHTML = +formerInput.value + +laterInput.value;
        }
        //
        function subtractHandler() {
            sign.innerHTML = '-';
            resultOutput.innerHTML = formerInput.value - laterInput.value;
        }
        //
        function multiplyHandler() {
            sign.innerHTML = '×';
            resultOutput.innerHTML = formerInput.value * laterInput.value;
        }
        //
        function divideHandler() {
            sign.innerHTML = '÷';
            resultOutput.innerHTML = formerInput.value / laterInput.value;
        }
</script>
</body>
</html>

方法四:提取函數

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="×" class="btn" title="multiply" />
        <input type="button" value="÷" class="btn" title="divide" />
    </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');
        var btns = calculator.querySelectorAll('.btn');

        // 綁定事件
        each(btns, function (index, elem ) {
            elem.onclick = function () {
                switch (this.title) {
                    case 'add':
                        addHandler();
                        break;
                    case 'subtract':
                        subtractHandler();
                        break;
                    case 'multiply':
                        multiplyHandler();
                        break;
                    case 'divide':
                        divideHandler();
                        break;
                }
            };
        });
        
        // 遍歷
        function each(array, fn) {
            for (var i = 0; i < array.length; i++) {
                fn(i, array[i]);
            }
        }

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

        // 加法
        function add(num1, num2) {
            return +num1 + +num2;
        }
        // 減法
        function subtract(num1, num2) {
            return num1 - num2;
        }
        // 乘法
        function multiply(num1, num2) {
            return num1 * num2;
        }
        // 除法
        function divide(num1, num2) {
            return num1 / num2;
        }

        // 輸出結果
        function outputResult(result) {
            resultOutput.innerHTML = result;
        }

        //
        function addHandler() {
            // sign.innerHTML = '+';
            updateSign('+');
            outputResult(add(formerInput.value, laterInput.value));
        }
        //
        function subtractHandler() {
            updateSign('-');
            outputResult(subtract(formerInput.value, laterInput.value));
        }
        //
        function multiplyHandler() {
            updateSign('×');
            outputResult(multiply(formerInput.value, laterInput.value));
        }
        //
        function divideHandler() {
            updateSign('÷');
            outputResult(divide(formerInput.value, laterInput.value));
        }
</script>
</body>
</html>

方法五:管理代碼(找到組織)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="×" class="btn" title="multiply" />
        <input type="button" value="÷" class="btn" title="divide" />
    </p>
</div>

<script>
            // 獲取元素
            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')
            };

            // 綁定事件
            each(calculatorElem.btns, function (index, elem    ) {
                elem.onclick = function () {
                    switch (this.title) {
                        case 'add':
                            addHandler();
                            break;
                        case 'subtract':
                            subtractHandler();
                            break;
                        case 'multiply':
                            multiplyHandler();
                            break;
                        case 'divide':
                            divideHandler();
                            break;
                    }
                };
            });
            
            // 遍歷
            function each(array, fn) {
                for (var i = 0; i < array.length; i++) {
                    fn(i, array[i]);
                }
            }

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

            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;
                }
            };

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

            //
            function addHandler() {
                // sign.innerHTML = '+';
                updateSign('+');
                outputResult(operation.add(calculatorElem.formerInput.value, calculatorElem.laterInput.value));
            }
            //
            function subtractHandler() {
                updateSign('-');
                outputResult(operation.subtract(calculatorElem.formerInput.value, calculatorElem.laterInput.value));
            }
            //
            function multiplyHandler() {
                updateSign('×');
                outputResult(operation.multiply(calculatorElem.formerInput.value, calculatorElem.laterInput.value));
            }
            //
            function divideHandler() {
                updateSign('÷');
                outputResult(operation.divide(calculatorElem.formerInput.value, calculatorElem.laterInput.value));
            }
</script>
</body>
</html>

方法六:OCP開放--封閉原則

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="×" class="btn" title="multiply" />
        <input type="button" value="÷" class="btn" title="divide" />
        <input type="button" value="%" class="btn" title="mod" />
        <input type="button" value="^" class="btn" title="power" />
        <!-- <input type="button" value="1/x" class="btn" title="invert" /> -->
    </p>
</div>

<script>
    // 獲取元素
    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')
    };

    // 綁定事件
    each(calculatorElem.btns, function (index, elem    ) {
            elem.onclick = function () {
                updateSign(this.value);
                outputResult(operate(this.title, calculatorElem.formerInput.value, calculatorElem.laterInput.value));
            };
    });
    
    // 遍歷
    function each(array, fn) {
        for (var i = 0; i < array.length; i++) {
            fn(i, array[i]);
        }
    }

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

    // 運算
    function operate(name, num1, num2) {
            if (!operation[name]) throw new Error('不存在名為' + name + '的運算方法!');
            return operation[name](num1, num2);
    }

    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: function (name, fn) {
                if (!this[name]) {
                    this[name] = fn;
                }
                return this;
            }
    };

    operation.addOperation('mod', function (num1, num2) {
        return num1 % num2;
    }).addOperation('power', function (base, power) {
        return Math.pow(base, power);
    });

    // 輸出結果
    function outputResult(result) {
        calculatorElem.resultOutput.innerHTML = result;
    }
</script>
</body>
</html>

方法七:模塊化

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>簡易計算器</title>
<style>
    body {
        background-color: #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="×" class="btn" title="multiply" />
        <input type="button" value="÷" class="btn" title="divide" />
        <input type="button" value="%" class="btn" title="mod" />
        <input type="button" value="^" class="btn" title="power" />
        <input type="button" value="1/x" class="btn" title="invert" />
    </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')
        };

        // 綁定事件
        each(calculatorElem.btns, function (index, elem    ) {
                elem.onclick = function () {
                    updateSign(this.value);
                    outputResult(operate(this.title, calculatorElem.formerInput.value, calculatorElem.laterInput.value));
                };
        });
        
        // 遍歷
        function each(array, fn) {
            for (var i = 0; i < array.length; i++) {
                fn(i, array[i]);
            }
        }

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

        // 運算
        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: function (name, fn) {
                        if (!operation[name]) {
                            operation[name] = fn;
                        }
                        return operation;
                    }
            };

            function operate(name) {
                    if (!operation[name]) throw new Error('不存在名為' + name + '的運算方法!');
                    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;
        }).addOperation('power', function (base, power) {
            return Math.pow(base, power);
        }).addOperation('invert', function (num) {
            return 1 / num;
        });

        // 輸出結果
        function outputResult(result) {
            calculatorElem.resultOutput.innerHTML = result;
        }
    })();
      
</script>
</body>
</html>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 面向對象的編程思想(貪吃蛇梳理) 模擬貪吃蛇游戲,做的項目 地圖: 寬,高,背景顏色,因為小蛇和食物都是相對於地圖顯示的, 這裡小蛇和食物都是地圖的子元素, 隨機位置顯示, 脫離文檔流的, 地圖也需要脫離文檔流--css需要設置:寬, 高, 背景顏色, 脫標 食物 div元素 elements >存 ...
  • js驗證回送地址,IP地址不能以127開頭 回送地址(127.x.x.x)是本機回送地址(Loopback Address) ...
  • 案例貪吃蛇,把封裝的函數移動到js文件中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> <style> .map { width: 800px; height: 600px; b ...
  • 案例:貪吃蛇小游戲 可以玩的小游戲,略複雜,過了2遍,先pass吧 先創建構造函數,再給原型添加方法。分別創建食物,小蛇和游戲對象。 食物,小蛇的橫縱坐標,設置最大最小值,運動起來的函數,按上下左右鍵的處理函數,吃到的處理函數 <!DOCTYPE html> <html lang="en"> <he ...
  • "^[0-9]*[1-9][0-9]*$" //正整數"^((-\d+)|(0+))$" //非正整數(負整數 + 0)"^-[0-9]*[1-9][0-9]*$" //負整數"^-?\d+$" //整數"^\d+(\.\d+)?$" //非負浮點數(正浮點數 + 0)"^(([0-9]+\.[0- ...
  • Object 是javascript 父對象 function F(){ //自定義函數 } alert(F.prototype); //函數原型是object對象 alert(F.prototype instanceof Object); //true 閉包 全局變數在函數內部可以訪問 funct ...
  • 該篇僅是本人學習前端時,做的備忘筆記: 一、背景圖片設置: 設置背景圖時的css代碼:background-image:url(圖片的url路徑); ps:設置好這個背景後請一定要設置該背景圖片的大小和該背景圖片的顯示區域,css樣式設置如下: e.g. background-size:36px 3 ...
  • 查看對象的方法,繼續控制台輸出,如圖: hasOwnProperty():返回一個布爾值,指示對象自身屬性中是否具有指定的屬性(也就是,是否有指定的鍵)。 isPrototypeOf():用於測試一個對象是否存在於另一個對象的原型鏈上。 toString():返回一個表示該對象的字元串。 value ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...