首页 > 其他分享 >BOM操作

BOM操作

时间:2023-03-16 14:15:51浏览次数:27  
标签:function 定时器 obj 元素 BOM var 操作 document

1.BOM

BOM即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是window

window对象是浏览器的顶级对象,它具有双重角色

1.它是js访问浏览器窗口的一个接口

2.它是一个全局对象,定义在全局作用域中的变量,函数都会变成window对象的属性和方法。

1.1页面加载事件

window.onload=function(){} 是页面所有元素都加载完毕后,再调用此函数

传统方式只能写一个,如果多个以最后一个为准执行

window.addEventListern('load',function(){}),没有限制

IE9以上支持:document.addEventListern('DOMContentLoaded',function(){})

load等页面内容全部加载完毕,包含页面dom元素 图片 flash css等

DOMContentLoaded是DOM加载完毕,不包含图片faslh css 图片等,所以比load快一点

1.2调整窗口大小事件

window.onresize=function(){}

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

注意:只要窗口大小发生像素变化,就会触发这个事件

​ 我们经常利用这个事件完成响应式布局。window.innerWidth当前屏幕的宽度

<div></div>
    <script>
        window.addEventListener('load', function() {
            var div = document.querySelector('div');
            window.addEventListener('resize', function() {
                if (window.innerWidth <= 800) {
                    div.style.display = 'none';
                } else {
                    div.style.display = 'block';
                }
            })
        })
    </script>

1.3定时器之setTimeout()

window对象给我们提供了2个非常好用的方法 定时器

setTimeout()

setInterval()

window.setTimeout(调用函数,[延迟的毫秒数]);

     //这个window可以省略
    //这个延时时间单位是毫秒,但是可以省略,如果省略则是立     即执行调用函数
    //这个调用函数可以直接写函数,还可以写函数名
    //还有一个写法 'callback()',3000 不提倡此写法
    //页面中可能有很多的定时器,我们经常给定时器加标识符(名字);
<script>
        function callkback() {
            console.log('爆炸了')
        }
        setTimeout(callkback, 3000);
    </script>

1.4回调函数

以前写的事件也都是回调函数,定时器也是

<img src="images/ad.jpg" alt="">
    <script>
        var ad = document.querySelector('img');
        setTimeout(function() {
            ad.style.display = 'none';
        }, 5000)
    </script>

1.5清除定时器

window.clearTimeout(timeout ID);

<button>点击停止</button>
    <script>
        var btn = document.querySelector('button');
        var timer = setTimeout(function() {
            console.log('爆炸了')
        }, 5000)
        btn.addEventListener('click', function() {
            clearTimeout(timer);
        })
    </script>

1.6 setInterval

setInterval(回调函数,[延时时间]);

<script>
        setInterval(function() {
            console.log('继续输出');
        }, 1000)
        //2.setTimeout 延时时间到了,就去调用这个回调函数,只调用一次,就结束
        //3.setInterval 每隔这个延时时间,就去调用这个回调函数,会调用很多次,重复调用
    </script>

定时器:

<script>
        var hour = document.querySelector('.hour');
        var minute = document.querySelector('.minute');
        var second = document.querySelector('.second');
        var inputTime = +new Date('2022-4-28 18:00:00');
        //先调用一次函数,防止有空白
        countDown();
        //开启定时器
        setInterval(countDown, 1000);

        function countDown() {
            var nowTime = +new Date();
            var times = (inputTime - nowTime) / 1000;
            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>

1.7发送短信案例之清除计时器

 手机号码:<input type="number" name="" id=""> <button>发送</button>
    <script>
        var btn = document.querySelector('button');
        var time = 10; //定义剩下的秒数
        btn.addEventListener('click', function() {
            btn.disabled = true;
            var timer = setInterval(function() {
                if (time == 0) {
                    clearInterval(timer);
                    btn.disabled = false;
                    btn.innerHTML = '发送';
                    time = 10; //这个3需要重新开始
                } else {
                    btn.innerHTML = '还剩下' + time + '秒';
                    time--;
                }
            }, 1000)
        })
    </script>

1.8this指向问题

1.全局作用域或者普通函数,定时器一般情况下this指向调用它的对象window

2.方法调用中谁调用this指向谁

3.构造函数中this指向实例对象

1.9.js的执行队列

同步和异步

js是单线程,同一个事件只能做一件事

同步:前一个任务结束后再执行后一个任务

异步:多任务同时,多线程

本质区别:这条流水线上各个流程的执行顺序不同

同步任务都在主线程上执行,形成一个技术栈

异步任务:一般而言:异步任务有以下三种类型

​ 1.普通事件,如 click resize等

​ 2.资源加载,如load error等

​ 3.定时器

异步任务相关回调函数添加到任务队列中(任务队列也称消息队列)

js执行机制:1.先执行执行栈中的同步任务,2.异步任务(回调函数)放到任务队列里 3.一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行

由于主线程不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为事件循环(event loop)

2.0 location对象

window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL,因为这个属性返回的是一个对象,所以我们将这个属性也称为location对象

属性:1.location.href 获取或者设置整个URL

​ location.host :返回主机域名

​ 2.location.serach:返回参数

​ location.hash:返回片段,常见于链接 锚点

 <button>点击</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            //记录浏览历史,所以可以实现后退功能
            // location.assign('http://www.baidu.com');
            //不记录浏览历史,所以不能实现后退功能
            // location.replace('http://www.baidu.com');
            // 重新刷新,参数为空则相当于刷新,如果参数为true则强制刷新
            location.reload()
        })
    </script>

2.1navigator对象

navigator对象包含有关浏览器的信息,它有很多属性,我们最常用的是userAgent,该属性可以返回浏览器和主机信息

2.2history对象

history.forward() 前进

history.back() 后退

history.go() 参数为1则前进一步;

3. PC端网页特效

3.1元素偏移量offest系列

offset翻译过来就是偏移量,我们使用offest系列相关属性可以动态的得到改元素的位置 大小等

element.offsetTop 返回元素相对带有定位父元素上方的偏移

element.offsetLeft 返回元素相对带有父元素左边框的位移

<div class="father">
        <div class="son"></div>
    </div>
    <script>
        var father = document.querySelector('.father');
        var son = document.querySelector('.son');
        //可以得到元素的偏移,位置 不带单位
        console.log(father.offsetTop);
        console.log(father.offsetLeft);
        //它以定位的盒子为准
        console.log(son.offsetLeft);
    </script>

element.offsetWidth 返回元素的宽度和高度

element.offsetHeight

//获得元素的宽度和高度  包含padding和borde 值
        console.log(w.offsetWidth);
        console.log(w.offsetHeight);
//返回带有定位的父亲 否则返回body
        console.log(son.offsetParent);
        console.log(son.parentNode); //返回父亲 是最近一级的父亲,不管带不带定位

获取元素大小位置,用offset ,想要给元素大小赋值用style

3.2元素可视区client系列

client可以动态的得到元素的边框大小,元素大小等

client宽度和我们offsetWidth最大的区别就是不包含边框

3.3立即执行函数

立即执行函数

写法:

(function(){})()或者(function(){}());

<script>
        (function(a, b) {
            console.log(a + b);
        })(1, 2);
        //第二个小括号可以看做是调用函数
        (function sum(a, b) {
            console.log(a + b);
        }(2, 3))
        //立即执行函数最大的作用就是独立创建了一个作用域,里面所有的变量都是局部变量,不会有命名冲突
    </script>

3.4pageshow 事件

页面重新加载触发的事件,火狐有特点,不管是往返缓存都会触发

e.paersisited返回的是true,就是说如果这个页面是从缓存取过来的页面,也需要重新计算

3.5元素滚动scroll系列

element.scrollWidth 返回不带边框,自身实际的宽度

​ .scroHeight 返回自身实际的高度 不含边框 返回数值不带单位

scrollTop:页面被卷去的头部

scrollLeft:页面被卷去的左部

onscroll:当滚动条发生变换就会触发的事件

注意:元素被卷去的头部是element.scrollTop,如果是页面被卷去的头部则是window.pageYOffset

3.6三大系列总结

offset系列包含边框,另外俩个不包含

offset系列经常用于获得元素位置 offsetLeft offsetTop

client系列经常用于获取元素大小 clientWidth clientHeight

scroll经常用于获取滚动距离 scrollTop scrollLeft

注意:页面滚动距离通过window.pageYOffset获取

3.7 mouseover和mouseenter区别

mouseover鼠标经过自身盒子会触发,经过子盒子还会触发

mouseenter只会经过自身盒子触发,因为它不会冒泡

跟mouseenter搭配鼠标离开mouseleave事件同样不会冒泡

两者都是鼠标移动到元素上时会触发事件

4.动画函数封装

核心原理:通过定时器不断移动盒子位置

<script>
        //动画原理
        //1.获取盒子当前位置
        //2.让盒子在当前位置加上1个移动距离
        //3.利用定时器不断重复这个操作
        //4.加一个结束定时器的条件
        //5.注意此元素需要添加定位,才能使用element.style.left
        var div = document.querySelector('div');
        var timer = setInterval(function() {
            if (div.offsetLeft >= 400) {
                //停止动画,本质是停止计时器
                clearInterval(timer);
            }
            div.style.left = div.offsetLeft + 1 + 'px';
        }, 30)
    </script>

4.1函数封装

//简单动画函数封装obj目标对象 target 目标位置
        function animate(obj, target) {
            var timer = setInterval(function() {
                if (obj.offsetLeft >= target) {
                    //停止动画,本质是停止计时器
                    clearInterval(timer);
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';
            }, 30)
        }
        var div = document.querySelector('div');
        var span = document.querySelector('span');
        //调用函数
        animate(div, 300);
        animate(span, 200);

4.2给不同元素记录不同定时器

//简单动画函数封装obj目标对象 target 目标位置
        //给不同元素指定不同计时器
        function animate(obj, target) {
            //当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多定时器
            //解决方案就是让我们元素只有一个定时器执行
            //先清除以前的定时器,只保留一个计时器
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                if (obj.offsetLeft >= target) {
                    //停止动画,本质是停止计时器
                    clearInterval(obj.timer);
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';
            }, 30)
        }
        var div = document.querySelector('div');
        var span = document.querySelector('span');
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
                animate(span, 200);
            })
            //调用函数
        animate(div, 300);

4.3缓动动画

缓动动画就是让元素运动速度有所变化,最常见的就是让速度慢慢停下来

思路:

1.让盒子每次移动的距离慢慢变小,速度就会慢慢落下来

2.核心算法:(目标值-现在的位置)/10 作为每次移动的距离 步长

3.停止的条件是:让当前盒子位置等于目标位置就停止定时器

 function animate(obj, target) {
            //当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多定时器
            //解决方案就是让我们元素只有一个定时器执行
            //先清除以前的定时器,只保留一个计时器
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                //步长值写道定时器的里面
               // var step = Math.ceil((target - obj.offsetLeft) / 10);
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                if (obj.offsetLeft = target) {
                    //停止动画,本质是停止计时器
                    clearInterval(obj.timer);
                }
                //把每次加1这个步长值改为一个慢慢变小的值 步长公式
                obj.style.left = obj.offsetLeft + step + 'px';
            }, 15)
        }

4.4缓动动画添加回调函数

回调函数写到定时器结束的时候

function animate(obj, target, callback) {
            //console.log(callback); callback=function(){}  调用的时候用callback();
            //当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多定时器
            //解决方案就是让我们元素只有一个定时器执行
            //先清除以前的定时器,只保留一个计时器
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                //步长值写道定时器的里面
                //把步长值改为整数,不要小数
                // var step = Math.ceil((target - obj.offsetLeft) / 10);
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                if (obj.offsetLeft == target) {
                    //停止动画,本质是停止计时器
                    clearInterval(obj.timer);
                    //回到函数写到定时器结束里面
                    if (callback) {
                        callback();
                    }
                }
                //把每次加1这个步长值改为一个慢慢变小的值 步长公式
                obj.style.left = obj.offsetLeft + step + 'px';
            }, 15)
        }
        var div = document.querySelector('div');
        var span = document.querySelector('span');
        var btn500 = document.querySelector('.btn500');
        var btn800 = document.querySelector('.btn800');
        btn500.addEventListener('click', function() {
            animate(span, 500);
        })
        btn800.addEventListener('click', function() {
                animate(span, 800, function() {
                    span.style.backgroundColor = 'red';
                });
            })
            //调用函数

5.移动端特效

5.1触屏touch事件

touchstart 手指触摸到一个DOM元素时触发

touchmove 手指在一个DOM元素上滑动时触发

tochend手指从一个DOM元素上移开时触发

5.2触摸事件对象touchevent

touchstart touchmove tochend 都有各自的事件对象

touchstart{

touches:正在触摸屏幕的所有手指的一个列表

targetTouches:正在触摸当前DOM元素的手指列表,重点记住常用

changedTouches:手指状态发生了改变的列表,从无到有 或者从有到无

//当我们手指离开屏幕的时候,就没有touches和targettouches了

如果监听的是同一个DOM元素则这两个没有区别

}

5.3移动端拖动元素

拖动元素需要当前手指的坐标值 我们可以使用targetTouches[0]里面的pageX和pageY

移动端拖动的原理:手指移动中,计算出手指移动的距离,然后用盒子原来的位置+手指移动的距离

手指移动的距离:手指滑动中的位置减去 手指刚开始触摸的位置

拖动元素三部曲

1.触摸元素touchstart:获取手指初始坐标,同时获得盒子原来的位置

2.移动手指touchmove:计算手指的活动距离,并且移动盒子

3.离开手指touchend:

注意:手指移动也会触发滚动屏幕所以这里要阻止默认的屏幕滚动e.preventDefault();

5.4classlist

返回元素的类名

是以数组的形式返回的

该属性用于元素中添加,移除以及切换类名

element.calsslist.add('three');

是在后面追加类名,不会覆盖以前的类名,注意前面不用加点

div.classlist.remove('one')

切换类名

element.classlist.toggle('bg');

5.5click延时解决方案

移动端click时间会有300ms的延时,原因是移动端屏幕双击会缩放页面

解决方案:1.禁用缩放

2.利用touch时间自己封装这个时间解决300ms延迟

3.使用插件 fastclick

6.swiper插件

1.引入插件

2.按照语法使用

js 移动端视频插件 zy.media.js

7.本地存储

7.1window.sessionStorage

本地存储特性

设置 读取方便 甚至页面刷新不丢失数据

容量大

1.生命周期为关闭浏览器窗口

2.在同一个窗口(页面)下数据可以共享

3.以键值对的形式存储

存储数据

sessionStorage.setItem('uname', val); key value

获取数据

sessionStorage.getItem('uname');key

删除数据

sessionStorage.removeItem('uname');

清空所有数据

sessionStorage.clear();

7.2window.localStorage

生命周期永久生效,除非手动删除,否则关闭页面也会存在

可以多窗口(页面)共享,同一浏览器共享

以键值对的形式存储

 localStorage.setItem('username', val);
localStorage.getItem('username');
localStorage.removeItem('username');
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>

标签:function,定时器,obj,元素,BOM,var,操作,document
From: https://www.cnblogs.com/luckily7/p/17222311.html

相关文章

  • 单核无操作系统如何实现任务并行运行demo之ardiuno读取MPU6050进行oled显示和控制ws28
    实物演示​​视频请转向哔站​​1.起源一直想做一个多种模式显示的灯阵控制小玩意作为床头灯,这样每次一个人在乌漆嘛黑的卧室刷手机时能够给自己带来一丝暖意!!!此外在......
  • Vue利用slice()方法实现分页操作
    Vue利用slice()方法实现分页操作https://blog.csdn.net/pleaseprintf/article/details/129187584系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要......
  • 【小哥132】移动不规则区域器件-绘制package keepout禁止摆放元件区域-恢复元件欠缺部
    移动不规则区域器件:执行移动命令,右键选择方式绘制packagekeepout禁止摆放元件区域:利用DRC查看错误  批量更新封装:前提设置好封装库路径  恢复元件欠缺部......
  • Linux防火墙与端口操作命令
    目录Linux防火墙与端口操作命令1.防火墙操作命令2.端口操作命令3.CentOS7下安装firewallLinux防火墙与端口操作命令CentOS7系统1.防火墙操作命令(1)查看防火墙状......
  • 字符串操作函数总结
    经过一段时间的学习,现在在这里写下这篇博客,以复习字符串操作函数首先我用软件画了一张图,这里面大概的介绍了字符串操作函数的用法,现在我们来详细的学习首先就是strtok函数首......
  • JNA字符串类型操作
    1.返回字符串类型c/c++代码全局变量charretp[1024];constchar*getStr1(inta,intb){memset(retp,0,1024);charoutstr[256];memset(outstr,......
  • 爬虫操作
    目录爬虫操作url网址中文编码解码发送请求携带请求头发送post请求给接口模拟自动登录Requests.sessionpost请求携带数据编码格式返回的response中有哪些数据编码问题爬虫下......
  • 第130篇:BOM(window对象)
    好家伙,本篇为《JS高级程序设计》第十二章"BOM"学习笔记 什么是BOM?BOM(BrowserObjectModel)是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器......
  • 1.1.3操作系统的发展与分类(多道批处理 单道批处理系统 分时操作系统 实时操作系统)
    目录​​1.知识总览​​​​2.手工操作阶段​​​​3.单道批处理系统​​​​4.多道批处理系统​​​​5.多道批处理系统和单道批处理系统比较​​​​6.分时操作系统​​​......
  • 1.1.4操作系统(运行机制与体系结构)
    目录​​1.目录​​​​2.运行机制​​​​ 3.操作系统内核​​​​4.操作系统的体系结构​​1.目录2.运行机制   3.操作系统内核  4.操作系统的体系结构    ......