Web APIs

147 阅读10分钟

Web APIs

1.获取元素

1.1根据ID获取

document.getElementById('id')

1.2根据标签名获取元素

  • document.getElementsByTagName('标签名')
  • element.getElementsByTagName('标签名')

1.3H5新增获取元素方式

  • document.getElementsByClassName('类名')
  • document.querySelector('选择器')
  • document.querySelectorAll ('选择器')

1.4获取特殊元素

  1. 获取body 元素 document.body
  2. 获取html 元素 document.documentElement

2.改变元素内容

  1. element.innerText

  2. element.innerHTML

    区别:1.innerText 不识别html标签 非标准 去除空格和换行

    ​ 2.innerHTML 识别html标签 W3C标准 保留空格和换行的

3.开关灯

<button id="btn">开关灯</button>
    <script>
        var btn = document.getElementById('btn');
        var flag = 0;
        btn.onclick = function() {
            if (flag == 0) {
                document.body.style.backgroundColor = 'black';
                flag = 1;
            } else {
                document.body.style.backgroundColor = '#fff';
                flag = 0;
            }
        }
  </script>

4.排他思想

<button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
    <script>
        // 1. 获取所有按钮元素
        var btns = document.getElementsByTagName('button');
        // btns得到的是伪数组  里面的每一个元素 btns[i]
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function() {
                // (1) 我们先把所有的按钮背景颜色去掉  干掉所有人
                for (var i = 0; i < btns.length; i++) {
                    btns[i].style.backgroundColor = '';
                }
                // (2) 然后才让当前的元素背景颜色为pink 留下我自己
                this.style.backgroundColor = 'pink';

            }
        }
        //2. 首先先排除其他人,然后才设置自己的样式 这种排除其他人的思想我们成为排他思想
    </script>

5.自定义属性操作

  • 获取属性值:element.getAttribute('属性')

  • 设置属性值:element.setAttribute('属性', '值')

    div.setAttribute('class', 'footer'); // class 特殊 这里面写的就是class 不是className

  • 移除属性值:removeAttribute('属性')

h5新增的获取自定义属性的方法:

​ element.dateset.index

​ element.dataset['index']

​ 如果自定义属性里面有多个'-'连接的单词,我们用驼峰命名法

6.节点操作

6.1父级节点

node.parentNode

得到的是离元素最近的父级节点(亲爸爸) 如果找不到父节点就返回为 null

6.2子级节点

  • 所有子节点: parentNode.childNodes 所有的子节点 包含 元素节点 文本节点等等

  • 子元素节点:parentNode.children

    1.第一个子元素节点:parentNode.firstElementChild

    2.最后一个子元素节点:parentNode.lastElementChild

    3.实际开发写法:parentNode.children[ol.children.length - 1] 如:ol.children[0]

    4.下一个兄弟元素节点:nextElementSibling

    5.上一个兄弟元素节点:previousElementSibling

6.3创建节点

var li = document.createElement('li')

6.4添加节点

后面追加元素:node.appendChild(child) node 父级 child 是子级

前面追加元素:node.insertBefore(child, 指定元素)

<ul>
   <li>123</li>
   <li>456</li>
</ul>
<script>
    var lili = document.createElement('li');
    ul.insertBefore(lili, ul.children[1]);
</script>

6.5删除节点

node.removeChild(child)

6.6复制节点

node.cloneNode()

括号为空或者里面是false 浅拷贝 只复制标签不复制里面的内容

括号为true 深拷贝 复制标签复制里面的内容

7.创建元素的三种方式

  • document.write
  • innerHTML
  • document.createElement()

区别:

  1. document.write() 创建元素 如果页面文档流加载完毕,再调用这句话会导致页面重绘
  2. innerHTML 不会导致页面重绘,创建多个元素效率更高,结构稍复杂
  3. createElement()创建多个元素效率稍低,结构更清晰

8.事件高级

8.1事件监听addEventListener()

同一个元素同一个事件可以添加多个侦听器

eventTarget.addEventListener(type,listener[useCapture])

1.eventTarget 目标对象,不需要带on

2.listener 函数

3.useCapture 可选参数,默认false。

​ false或不写,冒泡阶段

​ true捕获阶段

8.2删除事件

eventTarget.removeEventListener(type,listener[useCapture])

8.3DOM事件流三个阶段

  1. 捕获阶段
  2. 当前事件阶段
  3. 冒泡阶段

8.4事件对象的兼容性处理

​ e = e || window.event;

8.5返回触发事件对象e.target

#### e.target 和 this 的区别

  1. e.target 是事件触发的元素
  2. this 是事件绑定的元素

8.6阻止默认行为

  1. e.preventDefault()

  2. return false

    后面代码不执行,写在最下面

8.7阻止事件冒泡

​ e.stopPropagation()

8.8事件委托的原理

给父元素注册事件,利用事件冒泡,当子元素的事件触发,会冒泡到父元素,然后去控制相应的子元素。

9.常用鼠标事件

鼠标事件 触发条件
onclick 鼠标点击左键触发
onmouseover 鼠标经过触发
onmouseout 鼠标离开触发
onfocus 获得鼠标焦点触发
onblur 失去鼠标焦点触发
onmousemove 鼠标移动触发
onmouseup 鼠标弹起触发
onmousedown 鼠标按下触发
onmouseenter 鼠标经过触发(不会产生冒泡)
onmouseleave 鼠标离开触发(不会产生冒泡)
contextmenu 禁止鼠标右键菜单
selectstart 禁止鼠标选中

9.1案例:禁止选中文字和禁止右键菜单

  1. 禁止鼠标右键菜单contextmenu
document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
      })
  1. 禁止选中文字 selectstart
document.addEventListener('selectstart', function(e) {
            e.preventDefault();

        })

9.2鼠标事件对象

鼠标事件对象 说明
e.clientX 鼠标相对于浏览器窗口可视区的x坐标
e.clientY 鼠标相对于浏览器窗口可视区的y坐标
e.pageX 鼠标相对于文档页面的x坐标
e.pageY 鼠标相对于文档页面的y坐标
e.screenX 鼠标相对于电脑屏幕的x坐标
e.screenY 鼠标相对于电脑屏幕的y坐标

10.常用键盘事件

10.1键盘事件

键盘事件 触发条件
onkeyup 某个键盘按键被松开始触发
onkeydown 某个键盘按键被按下时触发
inkeypress 某个键盘按键被按下时触发,区分大小写(不识别功能键,比如ctrl,shift,箭头等)

注:1.keydown,keypress在文本框里的特点:两个事件触发的时候,文字还没有落入文本框中

​ 2.keyup:事件触发的时候,文本已落入文本框

​ 3.三个事件的执行顺序是:keydown--keypress--keyup

10.2键盘事件对象

键盘事件对象 说明
keyCode 返回该键的ASCII值

11.BOM

BOM比DOM更大,包含DOM

顶级对象是window

11.1window对象的常见事件

1.窗口加载事件

  1. 第一种:

window.onload = function() { }或者

window.addEventListener('load', function() { })

  1. 第二种:

document.addEventListener('DOMContentLoaded', function() { })

注意:

  1. load 等页面内容全部加载完毕,包含页面dom元素 图片 flash css 等等
  2. DOMContentLoaded 是DOM 加载完毕,不包含图片 falsh css 等就可以执行 加载速度比 load更快一些

2.调整窗口大小事件

window.addEventListener('resize', function() { })

注意

  1. 只要窗口大小发生像素变化,就会触发这个事件
  2. 我们经常利用这个事件完成响应式布局。 window.innerWidth 当前屏幕的宽度

11.2定时器

1.setTimeout() 炸弹定时器

开启定时器

setTimeout(调用函数, 延时时间)

案例 5秒后自动关闭广告

<body>
    <img src="images/ad.jpg" alt="" class="ad">
    <script>
        // 获取要操作的元素
        var ad = document.querySelector('.ad');
		// 开启定时器
        setTimeout(function() {
            ad.style.display = 'none';
        }, 5000);
    </script>
</body>

停止定时器

clearTimeout(timeoutID)

2.setInterval()闹钟定时器

开启定时器

setInterval(调用函数, 延时时间)

案例 倒计时

<style>
        div {
            margin: 200px;
        }
        
        span {
            display: inline-block;
            width: 40px;
            height: 40px;
            background-color: #333;
            font-size: 20px;
            color: #fff;
            text-align: center;
            line-height: 40px;
        }
    </style>
div>
        <span class="hour">1</span>
        <span class="minute">2</span>
        <span class="second">3</span>
    </div>
    <script>
        // 1. 获取元素(时分秒盒子) 
        var hour = document.querySelector('.hour'); // 小时的黑色盒子
        var minute = document.querySelector('.minute'); // 分钟的黑色盒子
        var second = document.querySelector('.second'); // 秒数的黑色盒子
        var inputTime = +new Date('2019-5-1 18:00:00'); // 返回的是用户输入时间总的毫秒数

        countDown(); // 我们先调用一次这个函数,防止第一次刷新页面有空白 

        // 2. 开启定时器
        setInterval(countDown, 1000);
		
        function countDown() {
            var nowTime = +new Date(); // 返回的是当前时间总的毫秒数
            var times = (inputTime - nowTime) / 1000; // times是剩余时间总的秒数 
            var h = parseInt(times / 60 / 60 % 24); //时
            h = h < 10 ? '0' + h : h;
            hour.innerHTML = h; // 把剩余的小时给 小时黑色盒子
            var m = parseInt(times / 60 % 60); // 分
            m = m < 10 ? '0' + m : m;
            minute.innerHTML = m;
            var s = parseInt(times % 60); // 当前的秒
            s = s < 10 ? '0' + s : s;
            second.innerHTML = s;
        }
    </script>

停止定时器

clearInterval(intervalID)

11.3.this指向问题

  1. 普通函数中this指向window
  2. 对象中的this指向的是当前这个对象
  3. 事件中的this指向的是事件源
  4. 构造函数中的this指向的是new出来的那个实列对象
  5. 定时器中的this指向的是window

注:this始终指向的是它的调用者

11.4location对象

location对象属性 返回值
location.href 获取完整URL
location.search 获取URL参数

案例:获取URL参数

<script>
var url = 'https://www.itcast.cn/index.html?username=klxin&age=16' // location.href
var params = new URLSearchParams('?username=klxin&age=16')
console.log(params.get('username'))
console.log(params.get('age'))
</script>

location对象的常见方法

location对象的常见方法 返回值
location.assign() 和href一样,可以跳转页面
location.replace() 替换当前页面,因为不记录历史,所以不能后退页面
location.reload() 重新加载页面,相当于刷新,如果参数为true强制刷新ctrl+f5

11.5navigator对象

​ navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是 userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。

下面前端代码可以判断用户那个终端打开页面,实现跳转

if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
    window.location.href = "";     //手机
 } else {
    window.location.href = "";     //电脑
 }

11.6history对象

  1. history.back()

  2. history.forward()

  3. history.go(参数) 前进后退功能

    参数1,前进1个页面

    参数-1,后退一个页面

    参数0,刷新

11.7刷新页面

  1. location.reload(true)
  2. location.href = location.href
  3. history.go(0)

12.元素偏移量 offset系列

offset系列属性 作用
element.offsetParent 返回作为该元素带有定位的父级元素,如果父级都没有定位则返回body
element.offsetTop 返回元素相对带有定位父元素上方的偏移(不带单位)
element.offsetLeft 返回元素相对带有定位父元素左边的偏移(不带单位)
element.offsetWidth 返回自身包括padding,边框,内容区的宽度,返回数值不带单位
element.offsetHeight 返回自身包括padding,边框,内容区的高度,返回数值不带单位

注:offset获取元素大小位置;style改变元素值

13.元素可视区 client 系列

client系列属性 作用
element.clientTop 返回元素上边框的大小
element.clientLeft 返回元素左边框的大小
element.clientWidth 返回自身包括padding,内容区的宽度,不含边框,返回数值不带单位
element.clientHeight 返回自身包括padding,内容区的高度,不含边框,返回数值不带单位

14.元素滚动 scroll系列

scroll系列属性 作用
element.scrollTop 返回被卷去的上侧距离,返回数值不带单位
element.scrollLeft 返回被卷去的左侧距离,返回数值不带单位
element.scrollWidth 返回自身实际宽度,不含边框,返回数值不带单位
element.scrollHeight 返回自身实际高度,不含边框,返回数值不带单位

15.触屏事件

15.1常见的触屏事件

触屏touch事件 说明
touchstart 手指触摸到一个DOM元素时触发
touchmove 手指在一个DOM元素上滑动时触发
touchend 手指从一个DOM元素上移动时触发

15.2触摸事件对象

触摸列表 说明
touches 正在触摸屏幕的所有手指的一个列表
targetTouches 正在触摸当前DOM元素上的手指的一个列表
changedTouches 手指状态发生了改变的列表,从无到有,从有到无变化

16.classList属性

1.添加类

element.classList.add(’类名’)

是在后面追加类名不会覆盖以前的类名 注意前面不需要加.

div.classList.add('three');

2.移除类

element.classList.remove(’类名’);

div.classList.remove('one');

3.切换类

element.classList.toggle(’类名’);

document.body.classList.toggle('bg');

17.click 延时解决方案

有300ms的延时(区分是否是双击)

解决方案:

1.禁用缩放

 <meta name="viewport" content="user-scalable=no">

2.touchstart代替click

3.使用插件。fastclick插件解决300ms延时

<script src="fastclick.js"></script>
<script>
 if ('addEventListener' in document) {
            document.addEventListener('DOMContentLoaded', function() {
                FastClick.attach(document.body);
            }, false);
        }   
</script>

18.本地存储

18.1window.sessionStorage

  1. 生命周期为关闭浏览器窗口
  2. 在同一个窗口(页面)下数据可以共享
  3. 以键值对的形式存储使用
  4. 容量约为5M

存储数据:

sessionStorage.setItem(key, value)

获取数据:

sessionStorage.getItem(key)

删除数据:

sessionStorage.removeItem(key)

清空数据:

sessionStorage.clear()

18.2window.localStorage

  1. 声明周期永久生效,除非手动删除 否则关闭页面也会存在
  2. 可以多窗口(页面)共享(同一浏览器可以共享)
  3. 以键值对的形式存储使用
  4. 容量大约为20M

注意点1: 本地存储 localStorage 里面只能存储字符串格式 ,因此需要把对象转换为字符串 JSON.stringify(data)。

注意点2: 获取本地存储数据,需要把里面的字符串转换为对象格式JSON.parse() 我们才能使用里面的数据。

存储数据:

localStorage.setItem(key, value)

获取数据:

localStorage.getItem(key)

删除数据:

localStorage.removeItem(key)

清空数据:

localStorage.clear()

案例记住用户名

<input type="text" id="username"> <input type="checkbox" name="" id="remember"> 记住用户名
    <script>
        var username = document.querySelector('#username');
        var remember = document.querySelector('#remember');
        if (localStorage.getItem('username')) {
            username.value = localStorage.getItem('username');
            remember.checked = true;
        }
        remember.addEventListener('change', function() {
            if (this.checked) {
                localStorage.setItem('username', username.value)
            } else {
                localStorage.removeItem('username');
            }
        })
    </script>