【JavaScript】JS实用案例分享:输入智能提示 打字机输出效果_js输入框旁边提示信息

.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是()[].+/?*这类的特殊字符,则在它前面加上转义字符:
// 为什么是\KaTeX parse error: Undefined control sequence: \? at position 9: {val},两个\̲?̲因为在模板字符串``中\也需要…{‘()[].+/?*’.indexOf(val) === -1 ? val : \\${val}}.*?`
}


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


**知识点:**


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


## 2、打字机输出


### 效果演示


![在这里插入图片描述](https://img-blog.csdnimg.cn/34a3feebe7764203b3b9a1f6d5cb154a.gif#pic_center)  
 有以下`HTML`和`CSS`:


HTML结构



h e l l o   w o r l d
|

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;
}

}


### 案例需求


页面上存在`id`为`jsBlink`的下划线闪动节点,请按照如下需求实现 `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'

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

23384928)]
[外链图片转存中…(img-GWqlnaKZ-1714723384929)]
[外链图片转存中…(img-yxbXL3uT-1714723384929)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值