2024年物联网嵌入式最全JS实现动态打字效果_js响应页面输入字符(2),2024年最新物联网嵌入式开发编程基础学习

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

结合上面的例子我再重复一遍流程:
1.获取要打印的内容(id为source的div中的内容)
这里写图片描述
这里既有文本节点有有dom节点,将文本节点转化为字符串数组,将dom节点保存为对象,最后合并为一个数组
这里写图片描述
然后依次打印数组中的字符,若遇见保存dom的对象,在先创建节点再打印节点内容(节点内容中可能还会有dom节点),就这样依次打印完毕了

因为是克隆的节点,所以节点的样式都会存在
这里写图片描述

源码
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8" />
</head>
<body>

<div id="source">
    打印带有标签的段落
    <p>我是段落</p>
    <ul>
        <li>列表1</li>
        <li>列表2</li>
        <li>列表3</li>
    </ul>
</div>
<div id="output">

</div>

<script type="text/javascript">
 class Typing {
 constructor(opts) {
 this.opts = opts || {};
 this.source = opts.source;
 this.output = opts.output;
 this.delay = opts.delay || 120;
 this.chain = {
 parent: null,
 dom: this.output,
 val: []
 };
 if (!(typeof this.opts.done === 'function')) this.opts.done = function () {
 };
 }

 init() {
 //初始化函数
 this.chain.val = this.convert(this.source, this.chain.val);
 }

 convert(dom, arr) {
 //将dom节点的子节点转换成数组,
 let children = Array.from(dom.childNodes)
 for (let i = 0; i < children.length; i++) {
 let node = children[i]
 if (node.nodeType === 3) {
 arr = arr.concat(node.nodeValue.split('')) //将字符串转换成字符串数组,后面打印时才会一个一个的打印
 } else if (node.nodeType === 1) {
 let val = []
 val = this.convert(node, val)
 arr.push({
 'dom': node,
 'val': val
 })
 }
 }
 return arr
 }

 print(dom, val, callback) {
 setTimeout(function () {
 dom.appendChild(document.createTextNode(val));
 callback();
 }, this.delay);
 }

 play(ele) {
 //当打印最后一个字符时,动画完毕,执行done
 if (!ele.val.length) {
 if (ele.parent) this.play(ele.parent);
 else this.opts.done();
 return;
 }
 let current = ele.val.shift() //获取第一个元素,同时删除数组中的第一个元素
 if (typeof current === 'string') {
 this.print(ele.dom, current, () => {
 this.play(ele); //继续打印下一个字符
 })
 } else {
 let dom = current.dom.cloneNode() //克隆节点,不克隆节点的子节点,所以不用加参数true
 ele.dom.appendChild(dom)
 this.play({
 parent: ele,
 dom,
 val: current.val
 })
 }
 }

 start() {
 this.init();
 this.play(this.chain);
 }
 }
</script>
<script type="text/javascript">
 let source = document.getElementById('source')
 let output = document.getElementById('output')
 let typing = new Typing({
 source,
 output
 })
 typing.start()
</script>
</body>
</html>

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

获取](https://bbs.csdn.net/topics/618679757)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值