IT@程序员猿媛Web前端之路互联网科技

WebAPI

2019-05-20  本文已影响108人  蓝海00

🤪

一、什么是webAPI?


二、文档树

2.1 三个部分

2.2 节点的三个属性

1. nodeType(节点类型)
2. nodeName(节点名字)
3. nodeValue(节点值)

2.2.1 元素节点

元素节点就是标签节点

  1. nodeType: 1
  2. nodeName: 标签名(大写)
  3. nodeValue: null

2.2.2 属性节点

属性包括属性名和属性值

  1. nodeType: 2
  2. nodeName: 属性名
  3. nodeValue: 属性值

2.2.3 文本节点

  1. nodeType: 3
  2. nodeName: #text
  3. nodeValue: 文本内容

2.2.4 注释节点

  1. nodeType: 8
  2. nodeName: #comment
  3. nodeValue: 注释内容

三、window对象

window.open(href); /*打开一个网页*/
window.close(); /*关闭网页*/

四、事件

4.1 什么是事件?

在计算机中 事件代表捕捉了用户进行了什么操作 再给对应的事件处理

4.2 事件三大部分

事件源 事件类型 事件处理函数

4.2.1 事件源

用户操作的是什么元素 事件中的this就是事件的事件源(谁触发这个事件那this就是谁)

4.2.2 事件类型

用户进行了什么操作

4.2.2.1 on

实现拖拽
要考虑元素是否有margin 移动的x和y🉐️减去元素原有的margin
给元素添加鼠标按下事件
在按下事件里面给页面添加鼠标移动事件
给元素注册鼠标弹起事件 => 清除页面鼠标移动事件

H5拖拽
需要为拖拽的元素添加 draggable = "true" 属性
拖拽元素添加

4.2.2.2 addEventListener()

三参数

/*
事件名 不加on
事件处理函数
boolean值 是否事件捕捉
*/
el.addEventListener()

ie8 不支持 addEventListener
两参数

/*
事件名 加on
事件处理函数
*/
el.attachEvent()
4.2.2.3 on事件和addEventListener 添加事件的区别

元素.on事件 = 处理函数
(添加事件 如果是同名事件,后面的事件处理函数会覆盖前面的)
元素.addEventListener()
(添加事件 不会覆盖之前的同名事件)

4.2.2.4 移除事件

用什么方式添加的事件就用什么方式移除事件

el.onclick = function(){};
// 移除
el.onclick = null;
el.addEventListener("click",fn1)
// 移除
el.removeEventListener("click",fn1)
el.attachEvent("onclick",f1)
// 移除
el.detachEvent("onclick",fn1)
4.2.3 事件处理函数

用户操作后要执行的什么代码

4.2.3.1 事件对象 e

screen
e.screenX 和 e.screenY
获取的是点击的位置相对于屏幕左上角的坐标

page
e.pageX,e.pageY
获得的是点击的位置相对于页面(文档)左上角的坐标
有兼容性的问题,IE8不支持,自己计算
pageX = e.clientX + 页面往左滚出去的距离 (scrollLeft)
pageY = e.clientY + 页面往上滚出去的距离 (scrollTop)

offset
e.offsetX,e.offsetY
获得是是点击的位置相当于事件源的左上角的位置
ie属性 有bug
offsetX = e.clientX - 盒子到可视区域的left (el.getBoundingClientRect.left)
offsetY = e.clientY - 盒子到可视区域的top (el.getBoundingClientRect.top)

4.2.3.2 this、e.target、e.currentTarget区别

this 和 e.currentTarget 是一樣的
当前调用的是谁的事件 那么this就是谁
e.currentTarget ie8 不支持 => 直接用this

e.target 获取事件源(目标阶段) 正在触发事件的那个元素
ie8不支持 => e.target
兼容代码
var target = e.target || e.srcElement

4.3 事件的三大阶段

4.3.1 如何获取事件正在执行的阶段

在事件里可以通过 e.eventPhase 来捕获当前是哪个阶段
捕获 => 1
目标 => 2
冒泡 => 3

4.3.2 三大阶段

捕获 目标 冒泡

4.3.2.1 捕获阶段

一种现象 与冒泡阶段相反 从window开始 依次一级一级往下调用子元素的同名事件,直到找到真正触发事件的事件源
事件捕获默认看不见 想要看到捕获阶段则需要通过 addEventListener来绑定事件,并且第三个参数传true

4.3.2.2 目标阶段

找到真正触发事件的那个元素 -> 事件源

4.3.2.3 冒泡阶段

一种现象 当元素事件触发后 会从事件源开始依次一次一次往上调用父元素的同名事件,直到window
事件冒泡默认存在

好处:给父元素添加事件相当于给子元素添加了事件 -> 事件委托 -> e.target
带来的影响(坏处):如果子元素和父元素有同名事件 并且业务逻辑相反 则会冲突影响

4.3.3 阶段顺序

设置捕获

先捕获 从window开始 依次一级一级调用子元素的同名事件
-> 找到目标(真正触发事件的元素)
-> 从目标元素开始 依次一级一级调用父元素的同名事件 直到window

未设置捕获

找到目标(真正触发事件的元素)
-> 从目标元素开始 依次一级一级调用父元素的同名事件 直到window

4.3.4 阻止事件派发

阻止事件冒泡和阻止事件捕获
e.stopPropagation()
ie8魔鬼不支持(ie8只有事件冒泡,没有事件捕获) => e.cancelBubble = true


五、本地存储

只能存储字符串
查看本地存储 浏览器F12->Application->Local || Session Storage->fille://

5.1 localStorage 本地存储

可以把数据存储到本地(浏览器) 只要用户不删除 则会一直保存 每个域名都是独立的保存数据 不同域名不能互相访问 长久保存数据可以存储到 localStorage

5.2 sessionStorage 会话存储

短暂存储数据 可以多页面传值 相当于localStorage会更安全 浏览器关闭后就不会保存了


六、定时器和延时器

给元素添加动画定时器 可以将定时器id直接给元素 元素.timeId

6.1 定时器

每隔一段时间执行一段代码

/*
参数一: 要执行的代码 可以写字符串 在字符串里面写js代码 或者写函数
参数二: 间隔事件 单位是毫秒 1000毫秒 = 1秒
*/
window.setInterval()

6.2 延时器

一段时间后执行一段代码

/*
参数一: 要执行的代码 可以写字符串 在字符串里面写js代码 或者写函数
参数二: 延迟事件 单位是毫秒 1000毫秒 = 1秒
*/
window.setTimeout()

6.3 清除定时器和延时器

clearInterval(定时器id)
clearTimeout(延时器id)

七、阻止a标签默认跳转三种方式

7.1 href

将a标签的href的路径改为 javascript:void(0) || javascript:void(null) || 简写 javascript:

7.2 return

给a标签添加点击事件 在事件处理函数的最后 return false

7.3 事件对象 e

阻止事件默认行为 e.preventDefault()

return和事件对象e阻止跳转的区别
return后面的代码不执行
e.preventDefault()不会影响后面代码执行


八、排他思想

先把大家恢复成默认,再让自己特殊 tab切换


九、offset家族

只能获取行内样式

只能取值 (number) 不能赋值
offsetWidth 和 offsetHeight 获取包括padding和border和width||height

9.1 offsetWidth

获取盒子的最终宽度

9.2 offsetHeight

获取盒子的最终高度

9.3 offsetTop

获取自身上外边框到定位父级上内边框的距离

9.4 offsetLeft

获取自身左外边框到定位父级左内边框的距离


十、scroll家族

scrollWidth 和 scrollHeight 获取的包括了隐藏的部分 只能获取(number)不能修改
scrollLeft 和 scrollTop 可以获取也可以修改 想要滚动条滚动到最右变 直接赋值为 scrollWidth即可

10.1 scrollWidth

获取盒子内容的总宽度

10.2 scrollHeight

获取盒子内容的总高度

10.3 scrollTop

获取内容上边滚出去的距离

10.4 scrollLeft

获取内容左边滚出去的距离

scrollTop和scrollLeft有兼容问题
兼容代码

var scrollTop = window.pageYOffset 
|| document.documentElement.scrollTop 
|| document.body.scrollTop 
|| 0;
var scrollLeft = window.pageXOffset 
|| document.documentElement.scrollLeft 
|| document.body.scrollLeft 
|| 0;

十一、client家族

如果元素有滚动条 那么这个元素的可视宽度就是 整个盒子的宽度 - 滚动条的宽度

11.1 clientWidth

获取可视区域的宽

11.2 clientHeight

获取可视区域的高

11.3 clientTop

获取左边框的宽度

11.4 clientLeft

获取上边看的宽度


十二、操作元素的方式

12.1 通过id获取元素

如果没有这个元素 则返回null 有则返回一个对象

获取 id 只能通过document来获取

document.getElementById("id")

12.2 样式名获取元素

如果没有这个元素 则返回一个空集合[伪数组]
document.getElementsByClassName('class')

12.2.1 什么是伪数组?

12.3 通过标签名来获取元素

ie8魔鬼有兼容问题
document.getElementsByTagName("div")

12.4 通过name属性来获取元素(表单元素)

document.getElementsByName("name")

12.5 通过css选择器来获取元素 (h5新增)

12.6 获取文档

document

12.7 获取html

document.documentElement

12.8 获取head

document.head

12.9 获取body

document.body

12.10 获取子节点和子元素

12.11 获取父节点和父元素

区别

el.parentNode可以获取到document
el.parentElement不能获取到document
因为document不是一个元素

12.12 获取上一个兄弟节点和上一个兄弟元素

12.13 获取下一个兄弟节点和下一个兄弟元素

12.14 添加子元素

父元素.appendChild("子元素")

12.15 删除子元素

父元素.removeChild("子元素")

12.16 在某个子元素前面插入元素

父元素.insertBefore(插入的新元素,要在哪个元素前面插入)

12.17 替换子元素

父元素.replaceChild(新的元素,被替换的元素)


十三、操作属性的另二种方式

13.1 js 操作属性

既可以操作自带属性,也可以操作自定义属性

13.2 h5 操作属性

在自定义属性前面加 data-
如果自定义属性前面添加了 data-
那么这些自定义属性都会保存到el.dataset '对象' 里面
想要取得属性直接遍历对象即可
取值时 data-会被去掉 并且如果后面还有-
会把后面的-也去掉 并把-后面的首字母大写(驼峰命名法)


十四、创建元素的三种方式

只能在body添加元素,并且会覆盖之前页面中的元素

创建一个标签存在内存里面
再通过 父元素.appendChild(“创建出来的元素”) 渲染到页面
appendChild细节
给父元素追加一个元素,添加在最后,如果此元素已经存在,则被移动到最后

为某元素添加内容,会覆盖原来的内容
+= 就只会追加不会覆盖
每次innerHtml赋值(+=)都是重新渲染,
所以有可能会让之前的元素丢失,
还会让之前元素的事件丢失(事件委托可解决)
渲染耗性能,大量资源浪费
先拼接字符串 再循环完了后一次性追加到页面中


十五、修改元素的属性

15.1 操作元素样式中的属性

样式名 如果在css 有 "-" 的 应使用 驼峰命名法
background-color => backgroundColor

15.2 操作图片的路径

15.3 操作单标签按钮的文字

15.4 操作元素的类名

15.4.1 JavaScript

15.4.2 HTML5

el.classList 返回的是一个伪数组 保存的是元素上的所有类名

15.5 操作元素显示or隐藏

let flag = this.value == "隐藏" ? true : false
divBox.style.display = flag ? "none" : "block"
this.value = flag ? "显示" : "隐藏" // 这里用来下一次
点击再次toggle 所以需要与设置的flag相反设定对应的值

15.6 表单元素的禁用和启动

加上代表禁用 不加上代表启动
js里面设置它为 true 代表禁用、false 代表启用

15.7 操作双标签的文字


十六、innerHTML、innerText、textContent的区别

innerHTML没有兼容问题 既可以拿到文本也可以渲染标签

innerText和textContent都是设置标签里面的文本内容
将数据当成字符串输出到页面 不会渲染
innerText在老版火狐里面不支持
textContent在ie9以下都不支持


十七、表单元素属性


十八、获取元素的最终样式

window.getComputedStyle(element)["width"]
window.getComputedStyle(element).width

返回的string属性值 "100px"

/*ie8魔鬼专用*/
element.currentStyle['width']

十九、获取元素到可视区域的距离

element.getBoundingClientRect()
element.getBoundingClientRect().left
element.getBoundingClientRect().top

获取鼠标位置相对于自身的x和y
(offsetX和offsetY有bug)
e.clientX - 盒子到可视区域的left
e.clientY - 盒子到可视区域的top


XMind思维导图

webAPI.png
上一篇下一篇

猜你喜欢

热点阅读