Web前端-JavaScript(Dom基础)

文章目录

    • 1.1 DOM 介绍
      • 1.1.1 DOM简介
      • 1.1.2 DOM树
    • 1.2. 获取元素
      • 1.2.1 根据ID获取元素
      • 1.2.2 根据标签名获取元素
      • 1.2.3 其它方式获取元素
      • 1.2.4 获取特殊元素
    • 1.3 事件基础
      • 1.3.1 事件概述
      • 1.3.2 事件三要素
      • 1.3.3 执行事件步骤
      • 1.3.4 鼠标事件
    • 1.4 操作元素
      • 1.4.1 操作元素内容
      • 1.4.2 属性操作
      • 1.4.3 表单元素属性操作
      • 1.4.4 案例一
      • 1.4.5 样式属性操作
      • 1.4.6 案例二
      • 1.4.7 案例三
    • 1.5 排他操作

1.1 DOM 介绍

1.1.1 DOM简介

​ 文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言的标准编程接口。

​ W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式。

DOM是W3C组织制定的一套处理 html和xml文档的规范,所有的浏览器都遵循了这套标准。

1.1.2 DOM树

image-20230226205243536

DOM树 又称为文档树模型,把文档映射成树形结构,通过节点对象对其处理,处理的结果可以加入到当前的页面

  • 文档:一个页面就是一个文档,表示的是整个 html文档,DOM中使用document表示
  • 节点:网页中的所有内容,在文档树中都是节点(标签、属性、文本、注释等),用node表示
  • 标签节点:表示的是 html 中的标签,又叫元素节点,简称元素,用element表示
  • 属性节点,表示的是 html 标签中的属性
  • 文本节点,表示的是 html 标签中的内容文本
  • 注释节点,表示的是 html 文档中的注释
  • DOM把以上内容都看做是对象

1.2. 获取元素

  • 为什么要获取页面元素
    • 因为要操作页面上的元素

1.2.1 根据ID获取元素

  1. 语法:document.getElementById(id)
  2. 作用:根据ID获取元素对象
  3. 参数:id值,区分大小写的字符串
  4. 返回值:元素对象 或 null

案例代码

<body>
  <div id="time">2019-9-9</div>
</body>
<script>
  var timer = document.getElementById('time');
  console.log(timer);//<div id="time">2019-9-9</div>
  console.log(typeof timer);//object
  console.dir(timer);//返回对象中属性和方法
</script>

1.2.2 根据标签名获取元素

  1. 语法:document.getElementsByTagName(‘标签名’)
  2. 作用:根据标签名获取元素对象
  3. 参数:标签名
  4. 返回值:元素对象集合(伪数组,数组元素是元素对象)

案例代码

<body>
  <ul>
    <li>知否知否,应是等你好久11</li>
    <li>知否知否,应是等你好久12</li>
    <li>知否知否,应是等你好久13</li>
  </ul>
  <ol id="ol">
    <li>生僻字1</li>
    <li>生僻字2</li>
    <li>生僻字3</li>
  </ol>
  
  <script>
    //会获取页面所有的li标签
    var lis = document.getElementsByTagName('li');
    console.log(lis);//返回的是一个伪数组
    console.log(lis[7]);

    var ol = document.getElementById('ol');
    var li = ol.getElementsByTagName('li');
    console.log(li);
    for (var i = 0; i < li.length; i++) {
      console.log(li[i].innerText);
    }
  </script>
</body>

1.2.3 其它方式获取元素

  1. 根据类名返回元素对象集合:document.getElementsByClassName(‘类名’);

  2. 根据指定选择器返回第一个元素对象:document.querySelector(‘选择器’);

  3. 根据指定选择器返回:document.querySelectorAll(‘选择器’);

    注意:querySelector和querySelectorAll选择器需要加符号,如:document.querySelector(‘#id’)

案例代码

<body>
  <div class="box">盒子1</div>
  <div class="box">盒子2</div>

  <div id="nav">
    <ul>
      <li>首页</li>
      <li>产品</li>
    </ul>
  </div>

  <script>
    // 1. getElementsByClassName 根据类名获得某些元素集合
    var boxs = document.getElementsByClassName('box');
    console.log(boxs);

    // 2. querySelector 返回指定选择器的第一个元素对象
    var firstBox = document.querySelector('.box');
    console.log(firstBox);
    var nav = document.querySelector('#nav');
    console.log(nav);
    var li = document.querySelector('li');
    console.log(li);

    // // 3. querySelectorAll()返回指定选择器的所有元素对象集合
    var allBox = document.querySelectorAll('.box');
    console.log(allBox);
    var lis = document.querySelectorAll('li');
    console.log(lis);
  </script>
</body>

1.2.4 获取特殊元素

  1. 获取body元素:document.body

  2. 获取html元素:document.documentElement

    <body>
      <script>
      
        // 获取body;
        console.log(document.body);
        console.dir(document.body);
    
        // 获取根元素
        console.log(document.documentElement);
      </script>
    </body>
    

1.3 事件基础

1.3.1 事件概述

  1. 事件是可以被 JavaScript 侦测到的行为。
  2. 例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。

1.3.2 事件三要素

  • 事件源(谁):触发事件的元素
  • 事件类型(什么事件): 例如 click 点击事件
  • 事件处理程序(做啥):事件触发后要执行的代码(函数形式),事件处理函数

案例代码

<body>
  <button id="btn">唐伯虎</button>
  <script>
    var btn = document.getElementById('btn');
    
    btn.onclick = function () {
      alert('点秋香');
    };
  </script>
</body>

1.3.3 执行事件步骤

  1. 获取事件源
  2. 注册事件
  3. 添加事件处理程序 (函数)
<body>
  <div class="box"></div>
  
  <script>
    //1.获取事件源
    var box = document.querySelector('.box');
    
    //2.注册事件
    //box.onclick
    
    //3.添加事件处理程序
    box.onclick = function () {
      alert('未来可期');
    }
  </script>
</body>

1.3.4 鼠标事件

鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onmousemove鼠标点击移动触发
onmouseup鼠标抬起触发
onmousedown鼠标按下触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
<body>
  <div class="box"></div>
  <input type="text">登入
  <script>
    var box = document.querySelector('.box');
    box.onclick = function () {
      console.log("onclick");
    }
    box.onmouseover = function () {
      console.log("onmouseover");
    }
    box.onmouseout = function () {
      console.log("onmouseout");
    }
    box.onmousemove = function () {
      console.log("onmousemove");
    }
    box.onmouseup = function () {
      console.log("onmouseup");
    }
    box.onmousedown = function () {
      console.log("onmousedown");
    }
    
    var input = document.querySelector('input');
    input.onfocus = function () {
      console.log("onfocus");
    }
    input.onblur = function () {
      console.log("onblur");
    }
  </script>
</body>

1.4 操作元素

操作元素来改变元素里面的内容、属性等。

1.4.1 操作元素内容

  1. element.innerText:从起始位置到终止位置的内容,会去除html标签,同是空格和换行也会去掉
  2. element.innerHTML:从起始位置到终止位置的全部内容,包括html标签,同是保留空格和换行
<body>
  <p>
    我是文字
  </p>

  <script>
    var p = document.getElementsByTagName('p')
    console.log(p[0].innerText)
    p[0].innerText = '我是p标签'
    console.log(p[0].innerText)
  </script>
</body>

innerText和innerHTML的区别

  1. 获取内容时的区别:
    1. innerText会去除空格和换行,而innerHTML会保留空格和换行
  2. 设置内容时的区别:
    1. innerText不会识别html,而innerHTML会识别
<body>
  <button>按钮</button>
  <p><span>我是一段文字,我很好看!</span></p>
  <script>
    var btn = document.getElementsByTagName('button');
    var p = document.getElementsByTagName('p');

    btn[0].onclick = function () {
      console.log(p[0].innerText);
      console.log(p[0].innerHTML);
      p[0].innerHTML = '<h1>我很好看!</h1>';
      // p[0].innerText = '<h1>我很好看!</h1>';
      console.log(p[0].innerText);
      console.log(p[0].innerHTML);

    };
  </script>
</body>

显示当前时间练习

<head>
  <meta charset="UTF-8" />
  <title>Document</title>
  <style>
    div,
    p {
      width: 300px;
      height: 30px;
      line-height: 30px;
      color: #fff;
      background-color: pink;
    }
  </style>
</head>

<body>
  <button>显示当前系统时间</button>
  <p>点击时候显示当前时间</p>
  <script>

    var btn = document.getElementsByTagName('button');
    var p = document.getElementsByTagName('p');
 		var div = document.getElementById('div');
		div.innerText = getTime();
    
    
    btn[0].onclick = function () {
      p[0].innerText = getTime();
    }

    function getTime() {
      var date = new Date();
      var year = date.getFullYear();
      var month = date.getMonth() + 1;
      var day = date.getDate();
      var time = "当前时间是" + year + '年' + month + "月" + day + "日"
      return time
    }
  </script>
</body>

</html>

1.4.2 属性操作

  1. src
  2. href
  3. id
  4. alt
  5. title

语法:

  1. 获取属性值

    元素对象.属性名

  2. 设置属性值

    元素对象.属性名 = 值

<body>
  <img src="images/s.gif" alt="图片丢失了" title="这是图片" />
  <div>
    <a href="http://www.baidu.com">上午好</a>
  </div>
  <script>
    // 1.获取事件源
    var img = document.querySelector('img');
    var a = document.querySelector('a');
    console.log(img.src);
    console.log(img.alt);
    console.log(img.title);
    console.log(a.href);

    img.src = 'images/x.gif';
    img.alt = '图片丢失了1';
    img.title = '这是图片1';
    a.href = 'http://www.163.com';
    a.innerText = '下午好!';
  </script>
</body>

1.4.3 表单元素属性操作

  1. type
  2. value
  3. checked
  4. selected
  5. disabled

语法:

  1. 获取属性的值
    1. 元素对象.属性名
  2. 设置属性的值
    1. 元素对象.属性名 = 值
    2. 表单元素中有一些属性如:disabled、checked、selected,这些属性值是布尔类型
<body>
  <input type="checkbox" value="1234" checked>
  <select>
    <option value="1" disabled>上海</option>
    <option value="2" selected>深圳</option>
  </select>

  <script>
    var input = document.querySelector('input');
    console.log(input.type);
    console.log(input.value);
    console.log(input.checked);

    var option = document.querySelectorAll('option');
    console.log(option[0].disabled);
    console.log(option[1].value);
    console.log(option[1].selected);

  </script>
</body>

1.4.4 案例一

仿京东显示隐藏密码

image-20230226205328582

核心思路:

  1. 点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
  2. 一个按钮2个状态,点击一次,切换为文本框,在点击一次切换为密码框
  3. 可以利用一个flag变量,判断flag的值,
    1. 如果是true就切换为文本框,flag设置为false
    2. 如果是false就切换为密码框,flag设置为true
<head>
  <meta charset="UTF-8" />
  <title>Document</title>
  <style>
    .box {
      position: relative;
      width: 400px;
      border-bottom: 1px solid #ccc;
      margin: 100px auto;
    }

    .box #password {
      width: 370px;
      height: 30px;
      border: 0;
      outline: none;
    }

    .box img {
      position: absolute;
      top: 2px;
      right: 2px;
      width: 24px;
    }
  </style>
</head>

<body>
  <div class="box">
    <img src="images/close.png" id="eye" />
    <input type="password" id="password" />
  </div>

  <script>
    var eye = document.getElementById('eye');
    var password = document.getElementById('password');
    var flag = true;
    eye.onclick = function () {
      if (flag) {
        eye.src = "images/open.png";
        password.type = 'text'
        flag = false
      }
      else {
        eye.src = "images/close.png";
        password.type = 'password'
        flag = true
      }
    }
  </script>
</body>
</html>

1.4.5 样式属性操作

我们可以通过 JS 修改元素的大小、颜色、等样式。

  1. 常用方式

    1. 行内样式操作:element.style
    2. 类名样式操作:element.className
  2. 操作style属性

    1. 语法:元素对象.style.样式属性 = 值;
    <body>
      <div> 我是一个div </div>
    
      <script>
        var div = document.querySelector('div');
        div.style.width = '600px';
        div.style.height = '400px';
        div.style.backgroundColor = 'red';
        div.style.fontSize = Math.random() * 60 + 'px';
        document.body.style.backgroundColor = 'orange';
      </script>
    </body>
    
  3. 操作className属性

    1. 语法:元素对象.className = 值;
    <body>
      <div class="first">文本</div>
      <script>
        var div = document.querySelector('div');
        div.onclick = function () {
          //新类名 会覆盖原来的类名
          div.className = 'change';
          //添加新类名,保留原有类名
          this.className = 'first change';
        }
      </script>
    </body>
    

    注意:

    1. class是个保留字,因此使用className来操作元素类名属性
    2. className会直接更改元素的类名,会覆盖原先类名

1.4.6 案例二

淘宝点击关闭二维码

思路

  1. 利用样式的显示和隐藏完成,display:none 隐藏元素,display: block 显示元素

    image-20230226205544586
<body>
  <div class="box">
    淘宝二维码
    <img src="images/tao.png" />
    <div class="close-btn">×</div>
  </div>

  <script>
    var btn = document.getElementsByClassName('close-btn');
    var img = document.querySelector('.box');

    btn[0].onclick = function () {
      img.style.display = 'none';
    };
  </script>
</body>

1.4.7 案例三

显示隐藏文本框内容:当鼠标点击文本框时,里面默认文字隐藏,当鼠标离开文本框时,里面文字显示。

思路

  1. 需要两个事件,获取鼠标焦点onfocus、失去鼠标焦点onblur

  2. 如果获取焦点,判断表单里面内容是否是默认文字,如果是默认文本,就清空表单内容

  3. 如果失去焦点,判断表单里面内容是否为空,如果是空,则表单内容改为默认文本,

    image-20230226205827477

<body>
  <input type="text" value="手机" id="txt" />
  <script>
    var txt = document.getElementById('txt');
    
    txt.onfocus = function () {
      console.log('获取焦点')
      if (txt.value == '手机') {
        txt.value = '';
        txt.style.color = 'black';
      }
    };
    
    txt.onblur = function () {
      console.log('未获取焦点')
      if (txt.value == '') {
        txt.value = '手机';
        txt.style.color = '#999';
      }
    };
  </script>
</body>

1.5 排他操作

image-20230226205925362

如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:

  1. 所有元素全部清除样式(一定要先 干掉所有人)
  2. 给当前元素设置样式 (最后 复活自己)
<body>
  <button>按钮1</button>
  <button>按钮2</button>
  <button>按钮3</button>
  <button>按钮4</button>
  <button>按钮5</button>
  <script>
    var btns = document.querySelectorAll('button');

    //给每一个按钮注册了点击事件
    for (var i = 0; i < btns.length; i++) {
      btns[i].onclick = function () {

        //1.先将所有的高亮颜色清空   干掉了所有人
        for (var j = 0; j < btns.length; j++) {
          btns[j].style.backgroundColor = '';
        }

        //2.单独给自己添加上高亮效果    复活我自己
        this.style.backgroundColor = 'orange';
      };
    }
    //this 代表当前对象  ---->点击那个按钮,哪个按钮就是this
  </script>
</body>

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

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

相关文章

Java小案例-MusiQ音乐网站

目录 前言 项目功能 技术栈 后端 前端 开发环境 项目展示 前台-首页-展示 前台-首页-代码 前台-歌单-展示 前台-歌单-代码 前台-歌手-展示 前台-歌手-代码 前台-其他页面展示 后台-登录-展示 后台-登录-代码 后台-首页-展示 首台-首页-代码 后台-其他页面-展…

PyQt6 QColorDialog颜色对话框控件

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计50条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

基于Qt之QChart 图表(优美的曲线图案例)

## 项目演示 平台:ubuntu18.04 Qt版本:QT5.14.2 源码位置GitCode:https://gitcode.com/m0_45463480/QCharts/tree/main ## QChart 图表 自从 Qt 发布以来,给跨平台的用户带来很多便利。在 Qt5.7 之前,Qt 在开源社区版本里没有 Qt Charts(自带的绘图组件库)。这使得像…

SpringBoot的日志管理

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

Kubernetes api-server源码阅读2(Debug Kubernetes篇)

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes api-server源码阅读 系列第二篇&#xff0c;主要讲述如何实现 kubernetes api-server 的 debug 参考b站视频地址&#xff1a;Kubernetes源码开发之旅二 1.本篇章任务 Go-Delve&#xff1a;go语言的…

INFINI Gateway 如何防止大跨度查询

背景 业务每天生成一个日期后缀的索引&#xff0c;写入当日数据。 业务查询有时会查询好多天的数据&#xff0c;导致负载告警。 现在想对查询进行限制–只允许查询一天的数据&#xff08;不限定是哪天&#xff09;&#xff0c;如果想查询多天的数据就走申请。 技术分析 在每…

排序算法——桶排序

把数据放进若干个桶&#xff0c;然后在桶里用其他排序&#xff0c;近乎分治思想。从数值的低位到高位依次排序&#xff0c;有几位就排序几次。例如二位数就排两次&#xff0c;三位数就排三次&#xff0c;依次按照个十百...的顺序来排序。 第一次排序&#xff1a;50 12 …

二级指针的作用 -- 将变量从函数中带出

使用一级指针不能将变量带出 void test(int *p) {static int nub 10; /*使用static是保证函数结束, 变量依然存在, 不然即使将它带出来, 函数结束时这片内存已经被释放了就没有意义了*/p &nub; }int main(void) {int *p NULL;test(p);printf("%d",*p);return …

计算机网络-网络层

计算机网络-网络层 以下笔记整理为哔哩哔哩湖科大教书匠的《计算机网络微课堂》的教学视频。 链接&#xff1a;计算机网络微课堂 1. 网络层概述 1.1 网络层的主要任务是实现网络互联&#xff0c;进而实现数据包在各网络之间的传输。 1.2 要实现网络层任务&#xff0c;需要解决…

java中静态修饰符(static)的使用

static-静态 修饰属性 静态属性,也称为静态变量 类变量等 static 数据类型 属性名; 使用 静态内容独立存放在方法区 静态内容在内存中只有一份,被该类所有对象共享 普通属性所有对象在对象内容中都有一份 可以通过类名.静态属性名的方式直接访问静态属性 静态属性封装之…

Milvus数据一致性介绍及选择方法

1、Milvus 时钟机制 Milvus 通过时间戳水印来保障读链路的一致性&#xff0c;如下图所示&#xff0c;在往消息队列插入数据时&#xff0c; Milvus 不光会为这些插入记录打上时间戳&#xff0c;还会不间断地插入同步时间戳&#xff0c;以图中同步时间戳 syncTs1 为例&#xff0…

MySQL 数据库系列课程 04:MySQL Workbench的安装

Workbench 是 MySQL 官方推出的免费的强大的可视化工具&#xff0c;不熟悉命令行工具的人&#xff0c;可以安装这一款软件&#xff0c;通过编写 SQL 进行数据库中数据的增删改查操作&#xff0c;接下来我们详细说明一下 Workbench 的安装。 一、Windows安装Workbench &#x…

postgresql vacuum流程分析

概述 VACUUM是postgresql MVCC机制不可分割的组成部分。 postgresql在管理同一个元组的多个版本时&#xff0c;采取在堆表页面上从老版本到新版本放置元组的方法&#xff0c;每个元组都记录了xmax和xmin用于判断其可见性。这样的好处是&#xff08;1&#xff09;在索引键没有…

HarmonyOS - 基础组件绘制

文章目录 所有组件开发 tipsBlankTextImageTextInputButtonLoadingProgress 本文改编自&#xff1a;<HarmonyOS第一课>从简单的页面开始 https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667360160710997 所有组件 在 macOS 上&#xff0c;组…

设计模式篇---职责链模式

文章目录 概念结构实例总结 概念 职责链模式&#xff1a;避免将一个请求的发送者与接收者耦合在一起&#xff0c;让多个对象都有机会处理请求。将接收请求的对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有一个对象能够处理它为止。 比如大学期间&…

DLLNotFoundException:xxx tolua... 错误打印

DLLNotFoundException:xxx tolua... 错误打印 一、DLLNotFoundException介绍二、Plugins文件夹文件目录结构如下&#xff1a; 三、Plugins中的Android文件夹四、Plugins中的IOS文件夹这里不说了没测试过不过原理应该也是选择对应的平台即可五、Plugins中的x86和X86_64文件夹 一…

C# Onnx Yolov8 Detect yolov8n、yolov8s、yolov8m、yolov8l、yolov8x 对比

目录 效果 yolov8n yolov8s yolov8m yolov8l yolov8x 模型信息 项目 代码 下载 C# Onnx Yolov8 Detect yolov8n、yolov8s、yolov8m、yolov8l、yolov8x 对比 效果 yolov8n yolov8s yolov8m yolov8l yolov8x 模型信息 Model Properties ------------------------- d…

持续集成交付CICD:Jira 远程触发 Jenkins 实现更新 GitLab 分支

目录 一、实验 1.环境 2.GitLab 查看项目 3.Jira新建模块 4. Jira 通过Webhook 触发Jenkins流水线 3.Jira 远程触发 Jenkins 实现更新 GitLab 分支 二、问题 1.Jira 配置网络钩子失败 2. Jira 远程触发Jenkins 报错 一、实验 1.环境 &#xff08;1&#xff09;主机 …

Python算法例26 落单的数Ⅳ

1. 问题描述 给定数组&#xff0c;除了一个数出现一次外&#xff0c;所有数都出现两次&#xff0c;并且所有出现两次的数都挨着&#xff0c;找出出现一次的数。 2. 问题示例 给出nums[3&#xff0c;3&#xff0c;2&#xff0c;2&#xff0c;4&#xff0c;5&#xff0c;5]&am…

HTML---网页布局

目录 文章目录 一.常见的网页布局 二.标准文档流 标准文档流常见标签 三.display属性 四.float属性 总结 一.常见网页布局 二.标准文档流 标准文档流常见标签 标准文档流的组成 块级元素<div>、<p>、<h1>-<h6>、<ul>、<ol>等内联元素<…