JS实用案例之输入智能提示(打字机输出效果)

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

前言

本篇文章所有示例来自于牛客网题库/在线编程/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() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。
  • 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必须存在class “word”,并随机加上 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输入智能提示内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JS寄快递地址智能解析的实现代码

    去年做了些前端内容,最近在整理一些稍微有点用的内容,比如智能解析地址,用户只要输入:张三1351111111江苏省扬州市广陵区XX小区X楼xxx室,就能解析出姓名.电话.省市区.地址信息了.是不是很方便? 项目地址暂时没有放,大家可以关注我的个人码云地址https://gitee.com/w9 纯JavaScript,无需Jquery,轻量级的JS包.可参考以下代码: let defaultData = []; const mCity = {}; const mArea = {}; /** *

  • FastJSON字段智能匹配踩坑的解决

    背景 2021年第一天早上,客户突然投诉说系统的一个功能出了问题,紧急排查后发现后端系统确实出了bug,原因为前端传输的JSON报文,后端反序列化成JavaBean后部分字段的值丢失了. 查看git提交历史记录,前端和后端近期并未对该功能的接口字段做任何修改,联想到上个版本升级了后端的FastJSON的版本,怀疑是后端系统对FastJSON升级导致的问题. 复现 @Data static class Label { @JSONField(name = "label_id") priva

  • 使用ethers.js部署Solidity智能合约的方法

    如果你已经在以太坊上开发过DApp,那你在前端JavaScript中可能用过web3.js.Ethers.js则是一个轻量级的web3.js替代品. 与Web3.js相比,Ethers.js有很多优点,其中我最喜欢的一个特性是Ethers.js提供的状态和密钥管理.Web3的设计场景是DApp应该连接到一个本地节点,由这个节点负责保存密钥.签名交易并与以太坊区块链交互.现实并不是这样的,绝大多数用户不会在本地运行一个geth节点.Metamask在浏览器应用中有效地模拟了这种节点环境,因此绝大多

  • smartbanner.js实现可定制智能应用横幅使用示例

    目录 引言 基本用法 高级用法 如何根据系统语言动态修改横幅文案 如何自己处理点击按钮事件 如何在微信浏览器内不显示横幅 引言 smartbanner.js 适用于 iOS 和 Android 的可定制智能应用横幅(smart app banner).简单易用,不依赖任何框架,怎么使用官方文档也写的很清楚,我就不过多介绍. 传送门 基本用法 <!-- Start SmartBanner configuration --> <meta name="smartbanner:titl

  • 如何为你的JS项目添加智能提示与类型检查详解

    前言 最近在做项目代码重构,其中有一个要求是为代码添加智能提示和类型检查.智能提示,英文为 IntelliSense,能为开发者提供代码智能补全.悬浮提示.跳转定义等功能,帮助其正确并且快速完成编码.说起来,JavaScript 作为一门动态弱类型解释型语言,变量声明后可以更改类型,并且类型在运行时才能确定,由此容易产生大量代码运行中才能发现的错误,相比 Java 等静态类型语言,开发体验上确实差了一截.更烦躁的是,智能提示就是依赖于静态类型检查的,所以在以前,指望 JavaScript 的智能

  • JS实用案例之输入智能提示(打字机输出效果)

    目录 前言 1.输入智能提示 效果演示 案例需求 JavaScript实现 2.打字机输出 效果演示 案例需求 JavaScript实现 结语 前言 本篇文章所有示例来自于牛客网题库/在线编程/JS篇,这些都是前端开发中常用的功能,借此记录一下刷题过程,巩固基础! 1.输入智能提示 效果演示 有以下HTML和CSS: HTML结构 <div class="search"> <div> <!-- 调用suggest函数 --> <input ty

  • JS实现搜索关键词的智能提示功能

    最近在百度搜索的时候,当你输入一个字或者词的时候,他会给你们弹出一个下拉框出来,里面是和你相关的搜索提示 比如 我输入杨字,他会给我提示以下搜索提示 我尝试着用JavaScript做了一个类似的练习,以下是我用VS2013写的代码,有不对的地方,请不吝赐教. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Cont

  • ASP.NET MVC使用typeahead.js实现输入智能提示功能

    使用typeahead.js可以实现预先输入,即智能提示,本篇在ASP.NET MVC下实现.实现效果如下: 首先是有关城市的模型. public class City { public int Id { get; set; } public string Name { get; set; } public string PinYin { get; set; } } 在HomeController中响应前端请求返回有关City的json数据. public ActionResult GetCit

  • jQuery在vs2008及js文件中的无智能提示的解决方法

    jQuery在vs2008中的智能提示 1  安装VS2008SP1补丁 要确保您的vs2008已经打了sp1补丁,在vs2008的帮助里的关于,要是安装了sp1,会出现"版本 3.5 sp1",没安装当然就只有"版本 3.5". 如果没有安装可以在这下载sp1. 2  安装VS 2008 Patch KB958502以支持"-vsdoc.js"Intellisense文件.该补丁会导致Visual Studio在一个JavaScript库被引用

  • JS实现仿google、百度搜索框输入信息智能提示的实现方法

    本文实例讲述了JS实现仿google.百度搜索框输入信息智能提示的实现方法.分享给大家供大家参考.具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&qu

  • js文本框输入内容智能提示效果

    本文实例讲述了js文本框输入内容智能提示效果代码.分享给大家供大家参考.具体如下: 运行效果截图如下: 大体思路: 1.监听文本框事件.这里是用的keyup事件.大家可以尝试用onchange事件.不过感觉keyup事件的效果要好一点. 2.根据输入内容通过ajax异步的方式去访问后台数据. 3.遍历返回数据将数据添加到显示区域. 4.在添加数据的同时给每一条数据加上一些效果,点击其中一条将数据填到文本框,并且提示内容消失. 5.后台数据应该拼接成json格式. 具体代码如下: <!DOCTYP

  • 基于jquery实现智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入"李",系统自然会提示一些姓李的员工,这样方便用户使用.说白了,就是用户边输入,系统会提示相关的结果:或者,当用户点击搜索框时,就推荐一些内容,如360.百度都会提示今天的主要新闻或搜索量大的内容. jquery 已经有一个这样的插件了,叫 autocomplete, 但我觉得不好用.关于autocomplete的介绍也很多,有兴趣的朋友

  • 利用jsonp跨域调用百度js实现搜索框智能提示

    项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择. 使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js. ok,了解了jsonp的原理和应用后,我们看看百度的智能提示是如何做的 在chrome的调试窗口下看看百度搜索发出的请求.当输入关键字"a",请求如图: 用firebug看下请求的参数,如图: 请求方式:get请求 请求参数:wd明显是要搜索的关键字:cb是请求

  • 百度搜索框智能提示案例jsonp

    先给大家展示下效果图: 下面一段代码给大家分享了百度搜索框智能提示案例jsonp的知识,具体代码如下所示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>百度下拉_sug-jquery</title> <script src="jquery-1.11.3.js"><

  • 仿百度输入框智能提示的js代码

    最近客户需求老是变更,不过有些是因为客户催得急,我没有那么快能完成,所以先做了一个雏形给他们,后来再慢慢改.比如雏形那里我做了一个下拉列表给他们,事实上他们的数据有200多条,用个下拉列表的话很不现实,你能找那么多?而且那个下拉列表该有多长啊?所以很自然的,我想到了百度那个智能提示的功能. 参考了一下之前忘记是哪位大侠写的东西,他的是使用百度api的,为了简单起见,我把数据都定在了js那里,这样看官们容易理解一些. 还是整个代码考上来吧,代码不长.考了一下之前忘记是哪位大侠写的东西,他的是使用百

随机推荐