花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 53|回复: 16

练手:JS计算器(第一版)

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2023-12-31 08:50 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    本帖最后由 马黑黑 于 2023-12-31 09:29 编辑

    计算器
    0
    C
    (
    )
    7
    8
    9
    ÷
    4
    5
    6
    ×
    1
    2
    3
    0
    .
    %

    评分

    参与人数 3威望 +130 金钱 +260 经验 +130 收起 理由
    红影 + 50 + 100 + 50 赞一个!
    起个网名好难 + 30 + 60 + 30 赞一个!
    樵歌 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2023-12-31 08:51 | 显示全部楼层
    本帖最后由 马黑黑 于 2023-12-31 09:30 编辑

    代码
    1. <style>
    2. #ma {
    3.     margin: 50px auto 0;
    4.     padding: 8px;
    5.     width: fit-content;
    6.     max-width: 296px;
    7.     box-sizing: border-box;
    8.     height: fit-content;
    9.     border-radius: 10px;
    10.     background: #666;
    11.     box-shadow: 2px 4px 8px black;
    12. }
    13. #calcMsg, #calcRes {
    14.     padding: 6px;
    15.     color: #eee;
    16.     font-size: 14px;
    17.     word-break: break-all;
    18. }
    19. #calcRes {
    20.     text-align: right;
    21.     color: #000;
    22.     font-size: 20px;
    23.     background: #eee;
    24. }
    25. #calc {
    26.     display: grid;
    27.     place-items: center;
    28.     grid-template-columns: repeat(4, 70px);
    29.     grid-template-rows: repeat(5, 60px);
    30. }
    31. .btn, .clear {
    32.     width: 40px;
    33.     height: 40px;
    34.     border-radius: 50%;
    35.     background: #ccc;
    36.     box-shadow: inset 0 0 10px #000;
    37.     font: normal 20px/40px sans-serif;
    38.     text-align: center;
    39.     user-select: none;
    40. }
    41. .btn:hover, .clear:hover {
    42.     background: #aaa;
    43. }
    44. .num { color: darkred; font-weight: bold; }
    45. </style>

    46. <div id="ma">
    47.     <div id="calcMsg">计算器</div>
    48.     <div id="calcRes">0</div>
    49.     <div id="calc">
    50.         <div class="clear" id="clear">C</div>
    51.         <div class="btn" data-idx="(">(</div>
    52.         <div class="btn" data-idx=")">)</div>
    53.         <div class="clear" id="del">←</div>
    54.         <div class="btn num" data-idx="7">7</div>
    55.         <div class="btn num" data-idx="8">8</div>
    56.         <div class="btn num" data-idx="9">9</div>
    57.         <div class="btn" data-idx="/">÷</div>
    58.         <div class="btn num" data-idx="4">4</div>
    59.         <div class="btn num" data-idx="5">5</div>
    60.         <div class="btn num" data-idx="6">6</div>
    61.         <div class="btn" data-idx="*">×</div>
    62.         <div class="btn num" data-idx="1">1</div>
    63.         <div class="btn num" data-idx="2">2</div>
    64.         <div class="btn num" data-idx="3">3</div>
    65.         <div class="btn num" data-idx="-">-</div>
    66.         <div class="btn num" data-idx="0">0</div>
    67.         <div class="btn" data-idx=".">.</div>
    68.         <div class="btn" id="percent">%</div>
    69.         <div class="btn" data-idx="+">+</div>
    70.         <div class="clear" id="pow2">x&#178;</div>
    71.         <div class="clear" id="pow3">x&#179;</div>
    72.         <div class="clear" id="sqrt">√</div>
    73.         <div class="clear" id="equal" data-idx="=">=</div>
    74.     </div>
    75. </div>
    76.   
    77. <script>

    78. let btns = document.querySelectorAll('.btn');

    79. let _eval = (fn) => new Function('return ' + fn)();

    80. btns.forEach(item => {
    81.     item.onclick = () => {
    82.         calcRes.innerText = calcRes.innerText === '0' ? item.dataset.idx : (calcRes.innerText + item.dataset.idx);
    83.         calcMsg.innerText = calcRes.innerText;
    84.     }
    85. });

    86. clear.onclick = () => {
    87.     calcMsg.innerText = '计算器';
    88.     calcRes.innerText = '0';
    89. };

    90. equal.onclick = () => {
    91.     if(calcMsg.innerText.lastIndexOf('=') != -1) return;
    92.     let str = calcRes.innerText;
    93.     let result = _eval(str);
    94.     calcRes.innerText = num2Fixed(result);
    95.     calcMsg.innerText += '=';
    96.    
    97. };

    98. del.onclick = () => {
    99.     calcRes.innerText = calcRes.innerText.slice(0,-1);
    100.     calcMsg.innerText = calcMsg.innerText.slice(0,-1);
    101. };

    102. sqrt.onclick = () => {
    103.     let num = calcRes.innerText;
    104.     calcRes.innerText = Math.sqrt(num);
    105.     calcMsg.innerText = `√(${num})=`;
    106. }

    107. pow2.onclick = () => {
    108.     let num = calcRes.innerText;
    109.     calcRes.innerText = Math.pow(num,2);
    110.     calcMsg.innerText = `${num}\u00b2=`;
    111. }

    112. pow3.onclick = () => {
    113.     let num = calcRes.innerText;
    114.     calcRes.innerText = Math.pow(num,3);
    115.     calcMsg.innerText = `${num}\u00b3=`;
    116. }

    117. percent.onclick = () => {
    118.     let num = calcRes.innerText;
    119.     calcRes.innerText = _eval(num/100);
    120.     calcMsg.innerText = num + '/100=';
    121. };

    122. let num2Fixed = (res) => {
    123.     let str = typeof(res) === 'number' ? res.toString() : res;
    124.     let ar = str.split('.');
    125.     if(ar.length <= 1) return res;
    126.     if(ar[1].length >= 14) str = str.slice(0,-1);
    127.     return parseFloat(str);
    128. };

    129. </script>
    复制代码


    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2023-12-31 08:51 | 显示全部楼层
    本帖最后由 马黑黑 于 2023-12-31 09:23 编辑

    未解决的已知问题:
    • 浮点数运算的精准度。由于JS内部机制中基于浮点数的运算存在bug,我采用了截取方法处理这个问题,当小数点后面的数字大于等于14,去掉最后一位数,没有四舍五入,存在精度准确问题;
    • 特大整数运算未做测试,估计也可能存在问题,原因也是JS数据类型问题导致。不过JS会自动使用科学计数法,绝大多数的特大整数运算应该过得去;
    • 算式合法性检测机制。这个,比如四则运算的括号问题、除以0等问题,未做任何处理;
    • 0.xxx表达式的显示问题:小数点前面的 0 不显示。



    作为练手小作品,第一版就酱吧。欢迎各位提出意见与建议,谢谢,顺祝2024新年快乐

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-16 07:14
  • 签到天数: 648 天

    [LV.9]以坛为家II

    1376

    主题

    7万

    回帖

    13万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥多彩人生海样胸怀春风拂面青草情怀心曲飞扬七彩绚丽活泼开朗男儿情怀鹰傲苍穹共看流星风雨同行我心永远天长地久幸福快乐春意盎然喜乐安康心想事成周年庆指尖上的流年舞会之星情人节花潮管理

    发表于 2023-12-31 10:04 | 显示全部楼层
    真好用,能下载到瘦机上吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-16 07:14
  • 签到天数: 648 天

    [LV.9]以坛为家II

    1376

    主题

    7万

    回帖

    13万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥多彩人生海样胸怀春风拂面青草情怀心曲飞扬七彩绚丽活泼开朗男儿情怀鹰傲苍穹共看流星风雨同行我心永远天长地久幸福快乐春意盎然喜乐安康心想事成周年庆指尖上的流年舞会之星情人节花潮管理

    发表于 2023-12-31 10:06 | 显示全部楼层
    能加上开平方,三角函数吗。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2025-5-5 04:26
  • 签到天数: 597 天

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥飞龙在天王者至尊大将风范音画大师天籁妙音花潮贵宾

    发表于 2023-12-31 10:12 | 显示全部楼层

    好制作!

    评分后失效需刷新后恢复,或许是个例?
    我就来看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2023-12-31 10:28 | 显示全部楼层
    起个网名好难 发表于 2023-12-31 10:12
    好制作!

    评分后失效需刷新后恢复,或许是个例?

    不是。JS代码如果包裹在 (function() { ... })(); 可以处理这个问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2023-12-31 10:28 | 显示全部楼层
    樵歌 发表于 2023-12-31 10:06
    能加上开平方,三角函数吗。

    开方已经有了,其他三角函数运算是小问题
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2023-12-31 10:30 | 显示全部楼层
    樵歌 发表于 2023-12-31 10:04
    真好用,能下载到瘦机上吗?

    手机上的计算器功能要比这个好
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2025-5-5 04:26
  • 签到天数: 597 天

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥飞龙在天王者至尊大将风范音画大师天籁妙音花潮贵宾

    发表于 2023-12-31 10:55 | 显示全部楼层
    马黑黑 发表于 2023-12-31 10:28
    不是。JS代码如果包裹在 (function() { ... })(); 可以处理这个问题

    把let替换为var或许也能解决问题。
    我就来看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2023-12-31 13:12 | 显示全部楼层
    起个网名好难 发表于 2023-12-31 10:55
    把let替换为var或许也能解决问题。

    嗯,var有提升变量能力
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2023-12-31 13:50 | 显示全部楼层
    这个好,不但能加加减减,还有平方和立方以及开平方和百分比,还能回到上一步。
    功能还是很全面呢,用代码做出来的,太赞了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2023-12-31 13:51 | 显示全部楼层
    版面设计也漂亮,给黑黑点赞
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2025-5-5 04:26
  • 签到天数: 597 天

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥飞龙在天王者至尊大将风范音画大师天籁妙音花潮贵宾

    发表于 2023-12-31 15:40 | 显示全部楼层
    马黑黑 发表于 2023-12-31 13:12
    嗯,var有提升变量能力

    let 不可以重复申明,只是为什么评分会导致重复申明。
    我就来看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-1-2 08:31 | 显示全部楼层
    起个网名好难 发表于 2023-12-31 15:40
    let 不可以重复申明,只是为什么评分会导致重复申明。

    评分后页面的刷新机制是局部刷新,重新加载一部分内容,包括帖子的主帖内容。所以,相应代码如果用立即执行函数包裹,这个问题多数会得到解决。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2025-5-5 04:26
  • 签到天数: 597 天

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥飞龙在天王者至尊大将风范音画大师天籁妙音花潮贵宾

    发表于 2024-1-2 09:49 | 显示全部楼层
    本帖最后由 起个网名好难 于 2024-1-2 09:51 编辑
    马黑黑 发表于 2024-1-2 08:31
    评分后页面的刷新机制是局部刷新,重新加载一部分内容,包括帖子的主帖内容。所以,相应代码如果用立即执 ...

    ypPlayer 是不是与 js日历有冲突(见红影帖回家的路)事件处理都不响应了。
    我就来看看
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-1-2 11:49 | 显示全部楼层
    起个网名好难 发表于 2024-1-2 09:49
    ypPlayer 是不是与 js日历有冲突(见红影帖回家的路)事件处理都不响应了。

    这不是冲突问题,而是加载阻塞导致的 onclick 和 onchange 事件失效问题。一般可以考虑使用异步或延时来处理。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-17 03:03 , Processed in 0.075698 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表