位置: IT常识 - 正文

【JavaScript】JS实用案例分享:选择器组件 | 简易计算器(javascript js)

编辑:rootadmin
【JavaScript】JS实用案例分享:选择器组件 | 简易计算器

推荐整理分享【JavaScript】JS实用案例分享:选择器组件 | 简易计算器(javascript js),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js实验,javascript+,js类的实现,,,js实验,javascript js,js实验,内容如对您有帮助,希望把文章链接给更多的朋友!

🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 👉 你的一键三连是我更新的最大动力❤️! 🏆分享博主自用牛客网🏆:一个非常全面的面试刷题求职网站,点击跳转🍬

文章目录前言1、选择器组件效果演示案例需求JavaScript实现2、简易计算器效果演示案例需求JavaScript实现结语前言

最近博主一直在牛客网刷题巩固基础知识,牛客网不仅具有公司真题、专项练习、面试题库、在线编程等功能,还具有非常强大的AI模拟面试功能,简直是求职者的福音!

牛客网里的题库非常全面的,无论你是前端还是后端,是想要备考还是准备面试又或者是想要提高自己,你都能在牛客网上找到适合自己的题,赶快点击链接去注册登录吧:点我进入牛客网

牛客网牛客网

本篇文章所有示例来自于牛客网题库/在线编程/JS篇,这些都是前端开发中常用的功能,借此记录一下刷题过程,巩固基础!

1、选择器组件效果演示

有以下HTML和CSS:

HTML结构

<div id="jsCheckGroup"> <div class="checkgroup radius"> <div data-val="a" class="item selected">选项a</div> <div data-val="b" class="item">选项b</div> <div data-val="c" class="item">选项c</div> <div data-val="d" class="item">选项d</div> </div></div>

CSS样式

.checkgroup .item{ height: 42px; line-height: 42px; padding: 0 10px; margin: 10px 0; border: 1px solid #c7c7c7; border-radius: 6px;}.checkgroup.radius .item{ border-radius: 21px;}.checkgroup .item.selected{ border: 1px solid #08b292; background: #08b292; color: #ffffff;}案例需求

CheckGroup是一个选择组件类,支持单选和多选选项参数格式、调用方式如下

选项参数格式:

var options = [{text: '选项a', value: 'a'}, {text: '选项b', value: 'b'}, {text: '选项c', value: 'c'}, {text: '选项d', value: 'd'}];

实例化单选组件:

var item = new CheckGroup(document.getElementById('jsCheckGroup'), options);item.val(['a']);【JavaScript】JS实用案例分享:选择器组件 | 简易计算器(javascript js)

实例化多选组件:

var item = new CheckGroup(document.getElementById('jsCheckGroup'), options, true);item.val(['a']);

具体功能和需求如下:

单选组件请在 div.checkgroup 元素加上class radius。选中时,请在对应选项dom元素加上class selected。点击单选选项,如果未选中当前选项则选中当前选项并取消其他选项,否则取消当前选项。点击多选选项,如果未选中当前选项则选中当前选项,否则取消当前选项。给定的options中, text和value属性的值均为非空字符串。val方法的参数和返回值均为数组(单选时数组长度不超过)。JavaScript实现// renderTo代表父容器,options为配置对象,isMultiple是否多选function CheckGroup(renderTo, options, isMultiple) { var that = this; that.renderTo = renderTo; that.options = options; that.isMultiple = !!isMultiple; // 初始化模板 that.initHtml(); // 初始化事件 that.initEvent();}// 挂载方法CheckGroup.prototype.initHtml = fInitHtml;CheckGroup.prototype.initEvent = fInitEvent;CheckGroup.prototype.toggleEl = fToggleEl;CheckGroup.prototype.isSelected = fIsSelected;CheckGroup.prototype.val = fVal;// 初始化模板function fInitHtml() { var that = this; // 请补全代码,拼接html字符串 var sHtml = ` <div class="checkgroup${!that.isMultiple ? ' radius' : ''}"> ${that.options.map(item => `<div data-val="${item.value}" class="item">${item.text}</div>`).join('')} </div> ` that.renderTo.innerHTML = sHtml; // 请补全代码,获取checkgroup的dom元素引用 that.el = document.getElementsByClassName('checkgroup')[0];}// 初始化事件function fInitEvent() { var that = this; // 添加点击事件 that.el && that.el.addEventListener('click', function (event) { var item = event.target; item.classList.contains('item') && that.toggleEl(item); });}// 点击事件处理函数function fToggleEl(item) { // 根据当前是单选还是多选,以及当前元素是否选中,高亮/取消���亮指定的选项dom元素 var that = this; if (that.isSelected(item)) { // 请补全代码 // 当前元素以及被选中,则取消选中 item.classList.remove('selected') } else if (that.isMultiple) { // 请补全代码 // 多选时直接添加selected item.classList.add('selected') } else { // 请补全代码 // 单选时先遍历取消所有的选中再选中当前元素 var sel = that.el.getElementsByClassName('selected')[0] sel && sel.classList.remove('selected') item.classList.add('selected') }}// 判断item是否选中function fIsSelected(item) { // 请补全代码,判断item是否选中 // Element.classList 是一个只读属性,返回一个元素 class 属性的动态 DOMTokenList 集合。 // DOMTokenList接口的 contains() 方法返回 Boolean (en-US) 类型。若传入的参数 token 包含在列表中时则返回true,否则返回 false。 return item.classList.contains('selected');}// 设置/返回选中元素function fVal(values) { var that = this; // 没有接受参数时该函数的作用是返回选中的数组 if (arguments.length === 0) { // 请补全代码,获取高亮的选项元素 var items = that.el.getElementsByClassName('selected'); // 请补全代码,获取高亮的选项元素的data-val return [].map.call(items, item => item.getAttribute('data-val')) } // 接收参数时,该函数表示设置选中 !that.isMultiple && values.length > 1 && (values.length = 1); // 请补全代码,获取所有的选项元素 var its = that.el; // 请补全代码,在指定元素上加上高亮的class values.forEach(val => { let el = its.querySelector(`.item[data-val="${val}"]`); // 交给点击事件处理函数 that.toggleEl(el); });}// 测试var options = [{ text: '选项a', value: 'a' }, { text: '选项b', value: 'b' }, { text: '选项c', value: 'c' }, { text: '选项d', value: 'd' }];// var item = new CheckGroup(document.getElementById('jsCheckGroup'), options);// 多选var item = new CheckGroup(document.getElementById('jsCheckGroup'), options, true);item.val(['a', 'c']);console.log(item.val());

这个案例中多次用到call来改变方法的this指向,因为获取的DOM集合是一种伪数组并不是真正的数组,不具有数组的方法,所以我们想要在它上面使用数组的方法时就需要先在一个确定的数组上调用方法再通过call将方法的this指向到它。

知识点:

修改this指向,call,bind,apply方法的使用,在前几期JS题解中我们对其讲解过,具体可见:https://ailjx.blog.csdn.net/article/details/126730075Element.classList 是一个只读属性,返回一个元素 class 属性的动态 DOMTokenList 集合。DOMTokenList.contains() 方法返回 Boolean 类型。若传入的参数包含在列表中时则返回true,否则返回 false。2、简易计算器效果演示

有以下HTML和CSS:

HTML结构

<div class="calculator"> <header class="cal-header">简易计算器</header> <main class="cal-main"> <div class="origin-value">0</div> <div class="cal-keyboard"> <ul class="cal-items"> <li data-action="num">7</li> <li data-action="num">8</li> <li data-action="num">9</li> <li data-action="operator">÷</li> <li data-action="num">4</li> <li data-action="num">5</li> <li data-action="num">6</li> <li data-action="operator">x</li> <li data-action="num">1</li> <li data-action="num">2</li> <li data-action="num">3</li> <li data-action="operator">-</li> <li data-action="num">0</li> <li data-action="operator">清空</li> <li data-action="operator">=</li> <li data-action="operator">+</li> </ul> </div> </main></div>

CSS样式

body, ul, li,select { margin: 0; padding: 0; box-sizing: border-box;}ul,li {list-style: none;}.calculator { max-width: 300px; margin: 20px auto; border: 1px solid #eee; border-radius: 3px;}.cal-header { font-size: 16px; color: #333; font-weight: bold; height: 48px; line-height: 48px; border-bottom: 1px solid #eee; text-align: center;}.cal-main { font-size: 14px;}.cal-main .origin-value { padding: 15px; height: 40px; line-height: 40px; font-size: 20px; text-align: right; overflow: hidden; text-overflow:ellipsis; white-space: nowrap;}.cal-main .origin-type,.cal-main .target-type { padding-left: 5px; width: 70px; font-size: 14px; height: 30px; border: 1px solid #eee; background-color: #fff; vertical-align: middle; margin-right: 10px; border-radius: 3px;}.cal-keyboard { overflow: hidden;}.cal-items { overflow: hidden;}.cal-items li { user-select: none; float: left; display: inline-block; width: 75px; height: 75px; text-align: center; line-height: 75px; border-top: 1px solid #eee; border-left: 1px solid #eee; box-sizing: border-box;}li:nth-of-type(4n+1) { border-left: none;}li[data-action=operator] { background: #f5923e; color: #fff;}.buttons { float: left; width: 75px;}.buttons .btn { width: 75px; background-color: #fff; border-top: 1px solid #eee; border-left: 1px solid #eee; height: 150px; line-height: 150px; text-align: center;}.btn-esc { color: #ff5a34;}.btn-backspace { position: relative;}案例需求

本题展示了一个简化版的计算器,需求如下:

除法操作时,如果被除数为0,则结果为0。结果如果为小数,最多保留小数点后两位,如 2 / 3 = 0.67(显示0.67), 1 / 2 = 0.5(显示0.5)。阅读并根据提示补充完成函数initEvent、result和calculate。JavaScript实现var Calculator = { init: function () { var that = this; if (!that.isInited) { that.isInited = true; // 保存操作信息 // total: Number, 总的结果 // next: String, 下一个和 total 进行运算的数据 // action: String, 操作符号 that.data = { total: 0, next: '', action: '' }; that.bindEvent(); } }, bindEvent: function () { var that = this; // 请补充代码:获取 .cal-keyboard 元素 var keyboardEl = document.getElementsByClassName('cal-keyboard')[0]; keyboardEl && keyboardEl.addEventListener('click', function (event) { // 请补充代码:获取当前点击的dom元素 var target = event.target; // 请补充代码:获取target的 data-action 值 var action = target.getAttribute('data-action'); // 请补充代码:获取target的内容 var value = target.innerText; if (action === 'num' || action === 'operator') { that.result(value, action === 'num'); } }); }, result: function (action, isNum) { var that = this; var data = that.data; if (isNum) { data.next = data.next === '0' ? action : (data.next + action); !data.action && (data.total = 0); } else if (action === '清空') { // 请补充代码:设置清空时的对应状态 data.total = 0; data.next = ''; data.action = ''; } else if (action === '=') { if (data.next || data.action) { data.total = that.calculate(data.total, data.next, data.action); data.next = ''; data.action = ''; } } else if (!data.next) { data.action = action; } else if (data.action) { data.total = that.calculate(data.total, data.next, data.action); data.next = ''; data.action = action; } else { data.total = +data.next || 0; data.next = ''; data.action = action; } // ���补充代码:获取 .origin-value 元素 var valEl = document.getElementsByClassName('origin-value')[0]; valEl && (valEl.innerHTML = data.next || data.total || '0'); }, calculate: function (n1, n2, operator) { n1 = +n1 || 0; n2 = +n2 || 0; if (operator === '÷') { // 请补充代码:获取除法的结果 if (n2 === 0) { return 0 } let tol = n1 / n2 // Number.isInteger() 方法用来判断给定的参数是否为整数。 // Math.round() 函数返回一个数字四舍五入后最接近的整数。 return Number.isInteger(tol) ? tol : Math.round(tol * 100) / 100; } else if (operator === 'x') { // 请补充代码:获取乘法的结果 let tol = n1 * n2 return Number.isInteger(tol) ? tol : Math.round(tol * 100) / 100; } else if (operator === '+') { // 请补充代码:获取加法的结果 let tol = n1 + n2 return Number.isInteger(tol) ? tol : Math.round(tol * 100) / 100; } else if (operator === '-') { // 请补充代码:获取减法的结果 let tol = n1 - n2 return Number.isInteger(tol) ? tol : Math.round(tol * 100) / 100; return 0; } }};Calculator.init();

这个案例的实现并不难,牛客上面已经把大致的骨架写好了,我们只需按照要求在需要补充的地方进行补充就行,这就使难度大大降低了,我们需要做的不只是补充代码,还要去学习这个案例实现的思想,逻辑以及代码结构,个人认为牛客给出的这个解法的代码结构还是比较好的,具有学习意义,我们不能盲目的去写代码,要学会去提高自己的思维。

知识点:

Number.isInteger() 方法用来判断给定的参数是否为整数。Math.round() 函数返回一个数字四舍五入后最接近的整数。结语

这篇文章的所有内容都出自于牛客网的JS篇题库:

牛客网的JS题库非常贴合实际的,在写的过程中自己查漏补缺,收获了很多,强烈将牛客网推荐给大家!

如果本篇文章对你有所帮助,还请客官一件四连!❤️

基础不牢,地动山摇! 快来和博主一起来牛客网刷题巩固基础知识吧!

本文链接地址:https://www.jiuchutong.com/zhishi/298748.html 转载请保留说明!

上一篇:模式识别与图像处理课程实验一:图像处理实验(颜色算子实验、Susan、Harris角点检测实验、 sobel边缘算子检测实验)(模式识别与图像处理能做什么)

下一篇:Node.js安装与配置(详细步骤)(node.js的安装步骤)

  • 抖音怎么收集发财中国年(怎么在抖音发收藏视频)

    抖音怎么收集发财中国年(怎么在抖音发收藏视频)

  • 光猫断电会不会影响pon口(光猫断电后需要重新设置吗)

    光猫断电会不会影响pon口(光猫断电后需要重新设置吗)

  • 华为nova7视频通话美颜怎么打开

    华为nova7视频通话美颜怎么打开

  • 正在转接是什么意思(电话打过去正在转接)

    正在转接是什么意思(电话打过去正在转接)

  • 戴森v11absolute和fluffy的区别(戴森v11 absolute和complete选哪个)

    戴森v11absolute和fluffy的区别(戴森v11 absolute和complete选哪个)

  • 电话是空号是不是已经注销了(电话是空号是不是不用缴费了)

    电话是空号是不是已经注销了(电话是空号是不是不用缴费了)

  • 转到设置以激活windows是什么意思(提示激活windows转到设置以激活)

    转到设置以激活windows是什么意思(提示激活windows转到设置以激活)

  • 华为手机换小米手机数据怎么导入(华为手机换小米手机微信数据怎么导入)

    华为手机换小米手机数据怎么导入(华为手机换小米手机微信数据怎么导入)

  • 拼多多7天无理由退货规则(拼多多7天无理由退货包运费吗)

    拼多多7天无理由退货规则(拼多多7天无理由退货包运费吗)

  • 华为手环只能用华为手机吗(华为手环只能用充电)

    华为手环只能用华为手机吗(华为手环只能用充电)

  • 华为手环4和4p区别(华为手环4区别)

    华为手环4和4p区别(华为手环4区别)

  • 网线超5类和6类区别(网线超5类和6类价格相差多少钱)

    网线超5类和6类区别(网线超5类和6类价格相差多少钱)

  • 小米怎么升级开发版(小米怎么升级开机)

    小米怎么升级开发版(小米怎么升级开机)

  • vivo音乐怎么收藏歌曲(vivo音乐怎么收费多少一个月)

    vivo音乐怎么收藏歌曲(vivo音乐怎么收费多少一个月)

  • 抖音男女对唱怎么拍(抖音里男女对唱)

    抖音男女对唱怎么拍(抖音里男女对唱)

  • xs支持反向无线充电吗(iphonex有没有反向无线充电)

    xs支持反向无线充电吗(iphonex有没有反向无线充电)

  • oppo强制恢复出厂设置(oppo强制恢复出厂coloros)

    oppo强制恢复出厂设置(oppo强制恢复出厂coloros)

  • 商品属性怎么填(抖音小店商品属性怎么填)

    商品属性怎么填(抖音小店商品属性怎么填)

  • 怪兽充电宝哪里可以还(怪兽充电宝多少钱一小时)

    怪兽充电宝哪里可以还(怪兽充电宝多少钱一小时)

  • oppo新出的reno为什么有两个(oppo reno好久出来的)

    oppo新出的reno为什么有两个(oppo reno好久出来的)

  • vivo接电话声音小怎么办(vivo接电话声音大,旁边人的都听见)

    vivo接电话声音小怎么办(vivo接电话声音大,旁边人的都听见)

  • 移动怎么解除亲情号(移动怎么解除亲情号短信)

    移动怎么解除亲情号(移动怎么解除亲情号短信)

  • iphone共享wifi给ipad(iphone共享wifi给mac)

    iphone共享wifi给ipad(iphone共享wifi给mac)

  • 抖音怎样隐藏我的喜欢(抖音怎样隐藏我的汽水)

    抖音怎样隐藏我的喜欢(抖音怎样隐藏我的汽水)

  • dmremote.exe进程安全吗 dmremote是什么进程(dcom进程)

    dmremote.exe进程安全吗 dmremote是什么进程(dcom进程)

  • 【uniapp】上拉触底加载更多的两种方式,组件里面和页面里面 scroll-view组件和onReachBottom触底方法,以及部分安卓机型scroll-view很难触发问题,且可以固定表头(uniapp scroll-view 上下滑动)

    【uniapp】上拉触底加载更多的两种方式,组件里面和页面里面 scroll-view组件和onReachBottom触底方法,以及部分安卓机型scroll-view很难触发问题,且可以固定表头(uniapp scroll-view 上下滑动)

  • DedeCMS V5.7 SP2前台文件上传漏洞

    DedeCMS V5.7 SP2前台文件上传漏洞

  • 普票和增值税发票的区别
  • 废品销售是否缴纳增值税
  • 高速公路通行费发票怎么开
  • 未出资到位的股东
  • 实收资本认缴怎么缴纳印花税
  • 合伙开有限公司注销流程
  • 国家对工资发放的规定
  • 公司注销公告怎么发布
  • 单位发生的业务怎么做账
  • 劳务公司注销了,未出的款怎么走账
  • 小规模应税行为扣除额计算
  • 退税上传,申报文件上传失败
  • 金税三期能查几年前的发票
  • 滞纳金是否有上限
  • 汇算清缴需要调增的费用
  • 暂估入库的货物销售了当月多交增值税了
  • 年底有留抵税额需要结转吗
  • 捐赠所得税视同销售怎么处理
  • 个税系统添加单位企业信息不存在
  • 资本公积的借方和贷方各表示什么
  • 其他应付款包括应付职工薪酬吗
  • 积分兑换现金的平台
  • 怎么清除更新记录
  • 进口缴纳的关税通过什么核算
  • 销售出库未开票怎么入账
  • 住房公积金如何使用
  • 期末留抵税额的减值
  • PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
  • wordpress 设置
  • win10提示病毒
  • php
  • 一台电脑两个显示器显示不一样的内容
  • php imagestring
  • cuda运行环境
  • 公司当月申报的是下个月社保么
  • yii框架教程
  • 购买支票费用计入
  • 捐赠所得属于什么会计科目
  • 推荐 4个有趣实践作业
  • 人工智能导论论文2000字
  • 3d人体骨骼模型软件
  • php的运算符主要包括哪些?
  • 实缴的钱注销后可以拿回来吗
  • vue+elementui
  • 会计核算中并不是所有的总分类帐户都需要开设明细账户
  • 发票金额跟实际转账金额不一样该怎么办
  • 员工公交费补贴怎么入账
  • 工商年报纳税总额包括个人所得税吗
  • 委外研发费用如何入账
  • 自产产品用于捐赠是否要确认收入
  • 低值易耗品属于资产类账户吗
  • 安置房买卖过户流程
  • 根据出库商品的编码
  • 分支机构可不可以不建账合并到总机构?
  • 备用金发工资到底可不可以?
  • 税局代开的法律顾问费能否抵扣?
  • 事业单位之间
  • 购买增值税发票系统金税盘如何入账?
  • 一般纳税人抵扣进项税有时间要求吗
  • centos6.2安装
  • mysqld占用cpu高
  • win8.1升级win10系统
  • windows10内置应用是哪些
  • 列举linux常用的版本
  • xp系统如何禁止开机启动软件
  • Mac显示桌面快捷键
  • win7 ie
  • nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
  • 命令行输入以下哪个命令可以画出样条曲线
  • 为什么使用json传输数据
  • easyui messager alert 三秒后自动关闭提示的实例
  • javascript entries
  • PYTHON内置函数,标准库,三方库的区别
  • jquery网页
  • js控制浏览器返回按钮
  • jquery动态改变样式
  • 求资金占用利息的公式
  • ca证书免费申请
  • 主要领导负责人
  • 冯炜教授现况如何
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设