【JavaScript】JS实用案例分享:输入智能提示 | 打字机输出效果

news2025/2/27 3:58:48

CSDN话题挑战赛第2期
参赛话题:学习笔记

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


文章目录

  • 前言
  • 1、输入智能提示
    • 效果演示
    • 案例需求
    • JavaScript实现
  • 2、打字机输出
    • 效果演示
    • 案例需求
    • JavaScript实现
  • 结语

前言

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

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

牛客网牛客网
在这里插入图片描述在这里插入图片描述

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

1、输入智能提示

效果演示

在这里插入图片描述
有以下HTMLCSS

HTML结构

<div class="search">
    <div>
        <!-- 调用suggest函数 -->
    	<input type="text" class="js-input"
            oninput="suggest(['河南加入下雪群聊','河南疫情','河南大学','河南疫情最新消息','河南地图','河南卫视重阳奇妙游2022节目单','河南天气预报','河南省高校学生资助在线'])">
    </div>
    <div class="js-suggest">
        <ul></ul>
    </div>
</div>

CSS样式

.search {
   position: relative;
}

.js-input {
   width: 450px;
   height: 22px;
   line-height: 22px;
   font-size: 16px;
   padding: 8px;
   border: 1px solid #cccccc;
   outline: none;
}

.js-suggest {
   width: 466px;
   font-size: 14px;
   border: 1px solid #cccccc;
   background: #ffffff;
   position: absolute;
   left: 0;
   top: 39px;
}

.js-suggest.hide {
   display: none;
}

.js-suggest ul {
   display: block;
   list-style: none;
   padding: 0;
   margin: 0;
}

.js-suggest ul li {
   color: #000;
   font: 14px arial;
   line-height: 25px;
   padding: 0 8px;
   position: relative;
   cursor: default;
}

.js-suggest ul li:hover {
   background: #f0f0f0;
}

案例需求

  1. 当输入框的值发生变化时,调用suggest函数,用于显示/隐藏智能提示数据,参数items为一个字符串数组。
  2. items中的字符串和输入框的值匹配时,将匹配的数据依次渲染在ul下的li节点中,并显示.js-suggest节点,否则移除ul下的所有li节点,并隐藏.js-suggest节点
  3. 输入框的值需要移除两侧空白再进行匹配
  4. 输入框的值为空时,按照全部不匹配处理
  5. 字符串使用模糊匹配,比如"北大"能匹配"北大"和"北京大学",但不能匹配"大北京",即按照 /北.*?大.*?/ 这个正则进行匹配
  6. 通过在.js-suggest节点上添加/移除 hide 这个class来控制该节点的隐藏/显示

JavaScript实现

function suggest(items) {
    const val = document.getElementsByClassName('js-input')[0].value.trim()
    const suggest = document.getElementsByClassName('js-suggest')[0]

    // 创建输入内容的正表达式:使用split将字符串转换成数组 -> 使用map映射生成新数组 -> 使用join将数组连接成字符串
    const valReg = new RegExp(val.split('').map(v => special(v)).join(''))

    // 通过filter方法过滤出items中符合的项:符合的条件是用户输入内容不为空(val != '')并且与用户输入的内容匹配
    const item = items.filter(i => val != '' && valReg.test(i))

    // 如果item.length不为0,代表有匹配的数据,则执行:
    // suggest.classList['remove']('hide')相当于suggest.classList.remove('hide') 效果是删除hide这个class
    suggest.classList[item.length ? 'remove' : 'add']('hide')

    // 渲染列表
    suggest.children[0].innerHTML = item.map(i => `<li>${i}</li>`).join('')
}

// 对特殊字符的处理
function special(val) {
    // 如果val是()[].+/?*这类的特殊字符,则在它前面加上转义字符:\
    // 为什么是\\${val},两个\?因为在模板字符串``中\也需要使用\转义
    return `${'()[].+/?*'.indexOf(val) === -1 ? val : `\\${val}`}.*?`
}

这个案例中需要注意的地方就是不要忘记对特殊字符的转义(实现special函数)。

知识点:

  • RegExp(正则表达式)
  • split() 方法使用指定的分隔符字符串将一个String对象分割成子字符串数组,以一个指定的分割字串来决定每个拆分的位置。
  • map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。
  • join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。
  • filter() 方法创建给定数组一部分的浅拷贝,其包含通过所提供函数实现的测试的所有元素。
  • test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 truefalse
  • Element.classList 是一个只读属性,返回一个元素 class 属性的动态 DOMTokenList集合。这可以用于操作 class 集合。
  • indexOf() 方法返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回 -1。

2、打字机输出

效果演示

在这里插入图片描述
有以下HTMLCSS

HTML结构

<div class="content">
    <span class="word color23">h</span>
    <span class="word color22">e</span>
    <span class="word color4">l</span>
    <span class="word color24">l</span>
    <span class="word color17">o</span>
    <span class="word color2">&nbsp;</span>
    <span class="word color9">w</span>
    <span class="word color3">o</span>
    <span class="word color1">r</span>
    <span class="word color23">l</span>
    <span class="word color15">d</span>
    <br>
    <span class="word color15"></span>
    <span class="word color13"></span>
    <span class="word color16"></span>
    <span class="word color19"></span>
    <span class="blink" id="jsBlink">|</span>
</div>

CSS样式

html,
body {
    margin: 0;
}

.color1 {
    color: #E60012;
}

.color2 {
    color: #EB6100;
}

.color3 {
    color: #F39800;
}

.color4 {
    color: #FCC800;
}

.color5 {
    color: #FFF100;
}

.color6 {
    color: #CFDB00;
}

.color7 {
    color: #8FC31F;
}

.color8 {
    color: #22AC38;
}

.color9 {
    color: #009944;
}

.color10 {
    color: #009B6B;
}

.color11 {
    color: #009E96;
}

.color12 {
    color: #00A0C1;
}

.color13 {
    color: #00A0E9;
}

.color14 {
    color: #0086D1;
}

.color15 {
    color: #0068B7;
}

.color16 {
    color: #00479D;
}

.color17 {
    color: #1D2088;
}

.color18 {
    color: #601986;
}

.color19 {
    color: #920783;
}

.color20 {
    color: #BE0081;
}

.color21 {
    color: #E4007F;
}

.color22 {
    color: #E5006A;
}

.color23 {
    color: #E5004F;
}

.color24 {
    color: #E60033;
}

.word {
    font-size: 20px;
}

.content {
    text-align: center;
    font-size: 0;
}

.blink {
    font-size: 20px;
    animation: fade 500ms infinite;
    -webkit-animation: fade 500ms infinite;
}

@keyframes fade {
    from {
        opacity: 1.0;
    }

    50% {
        opacity: 0;
    }

    to {
        opacity: 1.0;
    }
}

案例需求

页面上存在idjsBlink的下划线闪动节点,请按照如下需求实现 output 函数

  1. 函数 output 接收一个字符串参数,每隔200毫秒在闪动节点之前逐个显示字符
  2. 请新建span节点放置每个字符,其中span必须存在classword”,并随机加上 color1 ~ color24 中的任一个class(请使用系统随机函数)
  3. 每次输出指定字符串前,请将闪动节点之前的所有其他节点移除
  4. 不要销毁或者重新创建闪动节点
  5. 如果输出字符为空格<>,请分别对其进行HTML转义,如果是\n请直接输出<br />,其他字符不需要做处理
  6. 上面展示的效果为 output('hello world\n你好世界') 之后的界面

JavaScript实现

function output(str) {
    const content = document.getElementsByClassName('content')[0]
    const jsBlink = document.getElementById('jsBlink')
    
    // 将闪动节点之前的所有其他节点移除
    while (content.children.length > 0) {
        if (content.children[0] == jsBlink) {
            // 如果content第1个孩子是jsBlink,说明闪动节点之前的所有其他节点移除完毕,则跳出循环
            break;
        }
        // 删除content中的指定节点
        content.removeChild(content.children[0]);

    }
    
    let i = 0;
    
    const stl = setInterval(() => {
        if (str[i] == '\n') {
            const br = document.createElement('br')
            // 在content中的jsBlink之前插入节点br
            content.insertBefore(br, jsBlink)
        } else {
            const span = document.createElement('span')
            span.classList.add('word')
            span.classList.add(`color${Math.floor(Math.random() * 24 + 1)}`)
            switch (str[i]) {
                case ' ':
                    span.innerHTML = '&nbsp'
                    break;
                case '<':
                    span.innerHTML = '&lt'
                    break;
                case '>':
                    span.innerHTML = '&gt'
                    break;
                default:
                    span.innerHTML = str[i]
                    break;
            }

            content.insertBefore(span, jsBlink)
        }

        i++;
        if (i >= str.length) {
        	// 清除定时器
            clearInterval(stl)
        }
    }, 200)

}

// 调用测试
output('hello world\n你好世界')

知识点:

  • Node.insertBefore() 方法在参考节点之前插入一个拥有指定父节点的子节点。

结语

这篇文章的所有内容都出自于牛客网的JS篇题库:
在这里插入图片描述

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/407870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端Vue之发布订阅模式

目录 1.什么是发布订阅模式 2.实现简单的发布订阅 3.收集更新函数 4.触发更新函数 5.总结 一个响应式数据可能会有多个视图部分都需要依赖&#xff0c;也就是响应式数据变化之后&#xff0c;需要执行的更新函数可能不止一个&#xff0c;对于这种情况&#xff0c;有必要学习…

node使用管理神器NVM安装配置超详细步骤(window10)

使用NVM对node进行版本管理前言一、什么是nvm&#xff1f;二、nvm下载安装配置1.下载2.nvm解压安装3.检查环境变量4.确认安装成功5.设置和安装node5.1 设置淘宝镜像5.2 安装node指定版本并使用5.2.1 执行以下命令自动安装指定版本的node和npm&#xff1a;5.2.2 查看已经安装的n…

Vue3.0项目——打造企业级音乐App(一)Tab栏、轮播图、歌单列表、滚动组件

系列文章目录 内容参考链接Vue3.0 项目启动Vue3.0 项目启动&#xff08;打造企业级音乐App&#xff09;Vue3.0项目——打造企业级音乐App&#xff08;一&#xff09;Tab栏、轮播图、歌单列表、滚动组件Vue3.0项目——打造企业级音乐App&#xff08;二&#xff09;图片懒加载、…

路由守卫的详解

路由守卫总共有7个 全局路由守卫: beforeEach 前置守卫 affterEach 后置守卫 beforeResolve 解析守卫 路由的守卫 beforeRouterEnter 进入组件之前触发,在Created前面 beforeRouterUpdated 路由更新但是内容不会改变 beforeRouterLeave 离开之前触发,在beforeDestory之前…

vue3 - ref和reactive的区别

文章搬运自wx60d4764eb475e 的vue3中ref和reactive的区别&#xff08;系列六&#xff09; 1. ref和reactive区别: 如果在template里使用的是ref类型的数据, 那么Vue会自动帮我们添加.value 如果在template里使用的是reactive类型的数据, 那么Vue不会自动帮我们添加.val…

ErrorCaptureStackTrace(err); Error [ERR_MODULE_NOT_FOUND]: Cannot find module

目录结构 main.js import { Name, say, Person } from ./testconsole.log(Name)test.js const Name life function say() {console.log(Mine) } let Person { name: good }export { Name, say, Person }问题分析 步骤有点啰嗦&#xff0c;犯错的原因其实就很简单&#xff…

Vue自定义指令原来这么简单

本篇学习目标 能够了解组件进阶知识能够掌握自定义指令创建和使用能够完成tabbar案例的开发 1. 组件进阶 1.0 组件进阶 - 动态组件 目标: 多个组件使用同一个挂载点&#xff0c;并动态切换&#xff0c;这就是动态组件 需求: 完成一个注册功能页面, 2个按钮切换, 一个填写注册…

微信小程序(四)--- 自定义组件详解(properties,数据监听器,纯数据字段,插槽,父子间通信,behaviors)

目录 一、创建组件 二、引用组件 1、局部引用 2、全局引用 三、组件和页面的区别 四、组件样式隔离 1、注意点 2、修改组件的样式隔离选项 五、数据、方法、属性 1、data数据 2、methods方法 3、properties属性 4、data和properties的区别 5、使用setData修改proper…

AndroidStudio网格布局(制作计算机界面)

目录 网格布局特点&#xff08;类似于表格&#xff09; 常用属性&#xff1a; 针对布局的属性 针对子控件的属性 实例演示 创建一个安卓应用插入一张背景图片&#xff08;可以不加&#xff09; 打开字符串资源文件 strings.xml改应用标题名字&#xff08;可不改&#xf…

uniapp微信公众号h5微信授权登录

前言 在微信客户端中访问第三方网页&#xff0c;公众号可通过微信网页授权机制&#xff0c;来获取用户基本信息&#xff0c;进而实现业务逻辑。 关于公众号网页授权前期准备&#xff1a; 1.微信公众号开发&#xff0c;首先要搞一个公众号&#xff0c;开发阶段可以申请一个公众…

element ui+vue实现导航栏菜单以及页面跳转

关于博主&#xff1a; 不知道算不算的上入门&#xff0c;就是刚刚学习vue框架&#xff0c;断断续续的学习&#xff0c;所以有些地方讲的不正确也欢迎大家批评斧正&#xff0c;希望与大家共同进步 问题描述 对于初学前端的我们来说搭建一个路由导航界面还是比较困难的&#xf…

Web基础知识

1&#xff0c;Web基本概念和常识 ①web应用&#xff1a;网站&#xff08;广义上的PC&#xff0c;手机app&#xff09; ②浏览器&#xff08;Browser&#xff09;&#xff1a;也称用户代理&#xff0c;web客户端&#xff0c;主要有IE、Edge、Chrome、Firefox、腾讯浏览器&#x…

nvm 安装使用及配置淘宝下载镜像

NVM介绍 NVM全称node.js version management &#xff0c;专门针对node版本进行管理的工具&#xff0c;通过它可以安装和切换不同版本的node.js。 MVM下载 githhub下载地址&#xff0c;选择nvm-setup.zip&#xff1a;安装版&#xff0c;推荐使用 https://github.com/coreyb…

Antv X6 动态连线

这是我实际开发项目中&#xff0c;利用 X6 开发的一个关系图。具备连线功能。这里我尽可能全的记录整个开发思路和部分编码&#xff0c;如果你也用了 X6 希望对你有帮助。 创建画布 代码有删减&#xff0c;以下展示的代码全都有删减 index.vue <template><div id&q…

React组件化的额外知识补充

文章目录React的额外补充Portals的使用Fragment的使用严格模式StrictModeReact的额外补充 Portals的使用 某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中(默认都是挂载到id为root的DOM 元素上的)。 Portal 提供了一种…

【vue】 vue-router安装和配置方法

vue-router 是 vue.js 官方的路由插件&#xff0c;里面组件和 URL 的映射关系由 vue-route 帮我们管理。 在 vue-router 的单页面应用中&#xff0c;页面的路径的改变就是组件的切换。 第一步&#xff1a; 1.正常初始化项目的时候&#xff0c;会有个 vue-router 供我们选择。…

在VSCode中配置代码自动 eslint 格式化(修改eslint规则、eslint忽略文件)

一、Eslint Eslint 是用来检测和规范代码格式的工具&#xff0c;应用在工程化项目中&#xff0c;可以保证项目代码格式的一致性和规范性&#xff0c;大大提升了代码的可读性。 二、配置过程 本博客是讲述对一个已经引用 eslint 依赖Nuxt项目&#xff08;vue项目应该相同&…

vue-cli脚手架的下载安装(靠谱)

找了半天才找到一个靠谱的安装教程&#xff0c;分享给你们。 1. 先下载node.js&#xff0c;下载地址&#xff1a;Download | Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en/download/直接进入下载电脑对应的版本&…

vue-cli创建vue项目详细步骤

一、安装node环境&#xff08;建议使用LTS&#xff09; Download | Node.js 二、下载vue和vue-cli脚手架 命令&#xff1a;npm i -g vue ; npm i -g vue/cli 三、在想要创建的位置路径下打开cmd&#xff08;直接点击路径输入cmd即可打开当前位置的终端&#xff09; 四、创建v…

Vue使用Element-UI的table组件和后端接口进行数据交互(包含前后端代码)

前言 本次用element-ui的table组件&#xff0c;简单案例演示下前后端数据交互。 前提声明&#xff1a;如果不知道如何在vue中引入element-ui&#xff0c;可以先看下这篇文章:Vue引入并使用Element-UI组件库的两种方式 静态页面 首先先写一个静态页面吧&#xff0c;数据都是…