js-dom+bom(2)

dom

文档对象模型 (DOM) 将 web 页面与到脚本或编程语言连接起来。通常是指 JavaScript,但将 HTML、SVG 或 XML 文档建模为对象并不是 JavaScript 语言的一部分。DOM 模型用一个逻辑树来表示一个文档,树的每个分支的终点都是一个节点 (node),每个节点都包含着对象 (objects)。DOM 的方法 (methods) 让你可以用特定方式操作这个树,用这些方法你可以改变文档的结构、样式或者内容。节点可以关联上事件处理器,一旦某一事件被触发了,那些事件处理器就会被执行。

Document

Document 接口表示任何在浏览器中载入的网页,并作为网页内容的入口,也就是 DOM 树 (en-US)。

节点

常见节点

1.元素节点 就是我们一个完整的标签 包括里面的属性啊内容啊
2.文本节点 就是纯文字部分
3.属性节点 比如class=‘box’
4.注释节点
5.换行节点 但是换行节点我们一般归类到文本节点里面

节点关系
  • 父节点parentNode
  • 子节点 childNodes
  • 第一个子节点 firstChild
  • 最后一个子节点 lastChild
  • 前一个兄弟节点 previousSibling
  • 后一个兄弟节点 nextSibling
元素节点关系
  • 父元素 parentElement
  • 子元素 children
  • 第一个子元素 firstElemtnChild
  • 最后一个子元素 lastElementChild
  • 上一个兄弟元素 previousElementSibling
  • 下一个兄弟节点 nextElementSibling
获取元素的方法

通过JS获取DOM元素的5种方法:

  • 根据id名获取元素:getElementById;
  • 根据标签名获取元素: getElementsByTagName,返回一个数组;
  • 根据类名获取元素:getElementsByClassName,返回一个数组;
  • 根据name属性值获取元素:getElementsByName,返回一个数组;
  • 根据选择器获取元素:
    querySelector:获取一个元素,推荐使用 用法类似写css;
    querySelectorAll:返回一个元素数组。
判断节点类型 nodeType

对于节点类型来说 给的是数字 每一个数字对应的类型不一样

  • 8 是注释节点
  • 3 是文本节点
  • 1 元素节点
    其他类型可以查看MDN文档: https://developer.mozilla.org/zh-CN/docs/Web/API/Node/nodeType
nodeName 获取节点的名字,tagName 获取元素的标签的名字
innerHTML 和 innerText
  • innerHTML会识别html标签
  • innerText不会识别 会原封不动的展示出来
Node.textContent
  • Node 接口的 textContent 属性表示一个节点及其后代的文本内容。
  • 与 innerText 的区别

不要被 Node.textContent 和 HTMLElement.innerText 的区别搞混了。虽然名字看起来很相似,但有重要的不同之处:

textContent 会获取所有元素的内容,包括 <script><style> 元素,然而 innerText 只展示给人看的元素。
textContent 会返回节点中的每一个元素。相反,innerText CSS 样式的影响,并且不会返回隐藏元素的文本,
此外,由于 innerText 受 CSS 样式的影响,它会触发回流( reflow )去确保是最新的计算样式。(回流在计算上可能会非常昂贵,因此应尽可能避免。)
textContent 不同的是,在 Internet Explorer (小于和等于 11 的版本) 中对 innerText 进行修改, 不仅会移除当前元素的子节点,而且还会永久性地破坏所有后代文本节点。在之后不可能再次将节点再次插入到任何其他元素或同一元素中。

outerHTML属性

element DOM 接口的outerHTML属性获取描述元素(包括其后代)的序列化 HTML 片段。它也可以设置为用从给定字符串解析的节点替换元素。

hidden

hidden属性是控制 元素是否显示(不占位置)

    btn.onclick=function(){
        // 当我原本值为true的时候 我点击要变成false
        // 当我原本值为false的时候 我点击 要变成true
        // if(div.hidden == false){
        //     div.hidden=true
        // }else{
        //     div.hidden=false
        // }
        // 经典代码
        div.hidden = !div.hidden
    }
  隐藏元素的另一种方式
  div.style.display='none'
nodeValue是节点值

对于注释节点来说 拿到的是注释的内容
对于文本节点来说拿到的就是文本的内容
对于非input元素节点来说 是Null

给节点绑定时间

事件源
时间类型
监听器

  • 方法一
    btn.οnclick=function(){
    具体操作}
  • 方法二
    btn.addEventListener(‘click’,function () {
    具体操作
    })
创建节点
// 创建元素节点 createElement
// 创建文本节点 createTextNode
// 创建注释节点 createComment 
// 创建属性节点 createAttribute
挂载节点
// node.append(要插入的元素)  在node的末尾插入节点或者字符串(作为最后一个子元素插入)
// bodyEle.append(div)

// node.prepend(要插入的元素) 在node的开头插入节点或者字符串(作为第一个子元素插入)
// bodyEle.prepend(div)

// node.before(要插入的元素) 在node的前面插入元素(作为兄弟元素插入)
// uls.before(div)

// node.after(要插入的元素) 在node的后面插入元素(作为兄弟元素插入)
// uls.after(div)

// node.replaceWith(要替换的元素) 将node替换成新的元素
删除和替换节点
// removeChild 父元素.removeChild(子元素) 移除子元素
// 这里的父元素和子元素 都得是dom对象

// remove()  元素.remove() 移除自己

// replaceChild  父元素.replaceChild(新元素,旧的要被替换的子元素)
// 用新元素把旧的元素替换掉

// 元素.cloneNode(布尔值) 整体的值是克隆好的元素 这里面的布尔值 如果是true表示深克隆 否则是浅克隆
// 深克隆就是连同子节点一起克隆 浅克隆就是只有标签
属性节点

标准(自带的如class(className)、name等)
非标准(自定义)

属性节点操作
  • attribute方式操作属性节点
    通过方法来操作,常用的方法有如下几个
    getAttribute 获取
    setAttribute 设置
    hasAttribute 查找
    removeAttribute 移除
    可以操作标准属性节点(固有的)和非标准属性节点(自定义的)

  • property方式操作属性节点
    通过打点调用的方式 节点.属性名
    只能操作标准属性节点

  • h5 自定义属性(以data-开头)
    可以直接打点调用

  <div  data-id="0"></div>
  获取 div.dataset.id
className和classlList
  • className属性值是一个字符串 相当于直接把class里面的所有内容都拿了过来
    • 通过className修改样式的时候,就是把类名完全替换掉
  • classList属性值是一个数组 相当于把class中每一个元素都放到了数组中作为元素
    • classList.add()增加
    • classList.remove()移除
    • classList.contains ()检测是否包含
    • classList.toggle()有就移除,没有就添加
通过style修改样式

注意后面属性有-号,改写成小驼峰命名法

元素.style.属性=''
div.style.backgroundColor='red'
getComputedStyle属性
  • 对于内联样式 你可以通过style.的形式 可以拿到
    • var p=document.getElementsByTagName(‘p’)[0];
  • 对于css文件中的或者style标签里面的 你拿不到
    • 可以通过getComputedStyle拿到全局样式
    • 全局的样式 是只读的 不能进行修改

js操作盒子模型

请添加图片描述
请添加图片描述

client系列: width, height, top, left

clientWidth/clientHeight: 获取盒子或页面可视区域的宽高
clientTop:获取盒子的上边框的大小
clientLeft:获取盒子的左边框的大小
offset系列: width, height, top, left, parent

offset系列: width, height, top, left, parent

offsetWidth/offsetHeight: 获取盒子或页面可视区域的宽高+border
offsetTop:获取一个定位元素相对于参考点的上面的距离
offsetLeft:获取一个定位元素相对于参考点的左面的距离
offsetParent:获取一个定位元素的参考点
scroll系列: width, height, top, left

scroll系列: width, height, top, left

scrollWidth/scrollHeight:获取盒子或页面真实内容的宽度
scrollTop:获取页面或盒子向上卷去的高度
scrollLeft:获取页面或盒子向左卷去的宽度 基本上用不到
需要记的三个常用高度:

总结

获取一张网页可视区的高度:document.body.clientHeight
获取一张网页真实的高度:document.body.scrollHeight
获取一张网页卷去的高度:document.body.scrollTop

事件处理

**手动调用事件

  • xx.click()(addEventListener)//此方法不能调用dom2,change事件

  • xx.dispatchEvent(new Event(‘change’))

  • xx.onclick();(onclick)

事件类型

事件 + 事件的反馈 = 前端交互(前端的核心)

鼠标事件:

请添加图片描述

键盘事件:

请添加图片描述
事件的执行顺序是 onkeydown、onkeypress、onkeyup

加载事件:
  • load 加载 浏览器不仅加载完成了 HTML,还加载完成了所有外部资源 事件源是window
  • unload 加载 退出页面 此事件不好捕获到 也没有什么用
  • DOMContentLoaded:浏览器已完全加载 HTML,并构建了 DOM 树,但像 img 和样式表之类的外部资源可能尚未加载 完成。

## 表单事件:

请添加图片描述

  • focus: 获取焦点
  • blur: 失去焦点
  • change: 改变输入框中的内容,并失去焦点时触发
  • input:内部发生变化,立即触发,不等到失去焦点
  • submit: 当点击了提交按钮,会触发submit事件
  • reset: 当点击了重置按钮,会触发reset事件
其它事件:
  • resize: 改变了浏览器窗口大小时,会触发resize事件
  • scroll: 页面滚动时,会触发scroll事件

事件的绑定和解绑

HTML级别的事件绑定

可以在HTML开始标签上,去绑定事件,这种绑定基本不用

DOM0事件绑定
 btn.onclick = function(){}
  • DOM0事件绑定,就是给DOM元素的onxxxx属性赋值,是基于属性赋值的操作
  • 基于属性赋值 如果重复绑定多次,后面的会覆盖前面的
  • dom0级别的事件绑定优先级是高于HTML级别的事件绑定的
DOM2的事件绑定

DOM2的事件绑定是基于事件池的,不是基于属性赋值的,所以可以多次绑定,不会覆盖掉

btn.addEventListener("click",function(){}
事件解绑
  • DOM0的解绑
 this.onclick = null; // DOM0的解绑
  • DOM2的事件解绑
btn.removeEventListener("click", fn)
事件冒泡和事件捕获
  • 冒泡:从内到外
  • 捕获:从外到内
  • addEventListener第3个参数为 true 表示捕获阶段触发,false表示冒泡阶段触发,默认值为false`
  • 阻止

  e.stopPropagation()

事件对象

常见的属性:
  • type:事件的类型;
  • target:当前事件发生的元素;
  • currentTarget:当前处理事件的元素;
  • eventPhase:事件所处的阶段;
  • offsetX、offsetY:事件发生在元素内的位置;
  • clientX、clientY:事件发生在客户端内的位置;
  • pageX、pageY:事件发生在客户端相对于document的位置;
  • screenX、screenY:事件发生相对于屏幕的位置;
常见的方法:
  • preventDefault:取消事件的默认行为;
  • stopPropagation:阻止事件的进一步传递(冒泡或者捕获都可以阻止);

事件委托

事件冒泡在某种情况下可以帮助我们实现强大的事件处理模式 – 事件委托模式(也是一种设计模式)

  • 当子元素被点击时,父元素可以通过冒泡可以监听到子元素的点击;
  • 可以通过event.target获取到当前监听的元素;

BOM

BOM:浏览器对象模型(Browser Object Model)

BOM主要包括一下的对象模型

  • window:包括全局属性、方法,控制浏览器窗口相关的属性、方法
  • location:浏览器连接到的对象的位置(URL)
  • history:操作浏览器的历史
  • navigator:用户代理(浏览器)的状态和标识(很少用到)
  • screen:屏幕窗口信息(很少用到)
    请添加图片描述

window

window对象在浏览器中可以从两个视角来看待
  • 视角一:全局对象 GO
  • 视角二:浏览器窗口对象, 提供了对浏览器操作的相关的API
window对象的作用
  • 第一:包含大量的属性,localStorage、console、location、history、screenX、scrollX等等(大概60+个属性)
  • 第二:包含大量的方法,alert、close、scrollTo、open等等(大概40+个方法)
  • 第三:包含大量的事件,focus、blur、load、hashchange等等(大概30+个事件)
  • 第四:包含从EventTarget继承过来的方法,addEventListener、removeEventListener、dispatchEvent方法
  • MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/API/Window

location对象

location对象用于表示window上当前链接到的URL信息

常见的属性有哪些
  • href: 当前window对应的超链接URL, 整个URL;
  • protocol: 当前的协议;
  • host: 主机地址;
  • hostname: 主机地址(不带端口);
  • port: 端口;
  • pathname: 路径;
  • search: 查询字符串;
  • hash: 哈希值;
    请添加图片描述
常见的方法有哪些
  • assign:赋值一个新的URL,并且跳转到该URL中
  • replace:打开一个新的URL,并且跳转到该URL中(不同的是不会在浏览记录中留下之前的记录)
  • reload:重新加载页面,可以传入一个Boolean类型
URLSearchParams介绍
  • URLSearchParams 定义了一些实用的方法来处理 URL 的查询字符串
  • 可以将一个字符串转化成URLSearchParams类型
  • 也可以将一个URLSearchParams类型转成字符串
  • 中文会使用encodeURIComponent和decodeURIComponent进行编码和解码
URLSearchParams常见的方法

history对象

history对象允许我们访问浏览器曾经的会话历史记录

常见属性
  • length:会话中的记录条数
  • state:当前保留的状态值
常用方法
  • back():返回上一页,等价于history.go(-1);
  • forward():前进下一页,等价于history.go(1);
  • go():加载历史中的某一页;
  • pushState():打开一个指定的地址;
  • replaceState():打开一个新的地址,并且使用replace;

navigator对象(了解)

请添加图片描述

screen对象(了解)

  • screen主要记录的是浏览器窗口外面的客户端显示器的信息
  • 比如屏幕的逻辑像素 screen.width、screen.height
    请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值