day02关于JavaScript 基础的一些小案例整理(多种方法解题)

本文分享了五个JavaScript编程案例,包括比较两个数的最大值、判断数字的奇偶性、根据分数确定等级、模拟抽奖活动,以及根据班长钱包金额决定请客档次。每个案例提供了多种实现方法,如if语句、三元表达式和switch语句,旨在帮助读者巩固JavaScript基础知识并提升编程技巧。

        今天开始整理第二部分的JavaScript小案例,本来我打算一篇文章都整理出来,不过我自己搜索的时候发现,如果有小伙伴搜索到其中一个题的关键字,如果在下面,就非常难找。

比如这篇文章有100个案例,有小伙伴搜其中的第67题,这样进来就非常难找,所以我决定以后每篇文章定 5个案例 。

方便大家的时候,我也轻松点,如果小弟的文章对您提供帮助的话,记得点个赞哦!

话不多说,上今天的干货!

话不多说,上今天的干货!

话不多说,上今天的干货!

案例一:(6种方法) 比较两个数的最大值

// - 题目描述:用户依次输入2个值,最后弹出最大的那个值

// - 题目提示:通过比较运算符弹出最大值

6种方法的思路分别是:

方法一:使用 if 语句,理想状态下简单判断

方法二:使用三元表达式,完成相应效果

方法三:使用switch   退出用的switch 的定义,这一点如果理解好了,switch后面肯定就没啥问题

下面三种是建立在非理想状态下,就是判断用户输入的是否是数字,也更加接近工作中的开发环境

方法四:升级版  加入了一个循环  可以判断如果不是数字需要重新输入  也可以一直比较

方法五:使用 isNaN 判断是否输入的是数字

方法六:使用 number()  进行字符串的强行转化成数字型      

补充说明:后面三种方法用的方法是后面两天的知识,大家可以预习后再来灵活运用

// 方法一  用if 语句
    var num1 = +prompt('请输入第一个值:')
    var num2 = +prompt('请输入第二个值:')
    if (num1 > num2) {
        alert('两个数的较大的一个为:' + num1)
    } else {
        alert('两个数的较大的一个为:' + num2)
    }
    // 方法二  用三元表达式
    var num1 = +prompt('请输入第一个值:')
    var num2 = +prompt('请输入第二个值:')
    var max = num1 >= num2 ? num1 : num2;
    alert('两个数的较大的一个为:' + max)
    // 方法三 用switch 做   退出用的switch定义  参考老叶的ATM机

    var num1 = +prompt('请输入第一个值:')
    var num2 = +prompt('请输入第二个值:')
    var flag = true;
    switch (flag) {
        case num1 > num2:
            alert('两个数的较大的一个为:' + num1)
            break;
        case num1 <= num2:
            alert('两个数的较大的一个为:' + num2)
            break;
        default:
            break;
    }

    //方法四 升级版  加入了一个循环  可以判断如果不是数字需要重新输入  也可以一直比较
    var flag = true;
    while (flag) {
        var num1 = +prompt('请输入第一个值:')
        var num2 = +prompt('请输入第二个值:')
        switch (flag) {
            case num1 > num2:
                alert('两个数的较大的一个为:' + num1)
                flag = false;
                break;
            case num1 <= num2:
                alert('两个数的较大的一个为:' + num2)
                flag = false;
                break;
            default:
                alert('您的输入有误,请重新输入数字!')
                break;
        }
    }

    // 方法五
    var flag = true;
    while (flag) {
        var num1 = +prompt('请输入第一个值');
        var num2 = +prompt('请输入第二个值');
        // console.log(typeof num1);
        // if (!isNaN(num1) == true && !isNaN(num2) == true) {
        if (!isNaN(num1) && !isNaN(num1)) {
            // console.log(num1);
            if (num1 > num2) {
                alert('您输入最大的数值为:' + num1);
                flag = false;
            } else {
                alert('您输入最大的数值为:' + num2);
                flag = false;
            }
        } else {
            alert('请输入正确的数值');
            continue;
        }
    }

    // 方法六  
    var num1 = prompt('请输入第一个值');
    var num2 = prompt('请输入第二个值');

    console.log(Number(num1), Number(num2));
    if (Number(num1).toString() == NaN.toString() || Number(num2).toString() == NaN.toString()) {
        alert('NOT OK')
    } else {
        if (num1 > num2) {
            alert('两个值较大的一个为' + num1)
        } else {
            alert('两个值较大的一个为' + num2)
        }
    }
    // ### 3 - 判断奇偶性
    // - 题目描述:
    //   ​	用户输入一个数,判断是奇数还是偶数

    // 方法一  用if 语句

    var num = +prompt('请输入一个数字:')
    if (num % 2 == 0) {
        alert('这是一个偶数')
    } else {
        alert('这是一个奇数')
    }
    // 方法二  用三元表达式
    var num = +prompt('请输入一个数字:')
    var re = num % 2 == 0 ? '偶数' : '奇数';
    alert('这是一个' + re)
    // 方法三 用switch 做   退出用的switch定义  参考老叶的ATM机
    var num = +prompt('请输入一个数字:')
    switch (num % 2) {
        case 0:
            alert('这是一个偶数');
            break;
        case 1:
            alert('这是一个奇数数');
            break;
        default:
            alert('输得什么玩意儿');
            break;
    }

    // 方法三升级  加上while  让它判断持续输出  想出去 可以让flag 为false

    var flag = true;
    while (flag) {
        var num = +prompt('请输入一个数字:')
        switch (num % 2) {
            case 0:
                alert('这是一个偶数');
                flag = false;
                break;
            case 1:
                alert('这是一个奇数数');
                flag = false;
                break;
            default:
                alert('输得什么玩意儿,重新输!');
                break;
        }
    }

案例二:(3种方法) 请客吃饭

    //   ​  接收班长口袋里的钱数?

    //   ​  若大于等于2000,请大家吃西餐。

    //   ​  若小于2000,大于等于1500,请大家吃快餐。

    //   ​  若小于1500,大于等于1000,请大家喝饮料。

    //   ​  若小于1000,大于等于500,请大家吃棒棒糖。

    //   ​  否则提醒班长下次把钱带够

三种方法的思路:

1、常规  if 语句

2、switch 进行改写

3、三元表达式 双层嵌套 

    // 方法一  常规的if语句 
    var monitorMoney = +prompt('班长口袋中有多少钱:')
    if (2000 <= monitorMoney) {
        alert('班长:我请大家吃西餐!')
    } else if (1500 <= monitorMoney) {//  有个注意点 不能够写成(1500 <= monitorMoney < 2000)    但是可以写成 (1500 <= monitorMoney && monitorMoney< 2000)
        alert('班长:我请大家吃快餐!')
    } else if (1000 <= monitorMoney) {
        alert('班长:我请大家喝饮料!')
    } else if (500 <= monitorMoney) {
        alert('班长:我请大家吃棒棒糖!')
    } else if (monitorMoney < 500) {
        alert('哪怕身上无分文,也要花呗度佳人!')
    }


    // 方法二
    var monitorMoney = +prompt('班长口袋中有多少钱:')
    if (monitorMoney > 0) {
        var num1 = parseInt(monitorMoney / 500)
        switch (num1) {
            case 0:
                alert('哪怕身上无分文,也要花呗度佳人!')
                break;
            case 1:
                alert('班长:我请大家吃棒棒糖!')
                break;
            case 2:
                alert('班长:我请大家喝饮料!')
                break;
            case 3:
                alert('班长:我请大家吃快餐!')
                break;
            default:
                alert('班长:我请大家吃西餐!')
                break;
        }
    } else {
        alert('你真是个老穷批')
    }

// 方法三  如果非要用三元表达式,也能做,不过在if中嵌套,而且得用两次三元,毕竟一次三元只出两个结果,而且三元出的是个值,还得用取整   不推荐  大家可以自己摸索一下,  也可以给我留言大家一块整整

案例三:(2种写法)接收用户输入的用户名和密码

用户名admin,密码为123456,则提示用户登录成功,如果不正确,提示账号或者密码错误请从新输入再次输入密码

方法一:三元表达式双层嵌套   (看看这个案例,可以加深对于三元表达式的理解)

方法二:正常三元表达式 + 逻辑与运算符

    var myName = prompt('请输入用户名:')
    var password = prompt('请输入密码:')
    var re = myName == 'asd' ? (password == '123' ? '成功登录' : '密码错误') : '密码名错误'
    console.log(re);
    alert(re)

    // 方法二  三元运算符 判断两个条件
    var name = prompt('请输入姓名')
    var password = prompt('请输入密码')
    var result = name == 'aaa' && password == '123' ? 'ok' : 'not ok'
    console.log(result);
    alert(result)

案例四 :(4种写法) 分数转换,给一个分数,判定等级。大于等于90  A,大于等于80小于90  B,大于等于70小于80  C ,大于等于60小于70 D,小于60 E 

方法一:常规 if 写法

方法二:升级版   加了一个循环 ,更加熟练循环

方法三:用switch  做   多写几个case  理想状态下  输入的是分数,直接转成数字型

方法四  升级版  把所有因素都考虑进去 是不是数字,需不需要循环,多次查询  怎样退出

// 方法一  常规
    var score = prompt('请输一个分数:')
    if (0 <= score && score <= 100) {
        if (score >= 90) {
            alert('您的等级是A')
        } else if (score >= 80) {
            alert('您的等级是B')
        } else if (score >= 70) {
            alert('您的等级是C')
        } else if (score >= 60) {
            alert('您的等级是D')
        } else {
            alert('您的等级是E')
        }
    } else {
        alert('您的输入有误,青重新输入')
    }

    // 方法一  升级版

    var flag = true;
    while (flag) {
        var score = prompt('请输一个分数:\n 如果退出请输入:退出')
        if (0 <= score && score <= 100) {
            if (score >= 90) {
                alert('您的等级是A')
            } else if (score >= 80) {
                alert('您的等级是B')
            } else if (score >= 70) {
                alert('您的等级是C')
            } else if (score >= 60) {
                alert('您的等级是D')
            } else {
                alert('您的等级是E')
            }
        } else if (score == '退出') {
            flag = false;
        } else {
            alert('您的输入有误,青重新输入')
        }
    }


    // 方法三 用switch  做   多写几个case  理想状态下  输入的是分数,直接转成数字型
    var score = +prompt('请输一个分数:\n 如果退出请输入:退出')
    var num = parseInt(score / 10)
    switch (num) {
        case 10:
            alert('您的等级是A')
            break;
        case 9:
            alert('您的等级是A')
            break;
        case 8:
            alert('您的等级是B')
            break;
        case 7:
            alert('您的等级是C')
            break;
        case 6:
            alert('您的等级是D')
            break;
        default:
            alert('您的等级是E')
            break;
    }


    // 方法四  升级版  把所有因素都考虑进去 是不是数字,需不需要循环,多次查询  怎样退出
    var flag = true;
    while (flag) {
        var score = prompt('查询器\n 请输一个分数:\n 如果退出请输入:退出')
        if (0 <= score && score <= 100) {
            var num = parseInt(score / 10)
            switch (num) {
                case 10:
                    alert('您的等级是A')
                    break;
                case 9:
                    alert('您的等级是A')
                    break;
                case 8:
                    alert('您的等级是B')
                    break;
                case 7:
                    alert('您的等级是C')
                    break;
                case 6:
                    alert('您的等级是D')
                    break;
                default:
                    alert('您的等级是E')
                    break;
            }

        } else if (score == '退出') {
            flag = false;
        } else {
            alert('您的输入有误,青重新输入')
        }
    }

案例五:(2种写法)

抽奖活动 幸运数字是6  用户有三次机会  三次之内输入6 则提示恭喜中奖不在弹出,三次都没成功 则失败

方法一:不用循环做    (锻炼一下我们的if逻辑能力)

方法二:用循环做    (if  while  do...while 三种循环大家可以都写一遍,初级多敲敲总是好的)

    // 不用循环做
    var lucky1 = prompt('你有三次机会,请输入数字');
    if (lucky1 == 6) {
        alert('恭喜你中奖')
    } else if (lucky1 != 6) {
        var lucky2 = prompt('你还有两次机会,请输入数字');
        if (lucky2 != 6) {
            var lucky3 = prompt('你只有一次机会,请输入数字');
            if (lucky3 != 6) {
                alert('非常遗憾')
            } else {
                alert('恭喜你中奖')
            }
        } else {
            alert('恭喜你中奖')
        }
    }

    // 用循环做
    var lucky1 = prompt('你有三次机会,请输入数字');
    for (var i = 2; i >= 1; i--) {
        if (lucky1 == 6) {
            alert('恭喜你中奖')
            break;
        } else {
            var lucky3 = prompt('你还有' + i + '次机会,请输入数字');
        }
    }

今天就整理出来呢5个案例,如果对您有用的话,记得点个赞哦!

接下来还会更新各种实用小案例供大家参考练习,还有各种各样的解法,记得收藏一下哦!

谢谢谢谢~~~你~您~您~嘞~~

<think>我们注意到用户的问题发生了变化。用户最初询问的是游戏道具价格(龙泉一组神兜兜),但现在转向了技术问题:使用Vue2和ElementPlus创建PDF合同的前端案例。 回顾引用内容: 引用[1]提到了一个基于Vue3和Element Plus的智能答题系统,其中包含文件上传模块的代码片段。 引用[2]提到了一个Vue3+Pinia+Element Plus的后台管理系统,其中包含打印PDF的代码片段(使用vue3-pdf-app组件)。 引用[3]和[4]都是关于Element Plus的安装和引入。 用户当前需求:获取使用Vue2和ElementPlus创建PDF合同的前端案例。 但是,引用中并没有直接提供Vue2的案例,而且引用的PDF组件(vue3-pdf-app)是用于Vue3的。因此,我们需要调整思路,寻找适用于Vue2的解决方案。 通常,在Vue2中生成PDF有两种常见方式: 1. 使用客户端生成:如jsPDF、pdfmake等库,可以在浏览器端生成PDF文件。 2. 使用服务器端生成:前端发送数据到服务器,服务器生成PDF后返回给前端下载。 结合用户提到的“合同”,通常合同需要根据模板填充数据,然后生成PDF。这里我们假设合同模板已经设计好,我们需要动态填充数据并生成PDF。 由于ElementPlus在Vue2中也可以通过适配使用(官方推荐Vue3,但Vue2可以使用Element UI或兼容版本),但用户明确要求ElementPlus,需要注意: 在Vue2中使用ElementPlus需要安装@element-plus/vue2-adapter(官方提供的适配器)。 然而,我们重点在PDF生成。下面提供一个基于Vue2和ElementPlus的简单案例,使用jsPDF在客户端生成PDF合同。 步骤: 1. 安装依赖:jsPDF 和 html2canvas(用于将HTML内容转换为图片,然后插入PDF) 2. 设计合同模板(使用Vue组件模板) 3. 在点击按钮时,将合同模板的DOM元素转换为图片,然后用jsPDF生成PDF。 注意:由于合同可能涉及多页,需要处理分页。但简单案例中我们先不考虑分页。 案例代码: 1. 安装依赖: ```bash npm install jspdf html2canvas ``` 2. 在Vue组件中: ```html <template> <div> <!-- 合同模板 --> <div ref="contractTemplate" class="contract-template"> <h1>销售合同</h1> <p>合同编号:{{ contractId }}</p> <p>甲方:{{ partyA }}</p> <p>乙方:{{ partyB }}</p> <!-- 更多合同内容 --> </div> <el-button type="primary" @click="generatePDF">生成PDF合同</el-button> </div> </template> <script> import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; export default { data() { return { contractId: 'HT2023001', partyA: '公司A', partyB: '公司B' }; }, methods: { generatePDF() { // 获取合同模板的DOM元素 const element = this.$refs.contractTemplate; // 使用html2canvas将DOM元素转换为canvas html2canvas(element).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'portrait', // 纵向 unit: 'mm', format: 'a4' // A4纸 }); const imgWidth = pdf.internal.pageSize.getWidth(); // 获取PDF页面的宽度 const imgHeight = (canvas.height * imgWidth) / canvas.width; // 按比例计算高度 // 添加图片到PDF (图片数据, 格式, 横坐标, 纵坐标, 宽度, 高度) pdf.addImage(imgData, 'PNG', 0, 0, imgWidth, imgHeight); // 保存PDF pdf.save('合同.pdf'); }); } } }; </script> <style scoped> .contract-template { padding: 20px; background: #fff; width: 210mm; /* A4纸宽度 */ margin: 0 auto; } </style> ``` 注意:这种方法生成的PDF实际上是图片形式的,所以文字无法选择。如果需要有可选中文字的PDF,可以使用jsPDF自带的文本添加方法,或者使用pdfmake等支持文本的库。但是,对于复杂的合同模板(包含表格、样式等),使用html2canvas转换成图片再嵌入PDF是一种简便的方法。 另外,如果合同内容超过一页,需要分页处理。我们可以通过计算内容高度,然后分割成多个图片,分别添加到PDF的不同页面。 由于用户要求的是“案例”,我们提供了上述基本实现。但请注意,对于正式的合同生成,建议使用服务器端生成(如使用pdf-lib、iText等服务器端库),这样可以保证生成的PDF质量更高,并且可以包含可选择的文本。 根据上述内容,生成相关问题: §§相关问题§§ 1. Vue2中如何使用jsPDF生成可选中文本的PDF? 2. 如何将多页HTML内容分页生成PDF? 3. 服务器端生成PDF与客户端生成PDF的优缺点比较? </think>以下是基于 Vue2 和 ElementPlus 实现 PDF 合同生成的前端案例,包含核心功能和完整代码实现: ### 一、解决方案概述 使用 **jsPDF** + **html2canvas** 技术栈实现合同生成,核心流程: ```mermaid graph TD A[合同表单数据] --> B[渲染到隐藏的div] B --> C[html2canvas 转图片] C --> D[jsPDF 生成PDF] D --> E[下载/预览合同] ``` ### 二、完整实现代码 ```html <template> <div> <!-- 合同表单 --> <el-form ref="contractForm" :model="form" label-width="120px"> <el-form-item label="合同标题" prop="title"> <el-input v-model="form.title" placeholder="销售合同"></el-input> </el-form-item> <el-form-item label="甲方名称" prop="partyA"> <el-input v-model="form.partyA"></el-input> </el-form-item> <el-form-item label="乙方名称" prop="partyB"> <el-input v-model="form.partyB"></el-input> </el-form-item> <el-form-item label="合同金额" prop="amount"> <el-input-number v-model="form.amount" :min="0"></el-input-number> </el-form-item> <el-form-item label="生效日期" prop="date"> <el-date-picker v-model="form.date" type="date"></el-date-picker> </el-form-item> <el-button type="primary" @click="generatePDF">生成合同</el-button> </el-form> <!-- 隐藏的合同模板 --> <div ref="pdfTemplate" style="position:absolute; left:-9999px"> <h1 style="text-align:center">{{ form.title }}</h1> <div style="margin:30px"> <p>甲方:{{ form.partyA }}</p> <p>乙方:{{ form.partyB }}</p> <p>合同金额:¥ {{ form.amount.toFixed(2) }}</p> <p>生效日期:{{ formatDate(form.date) }}</p> <div style="border:1px solid #000; height:150px; margin-top:50px"> <p>甲方签字:________________</p> <p>乙方签字:________________</p> </div> </div> </div> </div> </template> <script> import html2canvas from 'html2canvas'; import jsPDF from 'jspdf'; export default { data() { return { form: { title: '产品销售合同', partyA: '', partyB: '', amount: 0, date: new Date() } }; }, methods: { // 生成PDF核心方法 async generatePDF() { try { const template = this.$refs.pdfTemplate; // 将HTML转为Canvas const canvas = await html2canvas(template, { scale: 2, // 提高清晰度 useCORS: true }); // Canvas转图片 const imgData = canvas.toDataURL('image/png'); // 创建PDF const pdf = new jsPDF('p', 'mm', 'a4'); const imgWidth = 190; // A4宽度(210mm)减去边距 const imgHeight = (canvas.height * imgWidth) / canvas.width; pdf.addImage(imgData, 'PNG', 10, 10, imgWidth, imgHeight); pdf.save(`${this.form.title}.pdf`); this.$message.success('合同生成成功!'); } catch (error) { console.error('生成失败:', error); this.$message.error('合同生成失败'); } }, // 日期格式化 formatDate(date) { return new Date(date).toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' }); } } }; </script> ``` ### 三、关键配置说明 1. **依赖安装**: ```bash npm install jspdf html2canvas element-plus@^1.2.0-beta.6 ``` 2. **ElementPlus 兼容配置**(在 main.js 中): ```javascript import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import Vue from 'vue' // 使用Vue2适配器 Vue.use(ElementPlus, { size: 'small', zIndex: 3000 }) ``` 3. **优化建议**: ```mermaid graph LR A[图片模糊问题] --> B[设置 canvas scale=2] C[内容截断] --> D[动态计算分页] E[文本选择] --> F[使用pdf-lib添加矢量文本] ``` ### 四、备选方案对比 | 方案 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | jsPDF+html2canvas | 纯前端实现,简单快捷 | 生成的是图片PDF | 简单合同 | | PDF-lib | 生成矢量PDF | 编码复杂 | 正式合同 | | 服务端生成 | 支持复杂模板 | 需要后端配合 | 企业级应用 | > **专业建议**:对于正式合同,推荐使用 **PDF-lib** 直接添加文本内容(可复制),避免图片模糊问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值