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

news2024/9/21 10:56:35
<!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.coloradmin.cn/o/1381657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试|Selenium StaleElementException异常的原因与方法

简介 在使用Selenium进行Web自动化测试时&#xff0c;我们可能会遇到StaleElementException异常。这个异常通常在我们操作一个之前已经找到的元素时抛出&#xff0c;但该元素已经不再处于DOM树中&#xff0c;导致元素过时&#xff08;stale&#xff09;。本文将介绍StaleEleme…

C++11 左右值引用、移动语义

右值引用和移动语义 什么是左值&#xff1f;什么是左值引用&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出现在赋值符号左边。定义时const修饰…

SpringSecurity入门demo(二)表单认证

上一篇博客集成 Spring Security&#xff0c;使用其默认生效的 HTTP 基本认证保护 URL 资源&#xff0c;下面使用表单认证来保护 URL 资源。 一、默认表单认证&#xff1a; 代码改动&#xff1a;自定义WebSecurityConfig配置类 package com.security.demo.config; import or…

基于python的基金分析可视化系统

项目背景&#xff1a; 随着金融市场的发展和人们对财富管理的重视&#xff0c;越来越多的人开始参与基金投资。然而&#xff0c;由于市场上基金产品众多且复杂&#xff0c;投资者往往难以快速准确地获取基金信息和进行分析&#xff0c;从而导致投资决策不够科学和有效。为了解决…

PyCharm安装使用教程2024

简介 PyCharm是一种PythonIDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…

三棋先手必胜证明

目录 创作原因 游戏规则 初始状态图 证明过程 先手必胜的证明 失败的博弈树&#xff08;三个多小时的成果&#xff09; 创作原因 这个棋不是网上流行的成三棋&#xff0c;我也不知道这个棋叫什么。由于这个棋是&#xff08;横竖斜&#xff09;连成三个就获胜&#xff0c;…

Vulnhub-HACKSUDO: PROXIMACENTAURI渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、端口敲门三、web密码爆破四、getShell五、获取新用户六、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0…

【同济子豪兄斯坦福CS224W中文精讲】NetworkX代码学习笔记

文章目录 安装配置创建图可视化图图数据挖掘参考资料 安装配置 matplotlib中文字体设置 import networkx as nx import matplotlib.pyplot as plt # 魔法指令&#xff0c;设置后在jupyter notebook中绘制的图形会显示在输出单元格中&#xff0c;而不是弹出一个新窗口 %matplo…

ssm基于Javaweb的网上奶茶店系统的设计与实现论文

摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#xff0c;让整个世界都可以即时通话…

爬虫之牛刀小试(四):爬取B站番剧的简介

今天爬取的是b站。 如何爬取b站中的番剧呢&#xff1f; 首先我们来到番剧索引中&#xff0c;随便点开一部动漫&#xff0c;检查代码。 每个作品对应一个链接: https://www.bilibili.com/bangumi/play/ss…&#xff08;ss后面的数字称为ss号&#xff09; 发现关于动漫的信息…

【数据库】sql优化有哪些?从query层面和数据库层面分析

目录 归纳sql本身的优化数据库层面的优化 归纳 这类型问题可以称为&#xff1a;Query Optimization&#xff0c;从清华AI4DB的paper list中&#xff0c;该类问题大致可以分为&#xff1a; Query RewriterCardinality EstimationCost EstimationPlan Optimization 从中文的角…

某厂校招一道关于C的笔试题

一、笔试原题 题目&#xff1a;在Linux x86 _ 54 gcc环境下&#xff0c;下面的程序会出现什么问题&#xff1f;运行结果是什么&#xff1f;为什么&#xff1f; 程序如下图&#xff1a; 通过在gcc的环境下编译运行&#xff0c;发现运行结果为不断死循环打印0-17的数字 我们…

TCP之三次握手四次挥手与UDP区别

文章目录 1 TCP三次握手四次挥手1.1 数据包说明1.1.1 TCP数据包1.1.2 UDP数据包1.1.3 TCP和UDP差异1.1.4 TCP可靠性传输机制 1.2 三次握手1.2.1 三次握手定义1.2.2 三次握手问题1.2.2.1 问题引入分析1.2.2.2 历史连接1.2.2.3 同步双方初始序列号1.2.2.4 避免资源浪费 1.3 四次挥…

Github Copilot AI保密级教程

Copilot 是一款由 OpenAI 推出的人工智能代码自动补全AI工具&#xff0c;它可以帮助程序员更快、更准确地编写代码。Copilot 的核心技术基于 GPT-3 模型&#xff0c;但是在编码方面是优于GPT-3的&#xff0c;它可以根据程序员输入的上下文和代码提示&#xff0c;自动生成符合语…

微信小程序如何自定义导航栏,怎么确定导航栏及状态栏的高度?导航栏被刘海、信号图标给覆盖了怎么办?

声明&#xff1a;本文为了演示效果&#xff0c;颜色采用的比较显眼&#xff0c;可根据实际情况修改颜色 问题描述 当我们在JSON中将navigationStyle设置成custom后&#xff0c;当前页面的顶部导航栏就需要我们制作了&#xff0c;但出现了一下几个问题&#xff1a; 导航栏的高…

51-12 多模态论文串讲—BLIP 论文精读

视觉语言预训练VLP模型最近在各种多模态下游任务上获得了巨大的成功&#xff0c;目前还有两个主要局限性: (1) 模型角度: 大多数方法要么采用encoder模型&#xff0c;要么采用encoder-decoder模型。然而&#xff0c;基于编码器的模型不太容易直接转换到文本生成任务&#xff0…

高德打车引入“红绿灯倒计时”能力,算力技术升级打车体验

打到的车还有多久能到&#xff1f;接驾车辆原地不动是什么原因&#xff1f;乘客在打车时&#xff0c;常常因为无法了解实时接驾路况&#xff0c;容易出现“等车焦虑”。 如今&#xff0c;高德打车已全面应用“红绿灯倒计时”能力&#xff0c;让乘客在等车时就能掌握接驾路况&am…

在线ai扩图是什么?有什么工具?分享3个好用的工具。

在线ai扩图是什么&#xff1f;有什么工具&#xff1f;分享3个好用的工具。 在当今数字化的时代&#xff0c;图像处理成为了我们日常生活和工作中不可或缺的一部分。有时候&#xff0c;我们需要将图像放大以获取更多的细节&#xff0c;但传统的方法往往会导致图像质量的损失。幸…

阿里云服务器ECS介绍_高性能云服务器_为了无法计算的价值

阿里云高性能云服务器60%单实例最大性能提升&#xff0c;35Gbps内网带宽&#xff0c;网络增强&通用型云服务器、本地SSD型云服务器、大数据型云服务器、GPU异构型云服务器&#xff0c;阿里云百科aliyunbaike.com分享阿里云高性能云服务器&#xff1a; 阿里云高性能云服务器…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…