JavaScript DOM操作:动态创建包含文本和交互按钮的列表项

JavaScript DOM操作:动态创建包含文本和交互按钮的列表项

本文将指导如何在javascript中通过dom操作,动态创建包含用户输入文本和删除按钮的列表项(`

`),并将其添加到html页面。通过详细的代码示例,您将学会如何有效地将多个元素(文本节点和按钮元素)添加到同一个父元素中,从而实现交互式待办事项列表等功能。

引言:动态构建交互式列表项

在现代Web开发中,通过JavaScript动态操作文档对象模型(DOM)是实现丰富用户界面的核心技术之一。无论是构建待办事项列表、评论区还是其他需要用户交互的动态内容,我们经常需要创建新的HTML元素,并向其中添加文本、按钮或其他组件。一个常见的需求是,当用户输入内容后,不仅要显示其文本,还要提供一个与之关联的操作按钮(例如“删除”),并将它们同时包含在同一个父元素中,如一个列表项(

  • )。

    核心概念解析:DOM元素创建与追加

    在深入实现之前,我们先回顾几个关键的DOM操作方法:

    document.createElement(tagName):用于创建一个指定标签名称的HTML元素节点。例如,document.createElement(‘li’) 将创建一个

  • 元素。document.createTextNode(data):用于创建一个文本节点。例如,document.createTextNode(‘我的待办事项’) 将创建一个包含“我的待办事项”文本的节点。parentNode.appendChild(childNode):将一个节点作为最后一个子节点添加到父节点。这个方法非常灵活,可以多次调用,将多个子节点依次追加到同一个父节点中。

    理解 appendChild 可以多次调用的特性是解决本文问题的关键。

    问题场景:如何同时添加文本和按钮?

    假设我们正在开发一个简单的待办事项应用,用户可以在输入框中输入计划,然后按回车键或提交表单后,该计划会作为列表项显示。每个列表项不仅要显示用户输入的内容,还应带有一个“删除”按钮。

    立即学习“Java免费学习笔记(深入)”;

    以下是初始的HTML结构:

    todos

      以及一个尝试实现此功能的JavaScript片段:

      酷表ChatExcel 酷表ChatExcel

      北大团队开发的通过聊天来操作Excel表格的AI工具

      酷表ChatExcel 48 查看详情 酷表ChatExcel

      function todoList(){    const item: string = (document.getElementById('todoInput')).value;    const text = document.createTextNode(item);    const newItem = document.createElement('li');    const button: any = document.createElement("button");    button.innerHTML = 'Delete';    newItem.appendChild(text); // 这里只追加了文本节点    // @ts-ignore}const form = (document.getElementById('todoForm'));form.addEventListener("submit", (e) => {    e.preventDefault();    // todoList(); // 实际调用 todoList 函数});

      在上述JavaScript代码中,我们创建了

    1. 元素 (newItem),创建了文本节点 (text),并将其追加到了 newItem。我们也创建了 button 元素,并设置了其文本。然而,button 元素并没有被追加到 newItem 中。因此,当 todoList 函数执行后,页面上只会显示用户输入的文本,而不会有“删除”按钮。

      解决方案:追加多个子元素到同一父元素

      解决这个问题的方法非常直接:只需要在 newItem.appendChild(text) 之后,再调用一次 newItem.appendChild(button) 即可。

      function todoList(){   const item: string = (document.getElementById('todoInput')).value;   const text = document.createTextNode(item);   const newItem = document.createElement('li');   const button: any = document.createElement("button");   button.innerHTML = 'Delete';   newItem.appendChild(text); // 追加文本节点   newItem.appendChild(button); // <--- 关键:追加按钮元素到同一个 li   // @ts-ignore}

      通过添加 newItem.appendChild(button) 这一行,我们确保了 button 元素也被正确地添加到了

    2. 元素内部,使其成为
    3. 的一个子元素。

      构建完整且功能完善的待办事项列表

      为了提供一个完整的、可运行的示例,我们不仅要解决按钮的追加问题,还要完善待办事项列表的整体逻辑,包括将

    4. 添加到

          容器中,以及为“删除”按钮添加实际的删除功能。

          HTML 结构

                      待办事项列表            body { font-family: Arial, sans-serif; margin: 20px; }        #todoForm { display: flex; margin-bottom: 20px; }        #todoInput { flex-grow: 1; padding: 8px; border: 1px solid #ccc; border-radius: 4px; }        #todoForm button { margin-left: 10px; padding: 8px 15px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }        #todoForm button:hover { background-color: #0056b3; }        #todoList { list-style: none; padding: 0; }        #todoList li { display: flex; justify-content: space-between; align-items: center; padding: 10px; border: 1px solid #eee; margin-bottom: 8px; border-radius: 4px; background-color: #f9f9f9; }        #todoList li button { background-color: #dc3545; color: white; border: none; padding: 5px 10px; border-radius: 3px; cursor: pointer; }        #todoList li button:hover { background-color: #c82333; }        

          我的待办事项

            JavaScript 实现 (app.js)

            // 获取DOM元素const todoInput = document.getElementById('todoInput');const todoForm = document.getElementById('todoForm');const todoListContainer = document.getElementById('todoList');/** * 添加新的待办事项到列表 */function addTodoItem() {    const itemText = todoInput.value.trim(); // 获取输入值并去除首尾空格    // 检查输入是否为空    if (itemText === "") {        alert("待办事项不能为空!");        return;    }    // 1. 创建新的列表项 
          1. const newItem = document.createElement('li'); // 2. 创建文本节点,包含用户输入的内容 const textNode = document.createTextNode(itemText); newItem.appendChild(textNode); // 将文本节点追加到
          2. // 3. 创建删除按钮 const deleteButton = document.createElement("button"); deleteButton.innerHTML = '删除'; // 设置按钮文本 // 为删除按钮添加点击事件监听器 deleteButton.onclick = function() { newItem.remove(); // 当按钮被点击时,移除整个
          3. 元素 }; newItem.appendChild(deleteButton); // 将删除按钮追加到同一个
          4. // 4. 将完整的
          5. 追加到
              容器中 todoListContainer.appendChild(newItem); // 5. 清空输入框,以便用户输入下一个事项 todoInput.value = ''; todoInput.focus(); // 重新聚焦输入框}// 监听表单的提交事件todoForm.addEventListener("submit", (e) => { e.preventDefault(); // 阻止表单的默认提交行为(页面刷新) addTodoItem(); // 调用添加待办事项的函数});
          6. 在这个完整的示例中,addTodoItem 函数负责创建

          7. 、文本节点和“删除”按钮,并将文本节点和按钮都追加到
          8. 中。然后,这个完整的
          9. 被追加到
              容器中。同时,我们为“删除”按钮添加了 onclick 事件,使其能够移除其父级

            1. 元素,实现了待办事项的删除功能。表单的 submit 事件监听器则确保在用户提交表单时调用 addTodoItem 函数,并阻止页面刷新。

              注意事项与最佳实践

              输入验证:在添加内容前,检查用户输入是否为空或仅包含空格,可以提升用户体验。清空输入框:成功添加内容后清空输入框,并可选地重新聚焦,方便用户继续输入。事件处理:对于动态创建的元素(如本例中的“删除”按钮),可以直接在创建时绑定事件监听器。对于大量动态生成的元素,考虑使用事件委托(Event Delegation)是一种更高效的模式。这意味着将事件监听器绑定到它们的共同父元素上,然后通过事件冒泡和 event.target 来判断是哪个子元素触发了事件。TypeScript 类型断言:在TypeScript环境中,当通过 document.getElementById() 获取元素时,通常需要使用类型断言(如 或 )来明确元素的具体类型,以便访问其特有的属性和方法(如 .value 或 .addEventListener)。性能考量:虽然本例中直接操作DOM是可行的,但在处理大量数据或频繁DOM操作时,考虑使用文档片段(DocumentFragment)来批量添加元素,减少页面重绘,或使用现代前端框架(如React, Vue, Angular)来优化DOM更新。

              总结

              通过本教程,我们学习了如何在JavaScript中利用 document.createElement()、document.createTextNode() 和 element.appendChild() 方法动态创建HTML元素。关键在于理解 appendChild() 可以多次用于同一个父元素,从而允许我们将多个子元素(如文本节点和按钮元素)有效地组合到单个父元素(如

            2. )中。结合事件监听器,我们可以构建出功能强大且交互性强的Web界面,如本例中的待办事项列表。掌握这些基本的DOM操作是进行前端开发的基础。

              以上就是JavaScript DOM操作:动态创建包含文本和交互按钮的列表项的详细内容,更多请关注创想鸟其它相关文章!

              版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
              如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
              发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/624236.html

      • (0)
        打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
        上一篇 2025年11月11日 08:05:20
        下一篇 2025年11月11日 08:06:03

        相关推荐

        • 使用 Django 和 JavaScript 实现流畅的点赞/取消点赞功能

          本文旨在帮助开发者使用 Django 框架和 JavaScript 实现一个流畅、无需页面刷新的点赞/取消点赞功能。我们将探讨如何正确处理图标切换、避免点赞计数在所有帖子中同步更新的问题,并提供一个更简洁、高效的代码实现方案,包括前后端代码示例和注意事项。 前端实现:JavaScript 和 HTM…

          好文分享 2025年12月20日
          000
        • 使用 Django 和 JavaScript 实现平滑的点赞/取消点赞功能

          本文旨在提供一个清晰、高效的教程,指导开发者如何使用 Django 框架和 JavaScript 实现点赞和取消点赞功能,并解决常见问题,例如图标切换不正确和点赞计数错误。我们将优化数据处理方式,采用更简洁的 JavaScript 代码,并提供完整的示例,确保功能的流畅性和用户体验。 优化模型关系 …

          2025年12月20日 好文分享
          000
        • JavaScript:访问具有相同类名的表单内的元素

          本文旨在解决在包含多个表单的网页中,如何使用 JavaScript 准确访问特定表单内的元素,尤其是当不同表单中的元素具有相同的类名时。文章将通过示例代码详细讲解如何通过表单的 ID 来定位表单,并获取表单内特定类名的元素的值。同时,也会介绍一些调试技巧,帮助开发者更好地理解和排查问题。 在构建复杂…

          2025年12月20日 好文分享
          000
        • 优化 React 组件中的条件判断:减少 if-else 语句的使用

          本文旨在帮助开发者优化 React 组件中大量 if-else 语句的使用,通过采用更简洁的数据结构和 JavaScript 特性,如对象字面量和 ??= 空值合并赋值运算符,来提高代码的可读性和可维护性。我们将通过一个实际的 React 组件案例,展示如何将复杂的条件判断逻辑简化为更优雅的实现方式…

          2025年12月20日
          000
        • 优化 React 代码中的 If-Else 结构:更简洁的条件处理方案

          本文旨在帮助开发者优化React代码中大量的if-else语句,提供使用对象字面量和三元运算符等方法,以实现更简洁、更易于维护的代码。通过具体的代码示例,展示如何将复杂的条件判断逻辑转换为更优雅的实现方式,提高代码的可读性和效率。 在编写 React 应用时,经常会遇到需要根据不同的条件执行不同逻辑…

          2025年12月20日
          000
        • 网页表单验证:确保必填字段完整性的 JavaScript 教程

          本文旨在解决 JavaScript 表单验证中常见的逻辑错误,并提供一种简单有效的验证方法。通过修改原有的验证逻辑,避免了不必要的复杂判断,简化代码,并确保在必填字段为空时阻止表单提交,从而提高用户体验和数据质量。本文将提供修正后的代码示例,并解释其工作原理,帮助开发者更好地理解和应用表单验证技术。…

          好文分享 2025年12月20日
          000
        • 在富文本编辑器中,如何利用 JavaScript 处理选区范围和内容格式?

          答案:JavaScript通过Selection和Range API实现富文本编辑功能。使用window.getSelection()获取选区,range.surroundContents()包裹内容实现加粗等格式,注意跨节点选区需先extractContents();插入内容时用insertNod…

          2025年12月20日
          000
        • 如何利用 JavaScript 实现一个支持快捷键操作的富文本编辑器?

          答案:通过contenteditable结合keydown事件监听实现快捷键操作,使用document.execCommand执行加粗、斜体、下划线、插入链接等命令,支持Ctrl/Cmd组合键触发,可扩展对齐、列表、标题等功能,并建议后续迁移至现代API或使用专业库优化兼容性与功能。 要实现一个支持…

          2025年12月20日
          000
        • Redux Dispatch 无效:状态未更新的调试与解决方案

          本文旨在帮助开发者诊断和解决 Redux 应用中 dispatch action 后状态未更新的问题。通过分析常见的错误配置和代码陷阱,提供逐步排查和修复的指导,确保 Redux 状态管理的正确性和可靠性。本文将通过一个实际案例,深入剖析问题原因,并提供详细的解决方案,助力开发者构建稳定高效的 Re…

          2025年12月20日
          000
        • Redux Dispatch 未更新 State 的问题排查与解决

          本文旨在帮助开发者排查和解决 Redux dispatch 未能正确更新 state 的问题。通过分析常见原因,例如 reducer 中的 state 访问错误、dispatch 参数错误等,并提供相应的代码示例和调试技巧,确保 Redux 状态管理的正确性。本文将通过一个实际案例,深入探讨问题根源…

          2025年12月20日
          000
        • Vue.js中JSON数据邮件地址搜索与表格展示教程

          本教程详细介绍了如何在Vue.js应用中,对JSON数据源进行邮件地址搜索。我们将利用JavaScript的Array.prototype.find()方法高效定位匹配的邮件地址对象,并将其结果动态绑定到Vue.js的网格表格中,实现数据的筛选与展示。 理解JSON数据中的邮件地址搜索需求 在现代w…

          2025年12月20日
          000
        • 如何在 ReactJS 18 的类组件中访问 props.children

          本文针对 ReactJS 18 中类组件访问 props.children 时可能遇到的 TypeScript 类型问题,提供了清晰的解决方案。通过正确定义组件的 Props 类型,显式声明 children 属性,可以避免类型检查错误,并确保在类组件中正常使用 props.children。文章还…

          2025年12月20日
          000
        • Redux Dispatch 无效:状态未更新问题排查与解决方案

          本文旨在解决 Redux 应用中 dispatch 函数调用后状态未更新的问题。通过分析常见原因,例如 reducer 中的状态更新方式错误,以及 dispatch 调用时传递的参数不正确等,提供详细的排查步骤和解决方案,帮助开发者快速定位并修复问题,确保 Redux 状态管理的正确性。 在 Red…

          2025年12月20日
          000
        • Vue.js中实现JSON数据电子邮件搜索及表格展示教程

          本教程将指导您如何在Vue.%ignore_a_1%应用中高效地搜索存储在JSON对象数组中的特定电子邮件地址,并将匹配到的数据精准地呈现在网格表格中。我们将利用JavaScript的Array.prototype.find()方法,结合Vue的数据响应式机制,实现一个简洁且功能完善的搜索功能。 1…

          2025年12月20日
          000
        • JavaScript实现表单提交前用户确认与阻止

          本教程详细讲解如何使用JavaScript在用户提交表单前弹出确认对话框。我们将探讨如何正确监听表单的submit事件,并利用confirm()函数获取用户选择。当用户选择取消时,通过event.preventDefault()方法有效阻止表单的默认提交行为,确保数据提交的准确性和用户体验。 1. …

          2025年12月20日
          000
        • Redux Dispatch 不更新状态问题排查与解决

          本文旨在帮助开发者解决 Redux 中 dispatch 无法更新状态的问题。通过分析常见的错误原因,例如 reducer 中的状态更新方式,以及 action payload 的传递,提供详细的排查步骤和解决方案,确保 Redux 状态的正确更新。 当你在 React 应用中使用 Redux 时,…

          2025年12月20日 好文分享
          000
        • Redux Dispatch 不更新状态的排查与解决

          本文旨在帮助开发者诊断和解决 Redux 应用中 dispatch 函数调用后状态未更新的问题。通过分析常见的错误配置和代码实现,提供逐步排查方案和修正建议,确保 Redux 状态管理的正确性和可靠性。 在 Redux 应用开发中,dispatch 函数用于触发状态变更,如果 dispatch 调用…

          2025年12月20日
          000
        • 在Vue.js中实现JSON对象邮箱地址搜索并展示到表格

          本文详细介绍了如何在Vue.js应用中,高效地从JSON数据集合中搜索特定邮箱地址,并将匹配到的单一用户数据展示到前端表格。核心方法是利用JavaScript的Array.prototype.find()函数进行精准查找,并提供了详细的Vue.js代码示例、处理多结果的filter()方法,以及关于…

          2025年12月20日
          000
        • 使用 Sequelize 进行关联查询时,排序混乱问题排查与解决

          本文旨在解决在使用 Sequelize 进行关联查询时,由于关联表数据未排序,导致主表数据排序出现混乱的问题。我们将深入探讨问题产生的原因,并提供一种通过指定更明确的排序规则来解决该问题的方案,确保数据在每次查询时都以一致的顺序返回。 问题分析 在使用 Sequelize 进行关联查询时,特别是涉及…

          2025年12月20日
          000
        • 基于 Sequelize 的多条件排序导致 UI 刷新异常的解决方案

          在使用 Sequelize 进行数据查询时,多条件排序可能会导致 UI 刷新出现异常,例如数据顺序错乱。这是因为在包含关联模型且关联模型也参与排序的情况下,如果关联模型的数据没有明确的排序规则,Sequelize 的查询结果可能是不稳定的。本文将深入探讨这一问题,分析其产生的原因,并提供一种解决方案…

          2025年12月20日
          000

        发表回复

        登录后才能评论
        关注微信