js动态添加li标签怎么做?,怎么添加标签?

JavaScript动态添加li标签最直接的方式是使用document.createElement('li')创建节点,再通过appendChild或insertBefore插入到父级列表,同时可用setAttribute或classList添加标签和样式,这是原生JS操作的基准方案,且不依赖任何框架。

原生JS动态添加li标签的核心方法

动态操作列表是前端开发中的高频场景,无论是渲染后台数据还是构建交互组件,都绕不开在ul或ol中插入li,先理清最基础的三条路径,再根据场景选最合适的。

js动态创建li标签
加载中
js动态创建li标签

使用createElement和appendChild

这是W3C规范推荐的标准做法,执行步骤清晰,且不会触发内联脚本的解析安全问题。

// 获取父级ul
const ul = document.getElementById('myList');
// 创建li元素
const li = document.createElement('li');
// 设置文本内容
li.textContent = '新增项';
// 如果需要添加标签或类
li.classList.add('item');
// 追加到ul末尾
ul.appendChild(li);

关键点:textContent比innerHTML更安全,避免XSS;appendChild一次只能添加一个节点,如果需要批量添加,配合DocumentFragment可以大幅提升性能。

使用insertBefore在指定位置插入

很多场景需要把新li插入到某个已有项之前,而不是末尾,这时用insertBefore,它接受两个参数:要插入的节点和参考节点。

const ul = document.getElementById('myList');
const firstLi = ul.querySelector('li:first-child');
const newLi = document.createElement('li');
newLi.textContent = '插在最前面';
ul.insertBefore(newLi, firstLi);

如果参考节点为null,效果等同于appendChild,日常开发中,结合children索引或nextSibling能灵活控制位置。

使用innerHTML的注意事项

直接用ul.innerHTML += '<li>新项</li>'确实简洁,但存在两个硬伤:

  • 每次赋值都会重新解析整个列表的HTML字符串,原有节点的绑定事件和状态全部丢失。
  • 直接拼接字符串容易引入XSS漏洞,尤其是数据来自用户输入或接口返回时。

行业共识认为,在数据量较大或需要频繁更新的列表中,应避免使用innerHTML;仅在一次性渲染静态内容时考虑,且必须对数据做转义处理。

js动态添加li标签后添加class和属性

js动态添加li标签怎么做?,怎么添加标签?

添加一个li只是第一步,绝大多数业务场景需要给这个标签附上类名、ID、自定义属性或样式,用于后续的样式控制、数据存储或事件绑定。

添加class的几种方式

方法 代码示例 适用场景
classList.add() li.classList.add('active', 'highlight') 添加一个或多个类,不会覆盖原有类
className li.className = 'active' 直接替换全部类名,需谨慎使用
setAttribute('class', ...) li.setAttribute('class', 'active') 与className效果类似,但不推荐

实操建议:多数情况下优先使用classList.add(),因为它能保留原有类名,且支持contains、remove、toggle等实用方法。

添加自定义属性与data-

动态li常常需要携带业务数据,比如ID、状态等,使用dataset操作data-属性最直观:

li.dataset.id = '1001';
li.dataset.type = 'product';
// 渲染后:<li data-id="1001" data-type="product">...</li>

如果属性名不是标准data-前缀,也可以用setAttribute,但dataset更符合现代开发习惯,且自动处理驼峰命名转换。

js动态添加li标签并绑定事件

空有标签没有交互,等于白做,动态添加的li需要绑定点击、悬停、删除等事件,这里有两条路:直接在添加时绑定,或者利用事件委托。

事件委托 vs 直接绑定

  • 直接绑定:在创建li后立即用addEventListener挂载,优点是逻辑直观,缺点是每个li独立监听,大量元素时内存占用较高。
  • 事件委托:在父级ul上监听事件,通过event.target判断点击的是哪个li,这是业内高性能场景的首选方案,尤其适合频繁增删的列表。
// 事件委托示例
ul.addEventListener('click', function(e) {
  if (e.target.tagName === 'LI') {
    console.log('点击了:', e.target.textContent);
  }
});

优势:新增的li无需额外绑定,自动获得事件能力;移除li时也不用担心内存泄漏,据统计,在包含数百个动态列表项的页面中,事件委托可将事件相关内存占用降低

js动态添加li标签怎么做?,怎么添加标签?

相当比例。

绑定事件的同时传递数据

通过dataset或闭包可以传递自定义数据,主流做法是用data-属性存储关键信息,在事件回调中通过e.target.dataset读取,避免依赖闭包引发的内存问题。

js动态添加li标签与jQuery方案对比

不少老项目仍在使用jQuery,但现代前端开发趋势已转向原生或框架,做一次客观对比,帮你在实际选型时心里有数。

jQuery的简便性

jQuery提供append、prepend、after等方法,语法简洁,且自动处理了浏览器兼容性。

$('#myList').append('<li class="item">新项</li>');
// 或
$('<li>').text('新项').addClass('item').appendTo('#myList');

缺点:返回的是jQuery对象,与原生节点混用容易出错;链式调用虽然方便,但在复杂逻辑中可读性下降;对于现代浏览器,很多原生API已经足够简洁,不需要额外引入60KB+的库。

原生JS的三大优势

  1. 零依赖:项目体积更小,加载更快。
  2. 性能更优:原生方法直接操作DOM,没有中间层开销,在大量动态添加时,原生配合DocumentFragment的提速效果非常明显。
  3. 标准统一:ES6+的API普及度已经很高,兼容性不再是障碍,即使是IE11,createElement和appendChild也完全支持。

新项目建议直接使用原生JS或配合框架;维护老jQuery项目时,可以继续用jQuery方式,但要注意混合使用时的类型转换。

实际场景:ajax获取数据后动态添加li

这是最典型的应用场景从后端接口拿到数据,渲染成列表,下面给出一个完整的操作流程,可直接参考。

步骤分解

  1. 发起请求:使用fetch或XMLHttpRequest获取JSON数据。
  2. 创建文档片段:初始化DocumentFragment,用于批量添加,减少重绘回流。
  3. 循环生成li:遍历数据,为每条数据创建li、类名、属性。
  4. 追加到片段:将每个li添加到DocumentFragment中。
  5. 一次性插入:将片段整体追加到ul。
fetch('/api/list')
  .then(res =&g

js动态添加li标签怎么做?,怎么添加标签?

t; res.json()) .then(data => { const fragment = document.createDocumentFragment(); data.forEach(item => { const li = document.createElement('li'); li.textContent = item.name; li.dataset.id = item.id; li.classList.add('list-item'); fragment.appendChild(li); }); document.getElementById('myList').appendChild(fragment); });

性能建议:如果数据量较大(超过几百条),考虑分页或虚拟滚动;创建li时避免在循环中操作offsetHeight等强制回流的属性。

js动态添加li标签后样式与动画的平滑处理

添加新li时,如果直接出现,视觉上会显得突兀,配合CSS过渡或动画,能让用户体验更好。

使用CSS配合JS切换类

在创建li时先添加一个初始类(如new-item),然后通过requestAnimationFrame或setTimeout移除它,触发过渡效果。

.new-item {
  opacity: 0;
  transform: translateY(-10px);
  transition: all 0.3s ease;
}
li.classList.add('new-item');
ul.appendChild(li);
requestAnimationFrame(() => {
  li.classList.remove('new-item');
});

这样新项目会以淡入加位移的方式出现,无需额外动画库。

Q&A:js动态添加li标签常见问题解答

Q1:动态添加的li为什么无法响应click事件?
最常见的错误是直接绑定在li上,但绑定时元素尚未存在,解决方案是改用事件委托,在父级ul上监听click,通过e.target.tagName判断是否LI,如果必须单独绑定,请在创建li后立即调用addEventListener,不要延迟。

Q2:大量动态添加li时页面卡顿怎么办?
卡顿的根本原因是DOM操作触发了多次重排和重绘,优化手段包括:使用DocumentFragment批量插入;将li的样式尽量用类名控制,避免逐个修改内联样式;如果数据量达到数千条,考虑只渲染可视区域,其他用占位占位,即虚拟滚动方案。

QL:动态添加的li如何添加删除按钮并实现删除功能?
在创建li时,内部追加一个<button class="delete-btn">删除</button>,然后利用事件委托在ul上监听点击,通过e.target.classList.contains('delete-btn')判断,找到目标li后调用removeChild或remove,注意删除后要同步清理关联的数据和事件。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/js%e5%8a%a8%e6%80%81%e6%b7%bb%e5%8a%a0li%e6%a0%87%e7%ad%be%e6%80%8e%e4%b9%88%e5%81%9a%ef%bc%9f%ef%bc%8c%e6%80%8e%e4%b9%88%e6%b7%bb%e5%8a%a0%e6%a0%87%e7%ad%be%ef%bc%9f/

赞 (0)
服务器怎么完全备份,服务器完全备份的方法有哪些?
上一篇 2026年8月4日 22:32
IP购买时如何选择弹性公网IP池,价格多少合适
下一篇 2026年8月4日 22:38

相关推荐

  • php插件开发怎么做?php插件开发教程

    PHP插件开发的核心价值在于实现系统功能的模块化扩展与解耦,通过定义标准化的接口规范,能够在不修改主程序源码的前提下,动态地为应用注入新功能,这是提升大型Web项目可维护性与扩展性的最佳实践,核心结论:标准化接口与生命周期管理是插件机制成功的基石在软件工程层面,插件本质上是一种遵循开闭原则的设计模式实现,主程序……

    2026年3月27日
    8400
  • 百家号动态收益怎么算?百家号动态收益规则详解

    百家号动态收益怎么算创作与自媒体运营领域,流量变现是核心驱动力之一,对于百家号创作者而言,理解其动态收益的计算逻辑,不仅有助于优化内容策略,更能精准预估收入预期,许多新手往往忽视了支撑内容分发背后的基础设施——服务器性能与网络稳定性对阅读体验及用户留存率的隐性影响,本文将深入解析百家号动态收益算法,并结合高性能……

    2026年7月7日
    18000
  • 如何用C语言开发PHP扩展?高性能PHP模块开发实战教程

    直接使用C语言为PHP构建高性能扩展PHP作为广泛应用的服务器端脚本语言,在处理复杂计算、底层系统交互或极致性能场景时,原生PHP可能力有不逮,使用C语言开发PHP扩展(Zend Extension)成为关键解决方案,它能将关键逻辑下沉到C层,显著提升执行效率并突破PHP的部分限制,以下是构建一个稳健PHP扩展……

    程序开发 2026年2月14日
    13900
  • 域名解析产品怎么用?域名解析失败怎么办

    关于域名解析产品在构建高可用、高并发的互联网架构中,域名系统(DNS)不仅是用户访问网站的“导航员”,更是决定业务响应速度、稳定性及安全性的核心基础设施,随着云计算技术的普及,传统的自建DNS服务器已难以满足现代业务对低延迟、高并发及安全防护的需求,本文将对主流云服务商的域名解析产品进行深度测评,并结合2026……

    2026年5月30日
    4000
  • C店开发票怎么开?个人淘宝店铺开发票流程详解

    C店开发票不仅是合规经营的必经之路,更是提升店铺信誉、规避税务风险的关键举措,对于众多淘宝、天猫及个人网店卖家而言,正确理解并执行开票流程,能够有效避免售后纠纷,确立市场竞争力,合规性是C店生存的底线,根据《电子商务法》及相关税收征管规定,电子商务经营者应当依法履行纳税义务,并依法出具纸质发票或者电子发票等购货……

    2026年3月11日
    16600
  • 如何快速搭建JSP开发环境?JSP开发环境详细步骤分享

    成功构建现代化的Java Web应用,一个稳固高效的开发环境是基石,以下是基于JSP(JavaServer Pages)技术栈搭建专业开发环境的详细步骤和最佳实践,助您快速启航, 环境基石:必备组件安装与配置Java开发工具包 (JDK) – 核心引擎选择版本: 推荐使用最新的 Java LTS (长期支持……

    程序开发 2026年2月14日
    15130
  • 轻松Scrum入门,新手如何快速掌握敏捷开发流程?

    轻松Scrum之旅:敏捷开发故事Scrum远非冰冷的流程框架,它是团队高效协作、持续交付价值的活力引擎,理解其精髓并实践之,软件开发之旅将变得目标清晰、响应迅速且充满成就感,第一章:Scrum核心舞台 – 框架与角色想象一支探险队:目标明确(产品目标),路线灵活调整(冲刺目标),成员各司其职又紧密协作,Scru……

    2026年2月7日
    13800
  • 开发商暗盒质量好吗,装修为什么要换开发商暗盒

    在家庭装修的隐蔽工程中,电路改造是重中之重,而开发商暗盒作为电路系统的“心脏”保护壳,其质量优劣与安装规范直接决定了居住安全与后期开关插座的安装效果,核心结论非常明确:绝大多数精装房或毛坯房交付时预留的原有暗盒,在材质耐用性、安装规范度以及兼容性上往往存在隐患,业主在装修前必须进行严格的排查与必要的更换,切勿因……

    2026年3月13日
    15300
  • 公司让我体验实时音视频服务,实时音视频服务怎么申请?

    公司让我体验下实时音视频服务在数字化转型的浪潮中,实时音视频(RTC)技术已成为企业连接用户、提升交互效率的核心基础设施,从在线教育到远程医疗,从直播电商到云游戏,低延迟、高清晰度的音视频传输能力直接决定了产品的用户体验与商业转化,受公司项目需求驱动,我对市面上几款主流的实时音视频云服务进行了为期两周的深度实测……

    2026年6月27日
    1600
  • 服务器vip插件有哪些核心功能,怎么使用?

    服务器VIP插件是搭建稳定盈利服务器的核心支撑,选对工具并合理配置,就能在玩家体验和运营效率之间找到最佳平衡,为什么你的服务器需要VIP插件很多服主在服务器开起来后,第一反应是装个经济插件或者领地插件,但往往忽略了VIP系统,一套成熟的VIP插件 能直接决定玩家留存率和付费意愿,业内专家指出,服务器活跃度下降的……

    2026年7月25日
    2100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注