当前位置: 首页 > news >正文

DOM基础应用

文章目录

    • 1、DOM简介
        • 1、DOM 概念
        • 2、DOM 树
        • 3、DOM操作步骤
        • 4、DOM获取页面元素
          • 1、根据id获取元素
          • 2、根据类名class获取元素
          • 3、根据标签名获取元素
          • 4.根据属性名获取元素
          • 5、H5新增的两个方法
          • 6、系统提供的直接获取的方式
          • 7、通过关系获取
            • 节点和元素的区别:
            • 拓展:
        • 5、节点增删改查
          • bug:
        • 拓展:
          • 1、calc() 函数
          • 2、盒子居中的六种常用方法?

1、DOM简介

1、DOM 概念

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

它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和 www 文档的风格(目前,HTML 和 XML 文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。

DOM 是一 种基于树的 API 文档,它要求在处理过程中整个文档都表示在存储器中。

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

2、DOM 树

在这里插入图片描述

DOM 又称为文档树模型

(1)文档:一个网页可以称为文档,DOM中使用 document 表示

(2)节点:网页中的所有内容都是节点 (标签、属性、文本、注释等),DOM中用 node 表示

(3)元素:网页中的标签,DOM中使用 element 表示

(4)属性:标签的属性

注:DOM 把文档、节点、元素都看作是对象

3、DOM操作步骤

  1. 获取元素;
  2. 给获取的元素绑定事件(如点击事件);
  3. 添加事件处理(什么时机做什么操作)。

4、DOM获取页面元素

我们想要操作页面上的某部分(显示/隐藏,动画),需要先获取到该部分对应的元素,才进行后续操作。

HTML内容,一下获取元素的方式由此为例:

<div class="box1">
        <div id="box2">
            <div class="4">4</div>
        </div>
        <div class="box3">3</div>
    </div>
    <input type="text" name="input1">
1、根据id获取元素

document.getElementById//查找速度最快 传入的是id的名字而不是id选择器,不加#

var box2 = document.getElementById('box2');
console.log(box2);
2、根据类名class获取元素

document.getElementsByClassName

var box1 = document.getElementsByClassName('box1');
console.log(box1);
3、根据标签名获取元素

document.getElementsByTagName

var divs = document.getElementsByTagName('div');
console.log(divs);
4.根据属性名获取元素

document.getElementsByName

var input1 = document.getElementsByName('input1');
console.log(input1);
5、H5新增的两个方法

document.querySelector 获取第一个符合条件的元素
document.querySelectorAll 获取全部符合条件的多个元素

var box1 = document.querySelector('.box1')
console.log(box1);


//获取全部的div
var boxs = document.querySelectorAll('div')
console.log(boxs);


//获取box1的子元素box2
var box2 = document.querySelectorAll('.box1 #box2')
console.log(box2);
6、系统提供的直接获取的方式
document.body  //body标签   最常用
document.forms  //form表单们
document.anchors //a标签们
document.images //图片们
document.links //连接们
document.URL //当前文档的网址  常用于获取网页之后剪切到对象中,进行进一步的操作。

总结

  1. H5的技术虽然好用,但是 document.getElementById() 的查找速度最快,项目对应的效率就高。具体使用哪种方式根据实际情况选择使用。
  2. 如果获取的是一个,没找到则返回null;如果获取多个,找到了返回的是一个类数组,没找到则返回空数组
  3. 整个文档是节点树,标签是元素 。
  4. HTML的父元素是null ,父节点是document。
  5. 以上获取元素的方式只有通过id选择是document.getElementById() Element是没有加s的,很容易理解,id不能重名,有且只有一个,所以如果没有找到,返回null。
7、通过关系获取
节点和元素的区别:

在 HTML DOM (文档对象模型)中,每个部分都是节点

  • 文档本身是文档节点
  • 所有 HTML 元素是元素节点
  • 所有 HTML 属性是属性节点
  • HTML 元素内的文本是文本节点 (包括回车符也是属于文本节点)
  • 注释是注释节点

Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点。

NodeList 对象表示节点列表,比如 HTML 元素的子节点集合。

元素也可以拥有属性。属性是属性节点。

总结:元素是元素节点,是节点中的一种,但元素节点中可以包含很多的节点。

  1. 通过父级获取:父元素和父节点是同一个。

    HTML例外:HTML的父元素是null ,父节点是document。

    var re=document.getElementById("div1").parentElement//父元素
    var re=document.getElementById("div1").parentNode//父节点
    
  2. 通过子级获取:子元素和子节点不一定是同一个。

    var son1=document.getElementById("box1").children//返回值是子元素们 没有返回空数组
    console.log(son1)
    var son1=document.getElementById("box1").childNodes //返回值是子节点们 没有返回空数组 包括text 空格 换行等节点
    console.log(son1)
    
  3. 通过兄弟节点获取

    var re = document.getElementById("box4").nextSibling//下一个兄弟节点 没有返回null
    console.log(re)
    var re = document.getElementById("box2").nextElementSibling//下一个兄弟元素 没有返回null
    console.log(re)
    var re=document.getElementById("box3").previousSibling//上一个兄弟节点 没有返回null
    console.log(re)
    var re=document.getElementById("box3").previousElementSibling //上一个兄弟元素 没有返回null
    console.log(re)			
    
    
  4. 第一个子节点

    var son1=document.getElementById("box1").firstChild   //第一个子节点 
    var son2=document.getElementById("box1").firstElementChild  //第一个子元素
    console.log(son1,son2)
    
    
    //或者通过所有子节点|子元素的下标获取
    fa.children[0]
    fa.childNodes[0]
    
  5. 最后一个子节点

    var son1=document.getElementById("box1").lastChild   //最后一个子节点
    var son2=document.getElementById("box1").lastElementChild  //最后一个子元素
    
拓展:
  • 获取自己是父元素中的第几个子元素/节点

官方没有提供,需要自己实现这个方法:调用者是父元素中的第几个元素 .index()

 Object.prototype.index2=function() {
 	var arr=this.parentElement.children//或者childNodes
 	for (let i = 0;i<arr.length;i++) {
 		if(this==arr[i]){
 			return i
			}
 	}
 }
  • 父元素中的第几个子元素/节点
var son1=document.getElementById("box1").children[1]//第二个子元素
var son2=document.getElementById("box1").childNodes[1]//第二个子节点

5、节点增删改查

  1. 获取节点: document.querySelect( )

    • 创建节点:document.createElement(‘div’) //不会渲染到页面上,因为他不在DOM中。

    • 添加到文档树中:x.appendChild( y) 把创建的节点对象y,添加到获取到x节点中。

    • 增加多个类名:box.classList.add(‘类名1’) box.classList.add(‘类名2’) ==>

    • 删除类名:box.classList.remove(‘类名’)

    var box=document.querySelector('div');
    
    <div class='类名1 类名2'> </div>
    
    bug:
    box2.appendChild(box3);
    box2.innerHTML='66666'
    

    同时在box2中加入节点,和文本,会只添加6666,因为他认为innerHTML 是在写代码,就会忽略外面的操作。

    解决方案:?????

    1. 创建一个元素,把6666作为他的innerHTML,然后把他添加到box2中
    2. 模板字符串拼接:box2.innerHTML +=‘6666’
    1. 通过父节点删除子节点

      var box=document.querySelector('#box');
      box.parentElement.removeChild(box); 
      
    2. 自己移除

      box.remove()
      
    3. 清空自己 : 把innerHTML设置为空

      box.parentElement.innerHTML='';
      
  2. 插入数据 插入到当前节点之前 insertBefore( )

    官方没有提供insertAfter 插入到后面这个函数,只有自己封装实现该功能。

    <div class="fa">点我
        <div class="sn">
    
        </div>
    </div>
    
    var box=document.querySelector('.box');
    var a1=document.createElement('h1');
    box.innertBefore(a1,box2);
    
  3. 克隆

    var box=document.querySelector('#box');
    var box2=box.cloneNode();//里面填true:连同box的后代元素和事件一起
    box.appendChild(box2);
    

    注意:页面上已经存在的引用对象克隆之后不会产生新的,只是移了位置。????

JSON:js一种格式的字符串

拓展:

1、calc() 函数

1.定义

calc() 函数用于动态计算长度值。

2.用法

需要注意的是,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);
任何长度值都可以使用calc()函数进行计算;
calc()函数支持 “+”, “-”, “*”, “/” 运算;
calc()函数使用标准的数学运算优先级规则;

2、盒子居中的六种常用方法?
  1. 绝对定位加margin:auto;

    position: absolute;
    top:0;
    right:0;
    bottom:0;
    left:0;
    margin:auto;
    
  2. 绝对定位+ 负margin

    position: absolute;
    top:50%;
    left:50%;
    margin:-/2 -/2;
    
  3. 绝对定位配合calc()计算方法

    position: absolute;
    top:calc(50%-/2);
    left:calc(50%-/2);
    
  4. 绝对定位配合+位移

    position: absolute;
    top:50%;
    left:50%;
    transform: translate(-50%,-50%)
    
  5. 弹性盒子布局(flex布局)

    display: flex;
    justify-content: center;
    align-items: center;
    
  6. grid布局

    display: grid;
    align-self: center;
    justify-self: center;
    
  7. 将小div转成inline-block

    <style>
        .box{
            width: 600px;
            height: 600px;
            background-color: blue;
            text-align: center;  /*!*/
            line-height: 600px;  /*!*/
        }
        .a1{
            width: 100px;
            height: 100px;
            background-color: black;
            display: inline-block;   /*!*/
            vertical-align: middle;  /*!*/
        }
    </style>
    
    <div class="box">
        <div class="a1"></div>
        <span></span>
    </div>
    

相关文章:

  • 足疗APP
  • 一张图进阶 RocketMQ - 消息存储
  • kafka生产者如何提高吞吐量
  • 基于神经网络的智能系统,神经元网络控制的作用
  • npm——整理前端包管理工具(cnpm、yarn、pnpm)
  • 基于Vue+Element UI+Node+MongoDB的医院门诊预约挂号系统
  • Linux系统中使用vim编写C语言代码实现过程
  • Spire.Cloud 私有化部署教程(三) - Windows 系统
  • c++面试题总结
  • qlib因子分析之alphalens源码解读
  • springboot企业人力资源管理系统毕业设计源码291816
  • cadence SPB17.4 - allegro - 手工放置过孔
  • ElasticSearch (ES)学习之路(六)Springboot2.3.1整合ES 7.6.1
  • 人类历史上第一个人工神经元模型为mp模型有何不提出
  • 独角兽资深架构师用7大部分13章节,彻底讲透SpringBoot生态体系
  • 【RocksDB】TransactionDB源码分析
  • css选择器
  • JS 面试题总结
  • k个最大的数及变种小结
  • Python学习笔记 字符串拼接
  • python学习笔记-类对象的信息
  • Spring Cloud Feign的两种使用姿势
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 后端_ThinkPHP5
  • 回流、重绘及其优化
  • 基于组件的设计工作流与界面抽象
  • 简单基于spring的redis配置(单机和集群模式)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 配置 PM2 实现代码自动发布
  • 如何合理的规划jvm性能调优
  • 使用 @font-face
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #{}和${}的区别是什么 -- java面试
  • #QT项目实战(天气预报)
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (2022 CVPR) Unbiased Teacher v2
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (Python第六天)文件处理
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)【Hibernate总结系列】使用举例
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net Signalr 使用笔记
  • .Net多线程总结
  • /run/containerd/containerd.sock connect: connection refused
  • @Autowired @Resource @Qualifier的区别
  • @Transactional 竟也能解决分布式事务?
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [04] Android逐帧动画(一)
  • [2016.7.Test1] T1 三进制异或
  • [AAuto]给百宝箱增加娱乐功能