热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

task0002(四)练习:数据处理、轮播及交互

转载自我的个人博客欢迎大家批评指正包括5部分:小练习1-处理用户输入小练习2-日期对象的使用小练习3:轮播图小练习4:输入提示框小练习5&

转载自我的个人博客

欢迎大家批评指正


包括5部分:

  • 小练习1-处理用户输入

  • 小练习2-日期对象的使用

  • 小练习3:轮播图

  • 小练习4:输入提示框

  • 小练习5:界面拖拽交互

源码地址
task0002 在线Demo

小练习1:处理用户输入

这里直接可以利用原来写过的util.js。所以应该不是特别难。主要考察对字符串的操作,以及正则表达式的使用

任务描述

task0002目录下创建一个task0002_1.html文件,以及一个js目录和css目录,在js目录中创建task0002_1.js,并将之前写的util.js也拷贝到js目录下。然后完成以下需求。

第一阶段

在页面中,有一个单行输入框,一个按钮,输入框中用来输入用户的兴趣爱好,允许用户用半角逗号来作为不同爱好的分隔。

当点击按钮时,把用户输入的兴趣爱好,按照上面所说的分隔符分开后保存到一个数组,过滤掉空的、重复的爱好,在按钮下方创建一个段落显示处理后的爱好。

实现

根据题目要求,这个地方比较简单,可以直接利用前面写过的一些函数,分成四步,进行。

  1. 使用正则表达式来对字符串进行分割操作。

  2. uniqArray函数进行去重操作。

  3. for循环,trim函数对数组项进行去除首尾空格,用来处理,该项为空的情况。

  4. innerHTML进行输出。

html:



    task0002_1.js中的js:

    //自执行的匿名函数
    (function handle_1() {//其实这里没必要使用id因为数据那么少$函数直接获取标签就行var inp = $("#user_input");var out = $("#user_output");$.click("#btn", function () {var value = inp.value.split(/\,|\,/); //1.根据半角逗号分割成数组。var unValue = uniqArray(value); //2.数组去重for (var i = 0, len = unValue.length; i " + trimValue + ""}}})
    })();

    第二阶段

    单行变成多行输入框,一个按钮,输入框中用来输入用户的兴趣爱好,允许用户用换行、空格(全角/半角)、逗号(全角/半角)、顿号、分号来作为不同爱好的分隔。

    当点击按钮时的行为同上

    实现

    看题目描述,主要是对于第一步进行修改,第一阶段只要求对半角逗号进行处理,但是在第二阶段中,需要对“换行、空格(全角/半角)、逗号(全角/半角)、顿号、分号”进行处理。
    主要是考察对于正则表达式的应用。

    只需要对var value = inp.value.split(/\,|\,/); 进行更改如下:

    var value = inp.value.split(/\n|\s+|\,|\,|\、|\;|\;/);
    需要注意的是:在正则表达式进行匹配这些符号时最好是前面加上转义字符。

    第三阶段

    用户输入的爱好数量不能超过10个,也不能什么都不输入。当发生异常时,在按钮上方显示一段红色的错误提示文字,并且不继续执行后面的行为;当输入正确时,提示文字消失。

    同时,当点击按钮时,不再是输出到一个段落,而是每一个爱好输出成为一个checkbox,爱好内容作为checkbox的label。

    实现

    • 嗯,其实这里按照题目要求应该要实时监听输入值变化,但是那样太麻烦了,,所以就直接在点击按钮的时候判断了。

    • 直接判断数组长度就行了。。输入为空时,判断字符串=“”。

    • 输出checkbox这里不过多的设置了,只是演示。

    最终完成

    html:





    输入的爱好数量不能超过10个,或什么都不输入


    js:

    (function handle_1() {var inp = $("#user_input");var out = $("#user_output");$.click("#btn", function () {var value = inp.value.split(/\n|\s+|\,|\,|\、|\;|\;/); //分割成数组。var unValue = uniqArray(value); //数组去重var i = 0;var len = unValue.length;if (len > 10 || unValue == "") {$("p").style.disautoPlay = "block";} else {$("p").style.disautoPlay = "none";for (; i " + "" + trimValue + ""}}}})
    })();

    在线演示:小练习1:处理兴趣列表

    小练习2:日期对象的使用

    任务描述

    在和上一任务同一目录下面创建一个task0002_2.html文件,在js目录中创建task0002_2.js,并在其中编码,实现一个倒计时功能。

    • 界面首先有一个文本输入框,允许按照特定的格式YYYY-MM-DD输入年月日;

    • 输入框旁有一个按钮,点击按钮后,计算当前距离输入的日期的00:00:00有多少时间差

    • 在页面中显示,距离YYYY年MM月DD日还有XX天XX小时XX分XX秒

    • 每一秒钟更新倒计时上显示的数

    • 如果时差为0,则倒计时停止

    实现思路

    了解日期对象

    这里主要是考察的对于日期对象的使用。

    new Date()。如果没有输入任何参数,则Date的构造器会依据系统设置的当前时间来创建一个Date对象。表示当前系统时间。

    //时间对象创建的几种方式。
    var today = new Date();
    var birthday = new Date("December 17, 1995 03:24:00");
    var birthday = new Date("1995-12-17T03:24:00");
    var birthday = new Date(1995,11,17);
    var birthday = new Date(1995,11,17,3,24,0);

    • Date对象中处理时间和日期的常用方法:详细内容在MDN上

    示例

    实现思路

    这里我并没有一开始就直接进行数据获取的部分,而是进行了任务分解,如下:

    第一阶段

    1. 先在使用写好的ul>li标签下,。添加3个事件mouseovermouseoutclick。实现点击li使其值变成输入框内的值。(直接使用事件代理)

    2. 对输入框添加键盘事件(对,你没看错,只有在聚焦在输入框时才触发)

      • 获取当前高亮的li。没有则设第一个为高亮active

      • 判断keyCode使用键盘下键,使用nextElementSibling方法获取下一个节点(向上同理),取消当前的active,设置下一个为active。(使用键盘上下选中的效果,处理完成)

      • 判断keyCode,获取当前状态为active的值,实现回车时,把其设为input的值。

    3. 需要注意的地方:

      • 在移除高亮状态时,最好是遍历一遍。因为键盘与鼠标划过有可能同时触发,导致有多个高亮。

      • 错误处理

    第二阶段

    1. 删除原来的ul>lihtml部分的li。添加对于输入框进行实时监听(这部分不在这里展开讲,如何实现大家去google吧,因为一展开就太多要说的了)。

    • 给个参考:实时监听输入框值变化

    1. 使用AJAX获取服务器上的数据,解析,遍历,并进行数据匹配。

    2. 匹配成功显示ul,否则设为none

    3. 使用正则表达式的match方法,来获取匹配成功的把部分,使用span进行高亮显示。并且插入ul

    4. 改造第一阶段的函数:

    • 因为是使用的事件代理,直接对ul添加事件,所以需要修改的部分不是很多。

    • clickenter部分获取的值,因为span标签的存在,需要使用正则进行处理,输出删除span后的值。

    在线演示:小练习4:输入框即时提示

    小练习5:界面拖拽交互

    • 实现一个可拖拽交互的界面

    • 如示例图,左右两侧各有一个容器,里面的选项可以通过拖拽来左右移动

    • 被选择拖拽的容器在拖拽过程后,在原容器中消失,跟随鼠标移动

    • 注意拖拽释放后,要添加到准确的位置

    • 拖拽到什么位置认为是可以添加到新容器的规则自己定

    • 注意交互中良好的用户体验和使用引导

    示例

    实现思路:

    第一步:封装拖拽函数

    开一个DEMO页面,实践如下:

    1. 了解应该用到的事件,onmousedownonmousemoveonmouseup

    2. 思考对谁添加事件?

      1. 在鼠标点击div时,对div添加onmousedown,表示鼠标按下。

      2. 在事件内给document添加onmousemove。(为啥给document加呢?因为给div加在移动过快时会跳出去)表示鼠标移动。

      3. 并且添加document添加onmouseup,表示鼠标已经抬起,清除移动事件,以及本身。

    3. 思考如何设置对象的位置?

      1. 直接获取鼠标的位置并设置给div行不行呢?试试吧!显然,会出现问题,点击鼠标就到div左上角去了。

      2. 那么怎么改变呢?获取鼠标在div中的位置?对。就这样,在鼠标按下时记录鼠标在div中的位置.

      3. 在鼠标移动时,用当前的位置,减去刚刚的位置,这就是应该的值!

    4. 别忘了鼠标抬起时,需要清除事件,不然鼠标就粘住了。

    这里用到了event,事件对象的相关概念,推荐观看慕课网的视频。DOM事件探秘

    1. 善用this。
      扩展

    /*** 鼠标拖拽函数。* @param {HTMLElement} element 需要拖拽的对象*/
    function setDrag(element) {addEvent(element, "mousedown", onmousedown);//鼠标按下function onmousedown(ev) {var oEvent = ev || event;var disX = oEvent.clientX - this.offsetLeft;var disY = oEvent.clientY - this.offsetTop;var that = this;addEvent(document, "mousemove", onmousemove);addEvent(document, "mouseup", onmouseup);/*** 鼠标移动*/function onmousemove(ev) {var oEvent = ev || event;that.style.left = oEvent.clientX - disX + "px";that.style.top = oEvent.clientY - disY + "px"}/*** 鼠标抬起删除事件*/function onmouseup() {removeEvent(document, "mousemove", onmousemove);removeEvent(document, "mouseup", onmouseup);}}
    }

    第二步:布局转换函数

    1. 两个参数,第一个参数,传入父级对象。第二个参数传入标签名,

    2. 循环,使用数组,对象,获取标签当前元素的位置left,top。(offsetLeft)。这里不能使用获取实际样式函数,因为本身就需要获取其相对父元素的位置。

    3. 第二个循环

      • 设置left,top值。

      • 设置绝对定位。

      • 取消原有的margin值。

    4. 调用函数,把对象从文档流布局,变成绝对定位布局。

    /*** 布局转换函数* @param {HTMLElment} element HTML对象* @param {string} childEle 其内需要转换的标签名*/
    function toPosition(element, childEle) {var eleArr = element.getElementsByTagName(childEle);var aPos = [];//for (var i = 0, len = eleArr.length; i }

    在线演示:小练习5:拖拽交互

    第三步:实现拖拽

    前面我们已经实现了setDrag(element)函数,常规方法就是直使用循环,然后传入element

    但是,为什么不用事件代理呢?

    特别简单,只需要对上面写的函数进行一些简单的改装。

    delegateEvent(parentElement, "li", "mousedown", function (ev) {
    //此处是原函数中的内容。
    }

    现在知道为什么上面的函数会用到this了吧?

    第四步:碰撞检测函数

    先来看张图:
    碰撞检测示意图

    是不是有瞬间豁然开朗的感觉呢?

    获取相关值,只需要考虑不碰不上的情况就行了!。如下:

    /*** 碰撞检测函数* @param {object} obj1 对象1* @param {object} obj2 对象2* @returns {boolean} 碰撞时返回true,否则反正false*/
    function hitDetection(obj1, obj2) {//对象1的相关值var l1 = obj1.offsetLeft;var r1 = obj1.offsetLeft + obj1.offsetWidth;var t1 = obj1.offsetTop;var b1 = obj1.offsetTop + obj1.offsetHeight;//对象2的相关值var l2 = obj2.offsetLeft;var r2 = obj2.offsetLeft + obj2.offsetWidth;var t2 = obj2.offsetTop;var b2 = obj2.offsetTop + obj2.offsetHeight;if (r1 r2 || b1 b2) {return false;//没碰上} else {return true;}
    }

    第五步:处理各种碰撞情况

    这里讲起来就太复杂了。源代码中注释还是比较详细的,有兴趣可以看下




    推荐阅读
    • 深度学习中的Vision Transformer (ViT)详解
      本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
    • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
    • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
    • 先看看ElementUI里关于el-table的template数据结构:<template><el-table:datatableData><e ... [详细]
    • MySQL多表数据库操作方法及子查询详解
      本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
    • HashMap的扩容知识详解
      本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
    • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
    • 引号快捷键_首选项和设置——自定义快捷键
      3.3自定义快捷键(CustomizingHotkeys)ChemDraw快捷键由一个XML文件定义,我们可以根据自己的需要, ... [详细]
    • 关于extjs开发实战pdf的信息
      本文目录一览:1、extjs实用开发指南2、本 ... [详细]
    • mapreduce源码分析总结
      这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
    • Thisissuewasoriginallyopenedbyashashicorp/terraform#5664.Itwasmigratedhe ... [详细]
    • Ihavethisfollowinginputfile:我有以下输入文件:test.csvdone_cfg,,,,port<0>,clk_in,subcktA,ins ... [详细]
    • 十六.增加一个项目协作留言板功能(二)----- 建立一个任务管理的列表页面
      我们设计一个页面来展示正在处理的任务,该表格可以参照之前基础信息的增删改查。用户通过这个页面对任务进行相应操作。1.在views. ... [详细]
    • 有几百条数据类似*Oct1809:46:09:%NFPP_IP_GUARD-4-DOS_DETECTED:Host<IP60.12.174.45,MACNA,portGi2 ... [详细]
    • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
    author-avatar
    当个谎言家很不错非
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有