【从零开始的Java开发】2-9-2 案例:仿Windows计算器

需求与准备

  1. 实现单击按钮录入数字
  2. 实现基础四则运算功能,并添加必要的异常处理,如除数为零等
  3. 实现小数点功能并添加异常处理:小数点只能出现一次
  4. 实现正负号功能
  5. 实现退位功能,已经是最后一位时,显示框显示为0
  6. 清屏功能

准备

创三个文件,html,css,js。

html:

<!DOCTYPE html>
<html>

<head>
    <title></title>
    <!-- css引用 -->
    <link rel="stylesheet" type="text/css" href="calculator_css.css">
    <!-- js引用 -->
    <script type="text/javascript" src="calculator_js.js"></script>
</head>

<body>
</body>

</html>

事件的两种添加方法

html:

<body onload="f2()">
    <!-- 方法1 -->
    <input type="button" value="test1" id="btn1" onclick="f1()">
    <!-- 方法2 -->
    <input type="button" value="test2" id="btn2">
</body>

js:

function f1() {
    alert("test1");
}

function f2() {
    document.getElementById("btn2").onclick = function() {
        alert("test2");
    }
}

则:点test1按钮就弹出test1,点test2按钮就弹出test2.

计算机面板

  • 一个文本框
  • 10个数字
  • 加减乘除
  • 一个小数点
  • 一个退位键
  • 一个正负号
  • 一个等号
  • 一个清屏

一共有20个元素。

步骤一:一个大概

html:

<body>
    <div id="div1">
        <div id="div2">
            <!-- 文本框 -->
            <input type="text" name="" id="" />
        </div>
        <div id="div3">
            <!-- 20个按钮 -->
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="0" name="" id="" />
        </div>
    </div>
</body>

css:

/*选择所有*/
* {
    margin: 0px;
    padding: 0px;
}

/*选择所有div*/
div {
    width: 170px;
}

/*选择id是div1的*/
#div1 {
    top: 60px;
    left: 100px;
    position: absolute;
}

/*选择所有input开头的,类型是button的*/
input[type="button"] {
    width: 30px;
    /*一般选择右边距:这样可以左对齐*/
    margin-right: 5px;
}

大概长成这样。
在这里插入图片描述
有效果可知,我们要把文本框拉小一些。

增加css:

input[type="text"] {
    width: 146px;
    /*调整一下就能得到*/
}

于是就对齐了。

步骤二:写上value

<body>
    <div id="div1">
        <div id="div2">
            <!-- 文本框 -->
            <input type="text" name="" id="" />
        </div>
        <div id="div3">
            <!-- 20个按钮 -->
            <!-- 清屏 -->
            <input type="button" value="C" name="" id="" />
            <!-- 退位键 -->
            <input type="button" value="" name="" id="" />
            <input type="button" value="+/-" name="" id="" />
            <input type="button" value="/" name="" id="" />
            <input type="button" value="1" name="" id="" />
            <input type="button" value="2" name="" id="" />
            <input type="button" value="3" name="" id="" />
            <input type="button" value="*" name="" id="" />
            <input type="button" value="4" name="" id="" />
            <input type="button" value="5" name="" id="" />
            <input type="button" value="6" name="" id="" />
            <input type="button" value="-" name="" id="" />
            <input type="button" value="7" name="" id="" />
            <input type="button" value="8" name="" id="" />
            <input type="button" value="9" name="" id="" />
            <input type="button" value="+" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="." name="" id="" />
            <input type="button" value="=" name="" id="" />
            <!-- 一个超级链接 -->
            <input type="button" value="m" name="" id="" />
        </div>
    </div>
</body>

效果:
在这里插入图片描述

步骤三:文本框

  • 文本框默认显示为0且右对齐:

html的div2改成:

<div id="div2">
            <!-- 文本框 -->
            <input type="text" value="0" name="" id="" />
 </div>

css的input[type="text"]改成:

input[type="text"] {
    /*调整一下就能得到*/
    width: 146px;
    /*令文本框内数字右对齐*/
    text-align: right;
}

或者在js中集中初始化中设置默认为0。

function init() {
    // 获取文本框
    var num = document.getElementById("num");
    //文本框默认为0
    num.value = 0;
}
  • 禁用文本框的键盘输入

方法1:写在标签里,不推荐。

<div id="div2">
            <!-- 文本框 -->
            <input type="text" value="0" name="" id="" disabled="disabled" />
</div>

方法2:写在js的初始化(集中)里,推荐。

//init加上
num.disabled = "disabled";

效果:
在这里插入图片描述

步骤四:单击按钮使文本框显示数字

用1举例:
html:

<input type="button" value="1" name="" id="" onclick="num_1_click()" />

js:

function num_1_click() {
    var num = document.getElementById("num");
    //文本框的值
    var n = num.value;
    //字符串拼接
    if (n == "0") {
        n = "1";
    } else {
        n = n + "1";
    }

    num.value = n;
}

狂点1后的显示效果:
在这里插入图片描述
然后可以2-9也这样改。但是,如果给每一个按钮都添加一个事件,这样的耦合度太高了,不够好。

步骤五:单击按钮使文本框显示数字的优化1

按钮1的js:

function num_1_click() {
    var num = document.getElementById("num");
    //文本框的值
    var n = num.value;
    //字符串拼接
    n = n + "1";

    num.value = n * 1;
}

按钮2的js:

function num_2_click() {
    var num = document.getElementById("num");
    //文本框的值
    var n = num.value;
    //字符串拼接
    n = n + "2";

    num.value = n * 1;
}

我们可以很容易看出,这些代码的重复性很高。

接下来是另一个方法。需求:点击任何一个案件则弹出这个案件的内容。

js:

function init() {
    // 获取文本框
    var num = document.getElementById("num");
    //文本框默认为0
    num.value = 0;
    //禁用文本框
    num.disabled = "disabled";
	
	//获取所有input
    var oButton = document.getElementsByTagName("input");//这是数组
    for (var i = 0; i < oButton.length; i++) {
        oButton[i].onclick = function() {
            alert(this.value);
        }
    }
}

接下来,我们要做的事情:

  • 单击的如果是数字,要让他出现在文本框内
  • 单击的如果是其他,则要有对应功能

如何区分数字和非数字呢?

步骤六:单击按钮使文本框显示数字的优化2

区分数字的js:

//是数字 返回true
function isNumber(n) {
    return !isNaN(n);
}

init:

function init() {
    // 获取文本框
    var num = document.getElementById("num");
    //文本框默认为0
    num.value = 0;
    //禁用文本框
    num.disabled = "disabled";

    var oButton = document.getElementsByTagName("input");
    for (var i = 0; i < oButton.length; i++) {
        oButton[i].onclick = function() {
            if (isNumber(this.value)) {
                //在文本框追加数字:*1可以去除前导零
                num.value = (num.value + this.value) * 1;
            } else {

            }
        }
    }
}

效果:数字的追加很顺利。
在这里插入图片描述

步骤七:非数字按钮的显示与四则运算的实现

js的if-else:

if (isNumber(this.value)) {
                //在文本框追加数字:*1可以去除前导零
                num.value = (num.value + this.value) * 1;
            } else {
                //判断所单击的是什么
                var btn_num = this.value;
                // alert(btn_num);


                switch (btn_num) {
                    case "+":
                        {
                            btn_num1 = parseInt(num.value);
                            num.value = 0;
                            flag = 1;
                            break;
                        }
                    case "-":
                        {
                            btn_num1 = parseInt(num.value);
                            num.value = 0;
                            flag = 2;
                            break;
                        }
                    case "*":
                        {
                            btn_num1 = parseInt(num.value);
                            num.value = 0;
                            flag = 3;
                            break;
                        }
                    case "/":
                        {
                            btn_num1 = parseInt(num.value);
                            num.value = 0;
                            flag = 4;
                            break;
                        }
                    case "=":
                        {
                            if (flag == 1) {
                                // alert(num.value);
                                // alert(btn_num1);
                                num.value = parseInt(num.value) + btn_num1;
                            } else if (flag == 2) {
                                num.value = btn_num1 - parseInt(num.value);
                            } else if (flag == 3) {
                                num.value = parseInt(num.value) * btn_num1;
                            } else {
                                if (parseInt(num.value) == 0) {
                                    num.value = 0;
                                    alert("除数不能为0!");
                                } else {
                                    num.value = btn_num1 / parseInt(num.value);
                                }
                            }
                            break;
                        }
                        //剩下的还没写呢
                    case ".":
                        {
                            break;
                        }
                    case "C":
                        {
                            break;
                        }
                    case "⬅":
                        {
                            break;
                        }
                    case "+/-":
                        {
                            break;
                        }
                    case "m":
                        {
                            break;
                        }
                }

步骤八:小数点功能的实现

  • 小数点只能出现一次
  • 之前的parseInt()要改成Number()

case "."部分:

case ".":
{
     num.value = dec_number(num.value);
     break;
 }

dec_number

//小数点功能
function dec_number(n) {
    //不存在
    if (n.indexOf(".") == -1) {
        n = n + ".";
    }
    return n;
}

步骤九:退位键功能的实现

js:

//退位键功能
function back(n) {
    if (n == "0" || n.length == 0 || n.length == 1) {
        n = "0";
    } else {
        n = n.substr(0, n.length - 1);
    }
    return n;
}

步骤十:清屏和正负号功能的实现

正负号js:

//正负号
function sign(n) {
    //正
    if (n.indexOf("-") == -1) {
        n = "-" + n;
    } else {
        //负
        n = n.substr(1, n.length);
    }
    return n;
}

清屏js:

case "C":
{
     num.value = "0";
     break;
 }

步骤十一:其他补充

包括:

  1. 鼠标浮动在按键上有一个背景色的改变
  2. 鼠标点击m后可以点开一个在线计算器的网址
  3. 加大文本框里数字与右边框的距离

鼠标浮动在按键上有一个背景色的改变css:

/*在任何一个按钮上产生浮动时*/
input[type="button"]:hover {
    background-color: lightpink;
    border: 1px solid;
    /*去掉边框*/
}

鼠标点击m后可以点开一个在线计算器的网址js:

// 鼠标点击m后可以点开一个在线计算器的网址
function click() {
    var m = document.getElementById("m");
    m.onclick = function() {
        window.location.href = "https://cal.supfree.net/";
    }
}

加大文本框里数字与右边框的距离css:

input[type="text"] {
    /*调整一下就能得到*/
    width: 150px;
    /*令文本框内数字右对齐*/
    text-align: right;
    /*文本框设置为白色*/
    background-color: #ffffff;
    /*边框b不要太粗*/
    border: 1px solid;
    /*添加的是这下面的*/
    /*添加右侧内边距: 用已存在的border-box*/
    box-sizing: border-box;
    padding-right: 5px;
}

大功告成!
在这里插入图片描述

总体代码

html

<!DOCTYPE html>
<html>

<head>
    <title></title>
    <!-- css引用 -->
    <link rel="stylesheet" type="text/css" href="calculator_css.css">
    <!-- js引用 -->
    <script type="text/javascript" src="calculator_js.js"></script>
</head>

<body onload="init(),click()">
    <div id="div1">
        <div id="div2">
            <!-- 文本框 -->
            <input type="text" value="" name="num" id="num" />
        </div>
        <div id="div3">
            <!-- 20个按钮 -->
            <!-- 清屏 -->
            <input type="button" value="C" name="" id="" />
            <!-- 退位键 -->
            <input type="button" value="" name="" id="" />
            <input type="button" value="+/-" name="" id="" />
            <input type="button" value="/" name="" id="" />
            <input type="button" value="1" name="n1" id="n1" />
            <input type="button" value="2" name="" id="" />
            <input type="button" value="3" name="" id="" />
            <input type="button" value="*" name="" id="" />
            <input type="button" value="4" name="" id="" />
            <input type="button" value="5" name="" id="" />
            <input type="button" value="6" name="" id="" />
            <input type="button" value="-" name="" id="" />
            <input type="button" value="7" name="" id="" />
            <input type="button" value="8" name="" id="" />
            <input type="button" value="9" name="" id="" />
            <input type="button" value="+" name="" id="" />
            <input type="button" value="0" name="" id="" />
            <input type="button" value="." name="" id="" />
            <input type="button" value="=" name="" id="" />
            <!-- 一个超级链接 -->
            <input type="button" value="m" name="m" id="m" />
        </div>
    </div>
</body>

</html>

css

/*选择所有*/
* {
    margin: 0px;
    padding: 0px;
}

/*选择所有div*/
div {
    width: 170px;
}

/*选择id是div1的*/
#div1 {
    top: 60px;
    left: 100px;
    position: absolute;
}

/*选择所有input开头的,类型是button的*/
input[type="button"] {
    width: 30px;
    /*一般选择右边距:这样可以左对齐*/
    margin-right: 5px;
    /*上边距*/
    margin-top: 5px;
}

input[type="text"] {
    /*调整一下就能得到*/
    width: 150px;
    /*令文本框内数字右对齐*/
    text-align: right;
    /*文本框设置为白色*/
    background-color: #ffffff;
    /*边框b不要太粗*/
    border: 1px solid;
    /*添加右侧内边距: 用已存在的border-box*/
    box-sizing: border-box;
    padding-right: 5px;
}

/*在任何一个按钮上产生浮动时*/
input[type="button"]:hover {
    background-color: lightpink;
    border: 1px solid;
    /*去掉边框*/
}

js

//应该是全局变量才行
var btn_num1;
var flag = 0;

function init() {
    // 获取文本框
    var num = document.getElementById("num");
    //文本框默认为0
    num.value = 0;
    //禁用文本框
    num.disabled = "disabled";

    var oButton = document.getElementsByTagName("input");
    for (var i = 0; i < oButton.length; i++) {
        oButton[i].onclick = function() {
            if (isNumber(this.value)) {
                //在文本框追加数字:*1可以去除前导零
                num.value = (num.value + this.value) * 1;
            } else {
                //判断所单击的是什么
                var btn_num = this.value;
                // alert(btn_num);


                switch (btn_num) {
                    case "+":
                        {
                            btn_num1 = Number(num.value);
                            num.value = 0;
                            flag = 1;
                            break;
                        }
                    case "-":
                        {
                            btn_num1 = Number(num.value);
                            num.value = 0;
                            flag = 2;
                            break;
                        }
                    case "*":
                        {
                            btn_num1 = Number(num.value);
                            num.value = 0;
                            flag = 3;
                            break;
                        }
                    case "/":
                        {
                            btn_num1 = Number(num.value);
                            num.value = 0;
                            flag = 4;
                            break;
                        }
                    case "=":
                        {
                            if (flag == 1) {
                                // alert(num.value);
                                // alert(btn_num1);
                                num.value = Number(num.value) + btn_num1;
                            } else if (flag == 2) {
                                num.value = btn_num1 - Number(num.value);
                            } else if (flag == 3) {
                                num.value = Number(num.value) * btn_num1;
                            } else {
                                if (Number(num.value) == 0) {
                                    num.value = 0;
                                    alert("除数不能为0!");
                                } else {
                                    num.value = btn_num1 / Number(num.value);
                                }
                            }
                            break;
                        }
                    case ".":
                        {
                            num.value = dec_number(num.value);
                            break;
                        }
                    case "C":
                        {
                            num.value = "0";
                            break;
                        }
                    case "⬅":
                        {
                            num.value = back(num.value);
                            break;
                        }
                    case "+/-":
                        {
                            num.value = sign(num.value);
                            break;
                        }
                    case "m":
                        {
                            break;
                        }
                }

            }
        }
    }
}

//是数字 返回true
function isNumber(n) {
    return !isNaN(n);
}

//小数点功能
function dec_number(n) {
    //不存在
    if (n.indexOf(".") == -1) {
        n = n + ".";
    }
    return n;
}

//退位键功能
function back(n) {
    if (n == "0" || n.length == 0 || n.length == 1) {
        n = "0";
    } else {
        n = n.substr(0, n.length - 1);
    }
    return n;
}

//正负号
function sign(n) {
    //正
    if (n.indexOf("-") == -1) {
        n = "-" + n;
    } else {
        //负
        n = n.substr(1, n.length);
    }
    return n;
}

// 鼠标点击m后可以点开一个在线计算器的网址
function click() {
    var m = document.getElementById("m");
    m.onclick = function() {
        window.location.href = "https://cal.supfree.net/";
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karshey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值