dom常用操作全后续会补充

DOM 操作

获取dom元素

两类标签,非常规标签,常规标签
1. 非常规标签
{
    html
        => doucument.documentElement
    head
        => doucument.head
    body
        => doucument.body
}
2. 常规标签
{
    不是不能获取,而是一般不用
    1. document.getElementById();
    查找范围.getElementById("id名称");
    查找范围:doucument 或者一个元素
    返回值:
        如果有这个id 匹配的元素,就是这个元素
        如果没有这个id 匹配的元素,就是null
    2. doucument.getElementsByTagName()
    查找范围.getElementsByTageName("标签名")
    返回值 
        是一个伪数组(数组常用方法用不了)
        如果有这个标签名匹配的元素,有多少获取多少
        如果没有这个标签匹配的元素,返回一个空的伪数组
    3. document.getElementsByClassName("类名");
    查找范围:getElementsByClassName();
    返回值:
        是一个伪数组(数组常用方法用不了)
        如果有这个类名匹配的元素,有多少获取多少
        如果没有这个类名匹配的元素,返回一个空的伪数组
    4. document.getElementsByName("元素name属性的值")
    查找范围.getElementsByName()
    返回值:
        是一个伪数组(数组常用方法用不了)
        如果有这个name匹配的元素,有多少获取多少
        如果没有这个name匹配的元素,返回一个空的伪数组
    5. document.querySelector("选择器")
    查找范围.querySelector()
    返回值:
        如果找到选择器匹配的元素,返回第一个找到的内容
        如果没有找到选择器匹配的元素,返回null
    6. document.qureySelectorAll("选择器")
    查找范围.querySelectorAll()
    返回值:
        如果找到选择器匹配的元素,有多少获取多少
        如果没有找到选择器匹配的元素,返回一个空的伪数组
}

操作元素属性

+ js语法操作标签上的三种属性
    1. 原生属性
    2. 自定义属性
    3. H5 自定义属性
+ 原生属性
    语法:元素.属性名
        => 读 元素.属性名
        => 写 元素.属性名 = '值'
    注意:class除外,操作 类名使用 元素.className
+ 自定义属性
    语法:不能直接点语法操作
    三个方法
        1. setAttrubute('属性名', '属性值')
            => 给元素标签上设置属性
        2. getAttribute('属性名')
            => 获取元素上的值
        3. removeAttribute('属性名')
            => 删除元素上的属性
+ H5 自定义属性 
    每一个元素身上都有一个属性叫做 dataset
    里面包含了H5的自定义属性
        => 里面的key 就是除了 data- 以外的内容
        => value 就是这个属性的值
    操作 H5 的自定义属性
        => 直接在dataset 里面操作就可以
    获取 H5 的自定义属性
        =>元素.dataset.名字
            -> 名字: data-a 使用a就可以了 
    设置 H5 的自定义属性
        => 元素.dataset.名字 = '值'
            -> 名字 这里写a,那么映射在标签上是 data-a
        删除dataset对象的hello成员
            delete div.dataset.hello

操作元素类名

+ 两种方式操作元素类名
1. 按照原生属性来操作类名
    => 设置类名 
        -> 元素.className= 'box'
    => 修改类名
        -> 元素.className = '新值'
    => 追加类名
        -> 元素.className = 元素.className + ' 新类名'
        -> 注意,需要添加一个空格
    => 删除类名 比较麻烦
        -> 获取类名
        -> 1. 截取字符串
        -> 2. 按照空格切开 循环遍历,删除你想删除的
        -> 3. 再写一遍
2. H5 标准提供给我们的API
    => 元素身上有一个属性叫做classList
    => 添加类名: add() 
       -> 元素.classList.add("你要添加的类名"); 
    => 移除类名: remove() 
       -> 元素.classList.remove("你要移除的类名"); 
    => 切换的类名: toggle() 
       -> 元素.classList.toggle("你要切换的类名"); 
       -> 当元素有这个类名的时候,就删除
       -> 当元素没有这个类名的时候,就添加

操作元素文本内容

+ 三种
    1. innerHTML
        => 一个读写的属性
        => 操作元素的超文本内容
        => 读 获取元素内部的所有内容
            ->  语法 元素.innerHTML
        => 写 设置元素内部的超文本内容
            -> 完全覆盖式的写
            -> 元素.innerHTML = ""
            -> 字符串为浏览器html结构,自动解析
    2. innerText
        => 一个读写的属性
        => 操作元素的超文本内容
        => 读 获取元素内部的所有文本内容
            -> 语法 元素.innerText
            -> 包括子元素所有后代元素里面的文本内容
            -> 标签内容不获取
        => 写 设置元素的超文本内容
            -> 完全覆盖式的写
            -> 元素.innerText = "你要写的内容"
            -> 字符串为浏览器html结构, 不会解析,原样输出
    3. value
        => 一个读写的属性
        => 操作表单的vale值
        => 读 获取元素内部的所有文本内容
            -> 语法 元素.value
        => 写 设置表单的vale值
            -> 元素.innerText = "你要设置的值"

获取元素的样式

1. style 的方式
    => 利用原生属性的方式
    => 元素.style
    => 获取到的内容是一个对象,里面包含元所有可是设置的样式
    => 你想获取哪一个样式的值,就从对象里面获取就可以 
2. 获取非行内样式    
    2-1. window.getComputedStyle() 方法
        => 标准浏览器
        => 语法 window.getComputedStyle(要获取样式的元素)
        => 返回值: 一个对象,里面包含所有可设置样式,每一个样式都有值,你不设置的有默认值
        => 你需要哪一个样式,直接在对象里访问就可以了
    2-2. currentStyle 属性  
        => IE低版本
        => 语法 要获取样式的元素.currentStyle
        => 得到的就是一个对象,里面包含元素的所有可设置样式
        => 你需要哪一个样式,直接咋对象里面查找就可以了
  说明: 
    + 当你获取样式的时候
    + 若果使用.点语法
        -> 你获取带有中划线的样式要转化成驼峰的样式
    + 如果使用 数组关联语法,
        -> 你可以写 中划线
  兼容 段落运算符:
    + 什么情况下用短路表达式兼容
        => 方法或属性执行没有问题,只是拿不到值的时候
    + 前提 你的代码执行不报错
    这里的兼容,自己封装一个函数
3. 设置元素的样式
    + 只有一种方式
        => 设置元素的行内样式
        => 前端JS理论上是不可以设置元素的非行内样式的
            -> 要修改非行内样式
            -> 需要修改html文件或者css文件的
            -> 前端js不能操作电脑上的文件
    + 设置行内样式
        语法 元素.style.样式名 = 值
// 标准浏览器
var style = window.getComputedStyle(div);
console.log(style.backgroundColor);
console.log(style['background-color']);
// IE低版本
var style2 = div.currentStyle;
console.log(style.width)
console.log(style.height)
// 自己封装一个函数去兼容
    1. 准备一个函数接收几个参数
        => 获取什么样式的元素
        => 要获取什么样式
    2. 函数内部处理兼容
        => 报错原因
        => window.getComputedStyle()
            -> IE 报错,对象不支持 getComputedStyle()
            -> 谷歌报错,window.getComputedStyle is not a function
        => 判断 getComputedStyle是不是在window里面
    function getStyle(ele, style){
        // 标准浏览器
        if('getComputedStyle' in window){
            return window.getComputedStyle(ele)[style];
        }else{
            // IE 低版本浏览器
            return ele.currentStyle[style];
        }
    }

了解bom节点

+ 我们页面市有一个一个节点组成
+ 页面的每一个组成部分都是一个节点
    1. document
        => 一个页面中最大的节点
        => 承载所有的节点容器
        => 根节点
    2. html
        => 一个页面中最大的元素节点
        => 承载所有其他节点
        => 根元素节点
    3. 元素节点
        => head / body / div / ul / table..
        => 只是不同的标签子啊页面中的表现形式不一样
        => 特点 是页面的标签
    4. 文本节点
        => 每段文本内容都是一个文本节点
        => 包含换行 空格
        =>  一般作为元素节点的子节点存在,用来表示该元素节点在页面上显示的内容
    5. 属性节点
        => 注意 属性系欸但不作为独立节点出现 必须依赖元素
        => 因为没有元素,属性节点就是文本
    6. 注释节点
        => 作为独立节点出现
        => 作为说明文本使用
节点操作
    + 操作元素
    + 操作 注释节点 文本节点 属性节点
    + 获取节点
        => 获取节点 包含不限于元素节点
    + 创建节点
        => 通过JS的语法来制造一个标签 文本 注释 ... 
    + 插入节点
        => 把我创造的一个节点插入到另一个节点中 出现了父子结构
    + 删除节点
        => 把一个已经存在的节点移出
    + 替换节点
        => 我创造一个节点替换一个以经存在的节点
    + 克隆节点
        => 把一个以经存在的节点复制一份一摸一样的

获取节点的属性

1. childNodes
    + 语法:元素.childNodes
    + 得到:元素的所有子节点(伪数组)
2. children
    + 语法:元素.children
    + 得到:元素的所有 子元素节点(伪数组)
3. firstChild
    + 语法:元素.firstChild
    + 得到:元素的第一个节点
4. firstElementChild
    + 语法:元素.firstElementChild
    + 得到:元素的第一个 子元素节点
5. lastChild
    + 语法:元素.lastChild
    + 得到:元素的最后一个 子节点
6. lastElementChild
    + 语法:元素.lastElementChild
    + 得到:元素的最后一个 子元素节点

7. previousSibling 
    + 语法:元素.previousSibling
    + 得到:元素的上一个 兄弟节点(哥哥节点)
8. previousElementSibling 
    + 语法:元素.previousElementSibling
    + 得到:元素的上一个 兄弟元素节点(哥哥元素)
9. nextSibling
    + 语法:元素.nextSibling
    + 得到:元素的下一个 兄弟节点(弟弟节点)
10. nextElementSibling 
    + 语法:元素.nextElementSibling
    + 得到:元素的下一个 兄弟元素节点(弟弟元素)

11. parentNode
    + 语法:元素.parentNode
    + 得到:元素的 父节点
    + 大部分是元素,有特殊的 document
12. parentElement
    + 语法:元素.parentElement
    + 得到:元素的 父元素
    + 大部分是元素,有特殊的 document
13. attributes
    + 语法:元素.attributes
    + 得到:元素的所有 属性节点

节点属性

+ 属性节点
    => 元素身上放的属性
    => 每一个属性是一个节点
+ 节点属性
    => 用来描述这个节点信息
    => 不同节点有相同的属性名,但是值不一样
    => 例子:
        -> 元素节点: 编号 001
        -> 属性节点: 编号 002
+ 节点属性有三个
    1. nodeType
        => 以数字的形式来表示一个节点类型
        => 一种节点编号
        => 元素节点:1
        => 属性节点:2
        => 文本节点:3
        => 注释节点:8
    2. nodeName
        => 节点的名称
        => 元素节点 : 大写标签名(全大写)
        => 属性节点 : 属性名
        => 文本节点 : 所有文本节点叫做#test
        => 注释节点 : 所有注释节点全部叫做 #comment
    3. nodeValue
        => 节点的值
        => 元素节点 null
        => 属性节点 属性值
        => 文本节点 文本内容(包含换行和空格)
        => 注释节点 注释内容(包含换行和空格)

创建节点

1. 创建标签节点
    + createElement()
    + 语法:document.createElement('标签名')
2. 创建文本节点
    + createTextNode()
    + document.createTextNode("文本内容")
    返回值:一个文本节点,不是字符串
3. createComment()
    + 语法:document.createComment("注释内容");
    + 返回值:一个注释节点
4. createAttribute()
    + document.createAttribute("属性名")
    + 添加属性值, 节点.value = "属性值"
    + 返回值 : 一个属性节点

插入节点

+ 把一个节点插入到另一个节点里面
1. appendChild()
    语法:父节点.appendChild(子节点)
    作用:把子节点插入到父节点里面,放在最后一个节点位置
2. innsertBefore()
    语法:父节点.innserBefore(要插入的子节点,哪一个子节点前面)
    作用:把子节点插入到指定父节点的子节点前面

删除节点

+ 删除一个已经存在的节点
+ 可以在创建的节点里面删除,也可以直接在页面元素里面删除
1. removeChild()
    + 语法:父节点.removeChild(子节点)
    + 作用:把子节点从父结点里面移除
2. reove()
    + 语法:节点.remove()
    + 作用:把自己移出父节点

替换节点

+ 用一个节点替换一个以经存在的节点
+ 可以直接替换页面元素,也可以直接替换我们自己创建的节点
1. replaceChild()
    + 语法:父节点.replaceChild(新节点,旧节点)
    + 作用:字符节点下,用新节点替换旧节点

克隆节点

+ 把谋一份节点复制一份一模一样的
1.cloneNode()
    + 语法:节点.cloneNode(参数)
        -> 参数选填,默认值是 false 不克隆后代节点
        -> 我们可以选填true 克隆所有子节点
    + 作用:一个克隆好的节点

获取元素的尺寸

+ 元素的尺寸
+ 占地面积 内容区域 + padding + border
两组方式:
    1. offsetWidth 和 offsetHeight
        + 语法:
            -> 元素.offsetWidth
            -> 元素.offsetHeight
        + 得到:
            -> 元素的内容 + padding + border 区域的尺寸
        + 注意:
            -> display 是0
    2. clientWidth 和 clientHeight
        + 语法:
            -> 元素.clientWidth
            -> 元素.clientHeight
        + 得到:
            -> 元素的 内容 + padding 区域的尺寸
        + 注意:
            -> display 是0

获取元素的偏移量

一个元素相对于参考系的坐标
1. offsetParent
    + 语法:元素.offsetParent
    + 作用:拿到该元素获取偏移量的时候的参考父级
        => 当你给这个元素设置一个绝对定位的时候,它会根据谁来定位,他的offsetParent 就是谁
2. offsetLeft 和 offsetTop
    + 语法:
        -> 元素.offsetLeft
        -> 元素.offsetTop
    + 得到:
        -> 元素相对于参考父级的左边和上边的偏移量

获取浏览器尺寸

+ BOM 级别的获取
    => innerWidth
    => innerHeight
    => 拿到的时包含滚动条的尺寸
+ DOM 级别的获取
    => 其实是获取页面的那一部分尺寸
    => document.documentElement.clientWidth
    => document.documentElement.clientHeight

元素的常用事件

+ JS 里面, 事件分为几个大类
    1. 鼠标事件
        1.1 click =>鼠标左键单击
        1.2 dblclick =>鼠标左键双击
        1.3 contextmenu =>鼠标右键单击
        1.4 mousewhell =>鼠标滚动事件
        1.5 mousedown =>鼠标按下事件
          左键,右键,滚轮,功能键都能触发
        1.6 mouseup =>鼠标抬起事件
        1.7 mousemove =>鼠标移动事件
        1.8 mouseover =>鼠标移入事件
        1.9 mouseout =>鼠标移出事件
        1.10 mouseenter =>鼠标移入事件
        1.11 mouseleave =>鼠标移出事件
    2. 键盘事件
        + 不是所有元素都能触发
        + 表单元素又选中效果,documetn, window
        1. keydown => 键盘按下
        2. keyup   => 键盘抬起
        3. keypress=> 键盘按下
          必须要准确的嵌入到文本框里面的内容才会触发
    3. 浏览器事件
        3.1 load   => 页面加载完毕
        3.2 scroll => 滚动
        3.3 resize => 窗口尺寸改变
        3.4 offline=> 网络断开
        3.5 online => 网络恢复
        3.6 hashchange => 当哈希值改变了
    4. 表单事件
        表单事件绑定给 表单元素 和form 标签的
        4.1 change => 表单内容改变
            表单失焦和聚焦不一样才会触发
        4.2 input => 表单内部输入内容就会触发
            只要你在里面写就触发
        4.3 focus => 表单聚焦事件
        4.4 blur => 表单失焦事件
        4.5 submit => 表单提交事件
            绑定给form标签使用的的
            当你点击form里的submit的时候触发
        4.6 reset => 表单重置事件
            -> 事件是绑定给form标签使用的
            -> 当你点击 reset 按钮才能触发
    5. 拖拽事件
        一般元素想发生拖拽事件,要给元素加一个属性
        draggable='true';
        需要两个元素才能完成一个完整的拖拽
        5.1 dragstart => 拖拽开始
            绑定给拖拽元素的
        5.2 drag => 拖拽移动
            绑定给拖拽元素
        5.3 ragend => 拖拽结束
            绑定给拖拽元素
        5.4 dragenter => 拖拽进入目标元素
            绑定给目标元素的
            光标进入到目标元素
        5.5 dragleave => 拖拽离开目标元素
            绑定给目标元素的
        5.6 dragover => 拖拽元素在目标元素里移动
        5.7 drop => 拖拽元素在目标元素内放手
            绑定给目标元素的
            必须要在dragover 事件里阻止默认行为
    6. 触摸事件 
        只能在移动端使用
        6.1 touchstart => 触摸开始
        6.2 touchmove => 触摸移动
        6.3 touchend => 触摸结束
    7. 其他事件
        7.1 transitionend => 过度结束
        当你有过度属性的时候
        过度结束触发,你过度几属性,触发几次
        7.2 selectstart 开始选择
        当你想在页面中框选文档的时候触发
        7.3 visiblitychange => 窗口隐藏和显示
        只绑定给document
+ JS 里面原生事件没有大写字母
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值