JS BOM API(已完结)

2 篇文章 0 订阅

window对象的常见事件

窗口加载事件

在这里插入图片描述
在这里插入图片描述
也就是说,用addEventListener的方式,load事件可以注册多次的
在这里插入图片描述

DOMContentLoaded和onload的区别

在这里插入图片描述

窗口大小调整事件

在这里插入图片描述
在这里插入图片描述
这是以前的响应式布局的写法,现在不用啦,o( ̄▽ ̄)ブ

定时器

setTimeout

window.setTimeout(调用函数,延迟的毫秒数)
window调用时可以省略

function callback(){
	console.log('爆炸了')
}
var time1 = setTimeout(callback,3000)
var time2 = setTimeout(callback,5000)
//因为一个页面有多个定时器,所以要区分一下

window.clearTimeout(timeoutID)

这个timeoutID就是我们取的定时器的名字

setInterval

window.setInterval(回调函数,间隔的毫秒数)
重复调用一个函数,每隔这个时间,就去调用一次回调函数

秒杀活动倒计时

<div class="a" style="width: 100px;height: 100px;background-color: black;color: white; display: inline-block;">
    </div>
    <div class="b" style="width: 100px;height: 100px;background-color: black;color: white; display: inline-block;">
    </div>
    <div class="c" style="width: 100px;height: 100px;background-color: black;color: white; display: inline-block;">
    </div>

    <script>
        //  倒计时效果 
        var hours = document.querySelector('.a');
        var mins = document.querySelector('.b');
        var seconds = document.querySelector('.c');

        function countDown(time) {
            var ans = []
            //  现在的时间 
            var dateNow = +new Date();
            //  活动截止时间
            var dateDeadline = +new Date(time);
            //  转换为s
            var times = (dateDeadline - dateNow) / 1000;
            var h = parseInt(times / 60 / 60 % 24);
            h = h < 10 ? '0' + h : h;
            ans[0] = h;
            var min = parseInt(times / 60 % 60);
            min = min < 10 ? '0' + min : min;
            ans[1] = min;
            var s = parseInt(times % 60);
            s = s < 10 ? '0' + s : s;
            ans[2] = s;
            return ans
        }

        console.log(countDown)
        countDown('2021-6-9 22:00:00');//先调用一次这个函数,防止第一次刷新页面有空白
        setInterval(function () {
            var time = countDown('2021-6-9 22:00:00');
            hours.innerHTML = time[0];
            mins.innerHTML = time[1];
            seconds.innerHTML = time[2];
        }, 1000);
    </script>

在这里插入图片描述
区别:location.assign()可以后退;location.replace()不记录历史,不可以后退

window.clearInterval(intervalID);

验证码发送倒计时

在这里插入图片描述

    <!-- 发送短信案例 -->
    <input type="text"> <button>发送</button>
    <script>
        var btn = document.querySelector('button');
        var time = 5; //定义剩下的秒数
        btn.addEventListener('click', function () {
            var timer = setInterval(function () {
                btn.innerHTML = '还剩' + time + '秒可以点击';
                time--;
                btn.disabled = true;
                if (time == 0) {
                    btn.disabled = false
                    btn.innerHTML = '发送'
                    clearInterval(timer);//清除定时器
                    time = 5;//下次还是5s开始倒计时
                }
            }, 1000)
        })
    </script>

this指向问题

1. 全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window(不论定时器的位置在哪,都是指向window))
   console.log(this);
   function fn(){
		console.log(this)
	}
   window.fn();//fn的调用其实是省略了window.所以这里的this也是指向window的
2. 方法调用中谁调用this指向谁
   var o = {
		sayHi:function(){
			console.log(this);// this指向的是o这个对象
		}
	}
	o.sayHi();	

	var btn = document.querySelector('button');
	btn.onclick = function(){
		console.log(this); // this指向的是btn这个按钮对象
	}
3. 构造函数中的this指向构造函数的实例
	function Fun(){
		console.log(this); // this 指向的是fun 实例对象
	}
	var fun = new Fun();

Location对象

window对象提供的一个location属性用于获取或设置窗体的URL,并且可以用于解析URL。返回的是一个对象
在这里插入图片描述
在这里插入图片描述

利用location获取url中的参数

在这里插入图片描述
在这里插入图片描述

//login.html
<body>
    <p>登录页面</p>
    <form action="index.html">
        <span>用户名:</span><input type="text" name="uname">
        <input type="submit" value="登录">
    </form>
</body>

//index.html
<body>
    <p>首页</p>
    <span></span>欢迎光临
</body>
<script>
    var uname = location.search;
    var index = uname.indexOf('=');
    var uName = document.querySelector('span');
    uName.innerHTML = uname.substr(index + 1)
</script>

navigator 对象

包含浏览器的相关信息
在这里插入图片描述

history 对象

在这里插入图片描述

网页特效

offset

在这里插入图片描述

  1. offsetWidth——可以帮我们动态的获得element的宽度,比如你页面缩放时,element的宽度会变,用这个可以随时获取

offset和style的区别

在这里插入图片描述
作用: offset只读
style读写,style的写,是向元素里增加行内样式,所以级别高

拖拽案例
在这里插入图片描述

 <script>
        var login = document.querySelector('#login');
        //点击对话框
        var p = document.querySelector('p');
        p.onclick = function () {
            login.style.display = 'block'
        }
        var clo = document.querySelector('.close')
        clo.addEventListener('click', function () {
            login.style.display = 'none'
        })

        //拖拽行为
        login.addEventListener('mousedown', function (e) {
            //鼠标距离盒子边缘的xy
            var rel_x = e.pageX - login.offsetLeft;
            var rel_y = e.pageY - login.offsetTop;
            document.addEventListener('mousemove', move)

            function move(e) {
                login.style.left = e.pageX - rel_x + 'px';
                login.style.top = e.pageY - rel_y + 'px';
            }
            //鼠标弹起
            document.addEventListener('mouseup', function () {
                document.removeEventListener('mousemove', move)
            })
        })
    </script>

京东放大镜案例

  1. 子绝父相的时候,子盒子是相对父盒子发生位移,所以是将鼠标在父盒子内距离盒子边缘的距离,赋值给遮盖层
  2. 在这里插入图片描述
  3. 放大镜的那个图片也要有定位
  4. 放大的图片的最后一步是取负值加‘px’
  5. 效果图
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .small {
            position: relative;
        }

        .small>img {
            width: 250px;
            height: 250px;
            border: 1px solid black
        }

        .small .mask {
            display: none;
            position: absolute;
            top: 0;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: rgba(255, 235, 163, .5);
            cursor: move;
        }

        .small .big {
            width: 400px;
            height: 400px;
            border: 1px solid black;
            position: absolute;
            top: 0;
            left: 300px;
            display: none;
            overflow: hidden;
        }

        .small .big img {
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>

<body>
    <div class="small">
        <img src="../1.jpg">
        <div class="mask"></div>
        <div class="big"><img class="bigImg" src="../1.jpg"></div>
    </div>

    <script>
        var mask = document.querySelector('.mask');
        var small = document.querySelector('.small');
        var big = document.querySelector('.big');
        small.addEventListener('mouseover', function () {
            big.style.display = 'block'
            mask.style.display = 'block'

        })
        small.addEventListener('mouseout', function () {
            big.style.display = 'none';
            mask.style.display = 'none'
        })
        small.addEventListener('mousemove', function (e) {
            //把鼠标在盒子内的坐标赋值给遮挡层,因为子绝父相,是相对于父元素的偏移量
            //1. e.pageY - this.offsetTop 得到鼠标相对父盒子边缘的距离
            //2. - mask.offsetHeight / 2; 为了让鼠标在遮盖层中间
            var y = e.pageY - this.offsetTop - mask.offsetHeight / 2;
            var x = e.pageX - this.offsetLeft - mask.offsetWidth / 2;
            //3. 遮盖层可以移动的最大距离
            var maxX = this.offsetWidth - mask.offsetWidth;
            var maxY = this.offsetHeight - mask.offsetHeight;
            if (x < 0) {
                x = 0;
            } else if (x > maxX) {
                x = maxX;
            } else {
                x = x;
            }
            if (y < 0) {
                y = 0;
            } else if (y > maxY) {
                y = maxY;
            } else {
                y = y;
            }
            mask.style.top = y + 'px';
            mask.style.left = x + 'px';
            //4.大盒子放大镜效果
            var bigImg = document.querySelector('.bigImg');
            // 遮挡层移动距离/遮挡层最大移动距离 = 大图片移动距离/大图片最大移动距离
            // 大图片最大移动距离
            var maxX_big = bigImg.offsetWidth - big.offsetWidth;
            var maxY_big = bigImg.offsetHeight - big.offsetHeight;
            var x_big = maxX_big * x / maxX;
            var y_big = maxY_big * y / maxY;
            bigImg.style.left = -x_big + 'px';
            bigImg.style.top = -y_big + 'px';

        })

    </script>
</body>

</html>

client系列

在这里插入图片描述
clientWidth:不包含边框
offsetWidth:包含边框

scroll系列

在这里插入图片描述
scrollHeight----全部的高度
在这里插入图片描述
如果是元素往上卷,就是element.scrollTop
如果是整个页面往上卷,就是window.pageYOffset

三大系列的区别

在这里插入图片描述
在这里插入图片描述

动画原理(~321P)

动画函数简单封装

在这里插入图片描述
先清除定时器,再开启,避免不停的按按钮,定时器积累越来越多(类似防抖?)

非匀速动画(逐渐缓慢)

在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210614201302801.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NhbXVzdHdv,size_16,color_FFFFFF,t_70
往前移:step是正值,往大了取;往后退:step是负值,往小了取

动画添加回调函数

<body>
    <div class="move" style="width: 100px;
                             height: 100px;
                             background-color:pink;
                             position: absolute;
                             top:50px;
                             left: 0;">
    </div>
    <button>移动</button>
    <script>
        var move = document.querySelector('.move');
        var button = document.querySelector('button');
        function animate(obj, target, callback) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                console.log(obj.offsetLeft)
                if (obj.offsetLeft >= target) {
                    // 停止动画 本质是停止定时器
                    clearInterval(obj.timer);
                    if (callback) {
                        // 调用函数
                        console.log(callback)
                        callback();
                    }
                }
                obj.style.left = obj.offsetLeft + step + 'px';
            }, 50);
        }
        button.addEventListener('click', function () {
            animate(move, 400, function () {
                move.style.border = '5px solid green';
                move.style.backgroundColor = 'white';
            });
        })
    </script>

sessionStorage和localStorage

sessionStorage

在这里插入图片描述
在这里插入图片描述

localStorage

在这里插入图片描述

记住用户名案例

<body>
    <input type="text"><input class="check" type="checkbox">记住用户名
    <script>
        var ipt = document.querySelector('input');
        var check = document.querySelector('.check');
        if (localStorage.getItem('uname')) {
            ipt.value = localStorage.getItem('uname')
            check.checked = true;
        }
        check.addEventListener('change', function () {
            if (this.checked) {
                var val = ipt.value
                localStorage.setItem('uname', val)
            } else {
                localStorage.removeItem('uname')
            }
        })
    </script>
</body>

备注

  1. BOM缺乏标准,JS语法标准化组织是ECMS,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分
  2. DOM的顶级对象是document,BOM的顶级对象是window
  3. BOM包含DOM在这里插入图片描述
  4. window,name是空,但是浏览器里有这个name的,所以自定义变量的时候,不要用name来作为变量名
  5. 回调函数:上一件事干完,再回头调用这个函数
  6. 类名不能为1,2,3这种
  7. son.parentNode(返回最近一级的父亲,不管父亲有没有定位);son.offsetParent(返回的是带定位的父亲)
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
  1. dpr 物理像素比(devicePixelRatio)

  2. pageshow页面重新加载时会触发的事件,无论页面是否来自缓存
    在这里插入图片描述
    在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值