位置: IT常识 - 正文

【JavaScript】JS实用案例分享:DOM节点转JSON数据 | 标签输入框(js javascript)

编辑:rootadmin
【JavaScript】JS实用案例分享:DOM节点转JSON数据 | 标签输入框

推荐整理分享【JavaScript】JS实用案例分享:DOM节点转JSON数据 | 标签输入框(js javascript),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,,:javascript,javascript js,js实验,js类的实现,javascript js,js实验,内容如对您有帮助,希望把文章链接给更多的朋友!

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

文章目录前言1、DOM节点转JSON数据效果演示案例需求JavaScript实现2、标签输入框效果演示案例需求JavaScript实现结语前言

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

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

牛客网牛客网

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

1、DOM节点转JSON数据效果演示

有以下HTML和CSS:

HTML结构

<div id="jsContainer"> <ul class="js-test" id="jsParent"> <li data-index="0">1</li> <li data-index="1">2</li> </ul> <span style="font-weight: bold;">3</span> 4</div>案例需求

页面上存在id=jsContainer的节点A,按照如下需求实现 dom2json 函数

dom2json需要分析整个节点A的dom结构,并将其结构转换为对应的json对象。需要获取dom结构的标签名称(tag),所有属性(attributes),子节点(children)。文档片段中的属性形式均为 name="value",解析之后的格式为{name: value}, 属性值为String类型,不需要做解析。随机生成的文档片段中,只包含 nodeType 为1(element)和3(text)的节点,不需要考虑其他节点类型。纯文本也视为一个节点, json格式为 {tag: 'text', content: '文本内容'},content为文本内容执行trim后的结果,如果该结果为空,则忽略当前节点。返回结果中的标签名称不区分大小写。如果节点不包含属性值或者子节点,其对应的结果中需要保留attributes以及children字段,例如 {tag: 'div', attributes: {}, children: []}。上面的HTML结构执行dom2json之后的结果如上面的效果演示。JavaScript实现function dom2json() { const root = document.getElementById('jsContainer') return JSON.stringify(getDomJson(root))}function getDomJson(dom) { let domObj; if (dom.nodeType === 1) { // 如果是element节点 domObj = { tag: dom.localName, attributes: {}, children: [] } // 属性列表 let attlist = dom.attributes; for (let i = 0, l = attlist.length; i < l; i++) { // .name获取属性名,.value获取属性值 domObj.attributes[attlist[i].name] = attlist[i].value } // 子元素列表 let childList = dom.childNodes for (let i = 0, l = childList.length; i < l; i++) { // 递归 const childJson = getDomJson(childList[i]) if (childJson) { domObj.children.push(childJson) } } } else if (dom.nodeType === 3) { // 如果是text节点 const ctn = dom.textContent.trim() if (ctn) { domObj = { tag: 'text', content: ctn } } } return domObj}console.log('测试', dom2json());

这个案例中主要就是对DOM操作以及递归算法的应用。

知识点:

Node.nodeType 表示的是该节点的类型。

【JavaScript】JS实用案例分享:DOM节点转JSON数据 | 标签输入框(js javascript)

Element.localName、Node.nodeName、Element.tagName都能获取节点的标签名。

元素节点有tagName 、nodeName 、localName属性;其中tagName 、nodeName相同,都是大写,localName是小写。其他节点只有nodeName 、localName属性,无tagName属性,其中:

属性节点localName和nodeName相同。文本节点localName为null,nodeName为#text(带有#)。

从DOM层次来看,nodeName是node接口上的property,而tagName是element接口上的property,所有的节点(元素节点,属性节点,文本节点等12种)都继承了node接口,而只有元素节点才继承了element节点,因此nodeName比tagName具有更大的使用范围。

Element.attributes 属性返回该元素所有属性节点的一个实时集合。

Node.childNodes 返回包含指定节点的子节点的集合,该集合为即时更新的集合。

Node.textContent 属性表示一个节点及其后代的文本内容。

trim() 方法会从一个字符串的两端删除空白字符。

2、标签输入框效果演示

有以下HTML和CSS:

HTML结构

<div class="tag-input"> <span class="tag">前端</span> <span class="tag">编程题</span> <span class="tag">示例</span> <span class="tag">标签</span> <input type="text" class="js-input" maxlength="6" placeholder="请输入标签"></div>

CSS样式

.tag-input{ position: relative; border: 1px solid #cccccc; padding: 0 5px; display: flex; flex-flow: row wrap;}.js-input{ width: 450px; height: 22px; line-height: 22px; font-size: 16px; padding: 0; margin: 5px 0; outline: none; border: none; width: 6.5em; height: 24px; line-height: 24px;}.tag{ padding: 0 10px; margin: 5px 5px 5px 0; background: #25bb9b; color: #ffffff; height: 24px; line-height: 24px; border-radius: 12px; font-size: 13px;}案例需求

上面展示了一个简化版的标签输入框,功能如下:

当用户输入内容并敲回车键时,将输入框的内容在输入框前显示成标签,并清空输入框内容。当用户敲删除键时,如果输入框当前没有内容,则删除前一个标签。标签需要去掉字符串两端的多余的空格。标签不能为空字符串。标签不能重复,如果输入已存在的内容相同的标签,则不添加,并清空输入框。相关键码值,回车键=13,删除键=8。JavaScript实现var tagInput = {// isInited表示是否已初始化 isInited: false, // 初始化方法 init: init, // 绑定事件处理函数的方法 bindEvent: bindEvent, // 添加标签的方法 addTag: addTag, // 移除标签的方法 removeTag: removeTag};// 初始化tagInput.init();// 初始化函数function init() { var that = this; if (that.isInited) return; that.isInited = true; // 保存class为js-input的输入框的dom元素引用 that.input = document.getElementsByClassName("js-input")[0]; that.bindEvent();}// 注册事件function bindEvent() { var that = this; var input = that.input; if (!input) return; // 给input绑定按键按下事件 input.addEventListener('keydown', function (event) { // 判断用户是否按了回车键 var isEnter = (event.keyCode === 13); // 判断用户是否按了删除键 var isDelete = (event.keyCode === 8); // 阻止默认行为 (isEnter || isDelete) && event.preventDefault(); isEnter && that.addTag(); isDelete && that.removeTag(); }); // 给input的父元素绑定点击事件 input.parentNode.addEventListener('click', function () { // 使用input获得焦点 input.focus(); });}// 添加标签的函数function addTag() { var that = this, input = that.input, val = input.value.trim(), tagList = document.getElementsByClassName('tag'), isAdd = true; // 遍历存在的tag,输入的内容在tag中已经存在时不进行添加span元素操作(isAdd=false) for (var i = 0, l = tagList.length; i < l; i++) { if (tagList[i].innerHTML === val) { isAdd = false break } } // 如果val不为空,isAdd为true则添加新的span元素 if (isAdd && val) { var newSpan = document.createElement('span') newSpan.className = 'tag' newSpan.innerHTML = val // 在input的父节点中的input节点之前插入newSpan节点 input.parentNode.insertBefore(newSpan, input) } input.value = ''}// 删除标签的函数function removeTag() { var that = this, input = that.input, val = input.value, tagList = document.getElementsByClassName('tag'); if (val) { // 如果val不为空时,应该删除值的最后一位 input.value = val.slice(0, -1) } else if (tagList.length > 0) { // 如果val为空时,tagList中存在span标签,则删除最后一个标签 tagList[tagList.length - 1].remove() }}

这个案例的实现并不难,主要就是在于它的逻辑思想,只要动脑去想,动手去写,一般都能实现它。

知识点:

Node.insertBefore() 方法在参考节点之前插入一个拥有指定父节点的子节点。slice(begin, end) 提取某个字符串的一部分,并返回一个新的字符串,且不会改动原字符串。从下标begin提取到end(包含begin,不包含end),如果end<0,表示从末尾开始算,例如end是 -3,则end相当于是strLength - 3(strLength 表示字符串长度)结语

这篇文章的所有内容都出自于牛客网的JS篇题库:

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

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

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

本文链接地址:https://www.jiuchutong.com/zhishi/298933.html 转载请保留说明!

上一篇:Vue项目实战——【基于 Vue3.x + Vant UI】实现一个多功能记账本(搭建开发环境)(vue做项目的流程)

下一篇:A Loepa oberthuri moth (© Robert Thompson/Minden Pictures)

  • b站可以分屏吗(b站可以分屏吗平板)

    b站可以分屏吗(b站可以分屏吗平板)

  • 苹果如何拦截推销电话(苹果如何拦截推送信息)

    苹果如何拦截推销电话(苹果如何拦截推送信息)

  • 苹果全面屏怎么截屏(苹果全面屏怎么打开控制中心)

    苹果全面屏怎么截屏(苹果全面屏怎么打开控制中心)

  • 苹果11省电模式怎么关闭(苹果11省电模式和正常模式有什么区别)

    苹果11省电模式怎么关闭(苹果11省电模式和正常模式有什么区别)

  • 苹果xr闪退怎么修复(苹果手机xr闪退)

    苹果xr闪退怎么修复(苹果手机xr闪退)

  • id错误次数多要多久才能下载(苹果id多次错误)

    id错误次数多要多久才能下载(苹果id多次错误)

  • bza-l00是什么型号(bz0100)

    bza-l00是什么型号(bz0100)

  • i34130最高配什么显卡(i34130性能怎么样)

    i34130最高配什么显卡(i34130性能怎么样)

  • 苹果数据线长度(苹果数据线长度都一样吗)

    苹果数据线长度(苹果数据线长度都一样吗)

  • 手机信号显示5g是什么意思(手机信号显示5G小加是不是网络信号不好?)

    手机信号显示5g是什么意思(手机信号显示5G小加是不是网络信号不好?)

  • 硬盘打开提示需格式化(硬盘打开提示需格式化是什么问题)

    硬盘打开提示需格式化(硬盘打开提示需格式化是什么问题)

  • 美团众包注册不符合规定什么意思(美团众包注册不了怎么回事身份不合要求)

    美团众包注册不符合规定什么意思(美团众包注册不了怎么回事身份不合要求)

  • 快手注销条件第三个未通过怎么办(快手注销条件第三方账号)

    快手注销条件第三个未通过怎么办(快手注销条件第三方账号)

  • 笔记本电脑用有线鼠标需要驱动吗(笔记本电脑用有线网还是无线网好)

    笔记本电脑用有线鼠标需要驱动吗(笔记本电脑用有线网还是无线网好)

  • 苹果手机通讯录删了怎么又显示出来了(苹果手机通讯录里的联系人不见了怎么恢复)

    苹果手机通讯录删了怎么又显示出来了(苹果手机通讯录里的联系人不见了怎么恢复)

  • 钉钉在哪里退出登录(钉钉在哪里退出群聊)

    钉钉在哪里退出登录(钉钉在哪里退出群聊)

  • 优活手环开不了怎么办(优活手环开不了机怎么回事儿)

    优活手环开不了怎么办(优活手环开不了机怎么回事儿)

  • 为什么iphone11微信没有信息提示(为什么iphone11微信通话不能退出通话界面)

    为什么iphone11微信没有信息提示(为什么iphone11微信通话不能退出通话界面)

  • 荣耀play3什么时候出的(荣耀play3多久出的)

    荣耀play3什么时候出的(荣耀play3多久出的)

  • 华为超级快充伤电池吗(华为超级快充伤不伤电池)

    华为超级快充伤电池吗(华为超级快充伤不伤电池)

  • 抖音是怎么推送视频(抖音是怎么推送可能认识的人)

    抖音是怎么推送视频(抖音是怎么推送可能认识的人)

  • 乐视手机otg功能怎么打开

    乐视手机otg功能怎么打开

  • 一加7pro触控采样率(一加七多点触控)

    一加7pro触控采样率(一加七多点触控)

  • 什么叫运行环境加载失败(什么叫运行环境问题)

    什么叫运行环境加载失败(什么叫运行环境问题)

  • nova5pro和nova5区别(nova5ipro和nova5的区别)

    nova5pro和nova5区别(nova5ipro和nova5的区别)

  • ppo手机微信铃声在哪里设置(phonering微信铃声)

    ppo手机微信铃声在哪里设置(phonering微信铃声)

  • 费用的进项税额可以抵扣吗
  • 汽车保养 美容
  • 增值税进项发票当月未开,怎么办
  • 企业税申报的三种方式
  • 定期定额自行申报流程
  • 房地产企业增值税收入确认时间
  • 金税盘可以用安卓的线吗
  • 营利性养老机构需要缴纳哪些税
  • 汽车销售公司购进车辆怎么做账
  • 购买无形资产的价款超过正常信用
  • 建筑企业如何才能上市
  • 企业亏损需要缴税吗
  • 递延所得税资产怎么计算
  • 小规模纳税人减免税明细表怎么填
  • 税收理财跟税收筹划有什么区别?
  • 投资股权投资基金算不算利好
  • 制造费用分配的的标准是什么?
  • 当月已认证的可抵扣增值税
  • 小规模纳税人核定征收标准
  • 腾讯手游助手遇到未知错误
  • 前任会计很多错账
  • iphone系统推送
  • Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
  • macbook怎么保存
  • php面向对象优点,缺点
  • php-mbstring
  • win11专业版网卡安不了
  • php定时执行代码
  • 可供出售金融资产现在叫什么
  • php pdo oracle
  • 厂房改造支出可以计入厂房价值吗
  • php的lamp
  • php5.4安装教程
  • 补付转账支票会退回吗
  • 免费开源的图片app
  • php对接微信支付教程
  • mysql 长事务
  • 无法收回的应收账款怎么做分录
  • 技术服务的范围
  • 上级拔入资金
  • 漏税处罚
  • centos下编写贪吃蛇吗
  • dedecms v6
  • 加油发票怎么报税
  • 上期金额是本年累计金额吗
  • 2021年发票认证期限为多少天
  • 以前年度亏损要调整吗
  • 资产减值损失属于
  • 销售清单需要盖什么章子
  • 注册资本金收到之后可以转挂往来款吗
  • 出售子公司股权给其他公司
  • 活动策划费属于哪个开票项目
  • 车船税去哪里交
  • 销售软件产品
  • 运费不支付会怎么样
  • 自产农产品加工成产品销售怎么抵扣
  • 期末库存商品怎么结转
  • 企业所得税虚报成本多少属于犯罪
  • 宾馆里面的牙膏收费吗
  • 购买电脑配件组件怎么选
  • 缴纳社保记账凭证怎么开
  • 购买商品发生的费用计入
  • 公司购买电视属于什么费用
  • sql数据库修改数据语句
  • mysql跨服务器查询语句
  • 微软10月已停止服务中国用户
  • arch linux安装yay
  • xp系统必备软件
  • cyb2k.exe是安全进程吗 cyb2k进程危险吗
  • 怎样加快电脑开机速度
  • win7电脑flash安装教程
  • android本地保存数据
  • javascript运用
  • cocos引擎教程
  • 前端框架到底是什么
  • 北京市国家税务局网站官网
  • 资源税从价计征的有哪些
  • 个体户是否需要缴纳企业所得税
  • 经营数据分析需要学什么
  • 杭州电子税务局怎么添加办税员
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设