JavaScript基础(26)_dom增删改练习

<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>DOM增删改练习</title>
    <link rel="stylesheet" href="../browser_default_style/reset.css">
    <style>
        table {
            border: 1px black solid;
            /* 表格边框合并 */
            border-collapse: collapse;
            margin-top: 20px;
            margin-left: 20px;
        }

        thead {
            background-color: aquamarine;
        }

        td {
            border: 1px black solid;
            font-size: large;
            text-align: center;
            vertical-align: middle;
            width: 80px;
            height: 22px;
        }

        tr>td:nth-of-type(2) {
            width: 180px;
        }

        a {
            color: blue;
            text-decoration: none;
        }

        form {
            border: 1px black solid;
            width: 320px;
            height: 230px;
            margin-left: 20px;
        }

        .title {
            display: flex;
            width: 100%;
            height: 80px;
            font-weight: bolder;
            font-size: large;
            align-items: center;
            justify-content: center;
        }

        li {
            list-style: none;
            margin: -10px 0px 0px 20px;

        }

        .button_position {
            display: flex;
            align-items: center;
            justify-content: center;
        }

        #add_info {
            display: flex;
            width: 100px;
            height: 30px;
            align-items: center;
            justify-content: center;
        }
    </style>
    <script>
        // 创建一个 "删除一行表格数据" 功能的函数
        function delete_tr() {
            // this指向当前调用方法的对象,即:all_anchor[i]。
            var tr = this.parentNode.parentNode;
            // 类似于:var name_td = tr.getElementsByTagName("td")[0].innerHTML;
            var name_td = tr.children[0].innerHTML;
            var flag = confirm("你确实要删除" + name_td + "吗?");
            if (flag) {
                tr.parentNode.removeChild(tr);
            }
            // 结束onclick事件跳转,结束语句执行。
            // 此代码也适用于取消超链接的默认行为,相当于:href = "javascript:;"。
            return false;
        }

        window.onload = function () {
            // 实现删除 "当前表格数据" 按钮功能
            var all_anchor = document.getElementsByTagName("a");
            for (var i = 0; i < all_anchor.length; i++) {
                // 赋值对象内容而不是赋值返回值,所以不需要带();
                all_anchor[i].onclick = delete_tr;
            }

            // 获取 "添加信息" 按钮、找到表格、表身体
            var add_info = document.getElementById("add_info");
            var table = document.getElementsByTagName("table")[0];
            var tbody = document.getElementsByTagName("tbody")[0];

            add_info.onclick = function () {
                // 定义变量接收来自 "用户的输入值"。
                // 注意:表单文本框内的属性不能用innerHTML,只能用value。
                var name = document.getElementsByClassName("name")[0].value;
                var email = document.getElementsByClassName("email")[0].value;
                var salary = document.getElementsByClassName("salary")[0].value;

                // 根据表的节点树,开始创造节点:
                // <tbody>
                //     <tr>
                //         <td>Tom</td>
                //         <td>tom@tom.com</td>
                //         <td>5000</td>
                //         <td><a href="">删除</a></td>
                //     </tr>
                // </tbody>

                // 创建文本节点对象,把用户的输入值赋值给文本节点对象
                var name_textnode = document.createTextNode(name);
                var email_textnode = document.createTextNode(email);
                var salary_textnode = document.createTextNode(salary);
                var author_textnode = document.createTextNode("删除");

                // 创建a元素、添加:href属性
                var a = document.createElement("a");
                a.href = "javascript:;";

                // 给 "超链接a、对应文本节点" 建立父子关系
                a.appendChild(author_textnode);

                // 创建tr、td元素
                var tr = document.createElement("tr");
                var name_td = document.createElement("td");
                var email_td = document.createElement("td");
                var salary_td = document.createElement("td");
                var author_td = document.createElement("td");

                // 给 "各单元格td、对应文本节点、超链接a" 建立父子关系
                name_td.appendChild(name_textnode);
                email_td.appendChild(email_textnode);
                salary_td.appendChild(salary_textnode);
                author_td.appendChild(a);

                // 给tbody、tr、td元素建立父子关系。
                // 没写thead、tbody、tfoot时,编译器会自动添加, 所以记得是tbody而不是table。
                tr.appendChild(name_td);
                tr.appendChild(email_td);
                tr.appendChild(salary_td);
                tr.appendChild(author_td);
                tbody.appendChild(tr);

                // 实现删除 "添加信息后的当前表格数据" 的按钮功能
                var all_anchor = document.getElementsByTagName("a");
                for (var i = 0; i < all_anchor.length; i++) {
                    all_anchor[i].onclick = delete_tr;
                }
            }
        }

    </script>
</head>

<body>
    <table>
        <thead>
            <tr>
                <td>姓名</td>
                <td>邮件</td>
                <td>工资</td>
                <td>&nbsp</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Tom</td>
                <td>tom@tom.com</td>
                <td>5000</td>
                <td><a href="">删除</a></td>
            </tr>
            <tr>
                <td>Jerry</td>
                <td>jerry@sohu.com</td>
                <td>8000</td>
                <td><a href="">删除</a></td>
            </tr>
            <tr>
                <td>Bob</td>
                <td>bob@tom.com</td>
                <td>10000</td>
                <td><a href="">删除</a></td>
            </tr>
        </tbody>
    </table>
    <br><br>
    <form action="">
        <div class="title">添加新员工</div>
        <ul>
            <li>姓名:<input type="text" class="name"></li> <br>
            <li>邮件:<input type="text" class="email"></li> <br>
            <li>工资:<input type="text" class="salary"></li> <br>
        </ul>
        <div class="button_position">
            <input type="button" value="添加信息" id="add_info">
        </div>
    </form>

</body>

</html>

用传统造节点的方式会使得JS部分代码臃肿,逻辑复杂。因此可将JS代码优化,效果如下:

 <script>
        // 创建一个 "删除一行表格数据" 功能的函数
        function delete_tr() {
            // this指向当前调用方法的对象,即:all_anchor[i]。
            var tr = this.parentNode.parentNode;
            // 类似于:var name_td = tr.getElementsByTagName("td")[0].innerHTML;
            var name_td = tr.children[0].innerHTML;
            var flag = confirm("你确实要删除" + name_td + "吗?");
            if (flag) {
                tr.parentNode.removeChild(tr);
            }
            // 结束onclick事件跳转,结束语句执行。
            // 此代码也适用于取消超链接的默认行为,相当于:href = "javascript:;"。
            return false;
        }

        window.onload = function () {
            // 实现删除 "当前表格数据" 按钮功能
            var all_anchor = document.getElementsByTagName("a");
            for (var i = 0; i < all_anchor.length; i++) {
                all_anchor[i].onclick = delete_tr;
            }

            // 获取 "添加信息" 按钮、找到表格、表身体
            var add_info = document.getElementById("add_info");
            var table = document.getElementsByTagName("table")[0];
            var tbody = document.getElementsByTagName("tbody")[0];

            add_info.onclick = function () {
                // 定义变量接收来自 "用户的输入值"。
                // 注意:表单文本框内的属性不能用innerHTML,只能用value。
                var name = document.getElementsByClassName("name")[0].value;
                var email = document.getElementsByClassName("email")[0].value;
                var salary = document.getElementsByClassName("salary")[0].value;

                var tr = document.createElement("tr");
                tr.innerHTML = "<td>" + name + "</td>"
                    + "<td>" + email + "</td>"
                    + "<td>" + salary + "</td>"
                    + "<td><a href='javascript:;'>删除</a></td>";
                tbody.appendChild(tr);

                // 此方式也能实现效果,但有以下缺点:
                // 1、添加信息更改了整个表身的全部数据。降低效率。
                // 2、原先设置表身数据的样式或程序可能会失效。
                // tbody.innerHTML += "<tr>" + "<td>" + name + "</td>"
                //     + "<td>" + email + "</td>"
                //     + "<td>" + salary + "</td>"
                //     + "<td><a href='javascript:;'>删除</a></td>"
                //     + "</tr>";

                // 实现删除 "添加信息后的当前表格数据" 的按钮功能
                var all_anchor = document.getElementsByTagName("a");
                for (var i = 0; i < all_anchor.length; i++) {
                    all_anchor[i].onclick = delete_tr;
                }
            }
        }

    </script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/318015.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式事务:构建无障碍的云原生应用的完美解决方案

目录 一、前言 二、分布式事务概述 2.1 什么是分布式事务 2.2 分布式事务的挑战 2.3 分布式事务的分类 三、传统解决方案分析 3.1 两阶段提交协议&#xff08;2PC&#xff09; 3.2 三阶段提交协议&#xff08;3PC&#xff09; 3.3 补偿事务 3.4 其他传统解决方案 四…

Qt/QML编程学习之心得:slider(34)

滑条slider&#xff0c;有时也成为进度条progressbar&#xff0c;在GUI界面中也是经常用到的。 import QtQuick 2.9 import QtQuick.Controls 2.0 import QtQuick.Layouts 1.2ApplicationWindow {id:rootvisible: truewidth: 1920height: 720//title: qsTr("Hello World&q…

慕尼黑工业大学最新提出!单目实时密集建图的混合隐式场方法

作者&#xff1a;小柠檬 | 来源&#xff1a;3DCV 在公众号「3DCV」后台&#xff0c;回复「原论文」可获取论文pdf 我们提出了一种新颖的方法&#xff0c;它将基于深度学习的密集SLAM与神经隐式场相结合&#xff0c;实时生成密集地图&#xff0c;而无需像以前的方法那样依赖RGB-…

Vue的api接口封装以及使用说明、模块说明

在Api目录下面建立user.js&#xff0c;如果以后有不同的接口请求地址都可以单独创建不同的&#xff0c;目的是方便维护&#xff01; import request from /utils/request 这个代码是引入之前封装好的 request.js 文件&#xff0c;具体可以参考上门一篇文档 Vue的request.js模…

基于springboot生鲜交易系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

Seata TC端协调全局事务

1、Seata server注册器 //来自RM分支事务注册 super.registerProcessor(MessageType.TYPE_BRANCH_REGISTER, onRequestProcessor, messageExecutor); //开启全局事务 super.registerProcessor(MessageType.TYPE_GLOBAL_BEGIN, onRequestProcessor, messageExecutor); //提交全…

ubuntu安装mysql(tar.xz)

0:本机Ubuntu的版本为 腾讯云 18.04 1&#xff1a;下载地址 MySQL &#xff1a;&#xff1a; 下载 MySQL 社区服务器 2&#xff1a;上传文件到服务器 3:解压 sudo sumv mysql-8.2.0-linux-glibc2.17-x86_64-minimal.tar.xz /usrtar -xvf mysql-8.2.0-linux-glibc2.17-x86_6…

谷歌最新医学领域LLM大模型:AMIE

2024年1月11日Google 研究院发布最新医疗大模型AMIE&#xff1a;用于诊断医学推理和对话的研究人工智能系统。 文章链接&#xff1a;Articulate Medical Intelligence Explorer (AMIE) giuthub&#xff1a;目前代码未开源 关于大模型之前有过一篇总结&#xff1a;大语言模型(L…

小程序基础学习(组件传参)

原理&#xff1a;通知在组件标签中传递参数已达到传参的目的 在组件的js的 properties中接受传递来的参数 然后在页面是展示这些数据 源码&#xff1a; <!--components/my-info/my-info.wxml--> <view class"title"> <text class"texts"&g…

【LangChain学习之旅】—(8) 输出解析:用OutputParser生成鲜花推荐列表

【LangChain学习之旅】—&#xff08;8&#xff09; 输出解析&#xff1a;用OutputParser生成鲜花推荐列表 LangChain 中的输出解析器Pydantic&#xff08;JSON&#xff09;解析器实战第一步&#xff1a;创建模型实例第二步&#xff1a;定义输出数据的格式第三步&#xff1a;创…

GPUMD分子动力学模拟-学习与实践

GPUMD分子动力学模拟-学习与实践 【20220813-樊哲勇 |基于GPUMD程序包的机器学习势和分子动力学模拟】 https://www.bilibili.com/video/BV1cd4y1Z7zi?share_sourcecopy_web 纯GPU下的MD分子模型系统软件 https://github.com/brucefan1983/GPUMD 跟GPUMD对接的一些python程…

调试(c语言)

前言&#xff1a; 我们在写程序的时候可能多多少少都会出现一些bug&#xff0c;使我们的程序不能正常运行&#xff0c;所以为了更快更好的找到并修复bug&#xff0c;使这些问题迎刃而解&#xff0c;学习好如何调试代码是每个学习编程的人所必备的技能。 1. 什么是bug&#xf…

Python教程(23)——Python类中常用的特殊成员

在Python中&#xff0c;类特殊成员是指以双下划线开头和结尾的属性和方法&#xff0c;也被称为魔术方法&#xff08;Magic methods&#xff09;或特殊方法&#xff08;Special methods&#xff09;。这些特殊成员在类的定义中具有特殊的语法和功能&#xff0c;用于实现对象的特…

行为型设计模式——迭代器模式

迭代器模式 迭代器模式也是非常的简单&#xff0c;定义如下&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 相信大家都使用过类似下面的迭代器&#xff1a; List<String> list new ArrayList<>(); Iterat…

3d建模软件有哪些?3d云渲染推荐

3D建模软件有很多&#xff0c;有的非常复杂难以上手&#xff0c;那么适合新手的有哪些呢&#xff1f;一起来看看吧。 1、SketchUp SketchUp是一个用户友好且直观的建模软件&#xff0c;能与V-Ray渲染器一起使用&#xff0c;适合初学者。2、Blender Blender是一个功能强大且免费…

图片无损放大神器PhotoZoom8 Pro中文破解版

摘要 BenVista PhotoZoom中文版是一款采用专利技术的图片无损放大软件&#xff0c;被誉为放大神器。该软件以其卓越的效果而著称&#xff0c;特别是在无锯齿、不失真的完美放大图像质量方面表现出色。 软件介绍 BenVista PhotoZoom中文版是一款采用专利技术的图片无损放大软…

视频封面提取工具,批量提取视频封面

你是否曾为从大量的视频中提取封面而感到困扰&#xff1f;传统的做法是逐个打开视频&#xff0c;然后手动截图。这不仅费时费力&#xff0c;还容易出错。现在&#xff0c;有了我们【媒体梦工厂】&#xff0c;这些烦恼全部消失。不论视频数量多少&#xff0c;一键即可批量提取&a…

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…

掌握WPF控件:熟练常用属性(一)

WPF布局常用控件&#xff08;一&#xff09; Border Border控件是一个装饰控件&#xff0c;用于围绕其他元素绘制边框和背景。它提供了一种简单的方式来为其他控件添加边框和背景样式&#xff0c;而无需自定义控件的绘制逻辑。 常用属性描述Background用于设置背景颜色或图像…

当浏览器输入url的时候会发生什么?

说在前面 当我们在浏览器中输入URL并按下回车时&#xff0c;背后发生了一系列神秘的操作。本文将带您深入了解&#xff0c;从URL解析到页面渲染&#xff0c;揭秘浏览器输入URL的完整流程。 具体步骤 当浏览器输入URL时&#xff0c;一般经过以下细节步骤&#xff1a; 1、引言 …
最新文章