BOM

BOM 浏览器对象模型

  • BOM(Browser Object Model)是指浏览器对象模型,浏览器对象模型提供来独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM 由多个对象组成,其中代表浏览器窗口的 Window 对象是 BOM 的顶层对象,其他对象都是该对象的子对象
  • 我们在浏览器中的一些操作都可以使用 BOM 的方式进行编程处理,比如:刷新浏览器、后退、前进、在浏览器中输入 URL 等。

在全局作用域中定义变量,尽量不要用 name 和 top

对话框
  • alert()
  • prompt()
  • confirm()
    confirm() 这个方法有返回值,根据按钮点击情况,如果点击确定 返回 true,如果点击取消 返回 false

以上方法有兼容问题,不要直接用,最好模拟写一个

onload 事件
  • 我们可以给 window 对象或者 <img> 等元素添加 onload 加载事件,表示只有绑定事件的元素加载完毕才能触发事件,才能执行事件函数
  • 其中 window 对象加载完毕;指的是所有 HTML 结构加载完,并且外部引入资源(js、css、img、视频)也加载完毕。

应用

  • 利用 window.onload 事件,可以将 js 代码提前到 html 结构之前
  • 注意:一个页面只能有一个 window.onload 事件
延时器
  • 延时器是 windos 对象的一个方法,类似于定时炸弹
  • 语法:window.setTimeout(func,time);
  • 第一个参数:延时执行的函数,可以是匿名函数定义,或者是一个函数名的引用,注意不要加()。
  • 第二个参数:延时的时间,以毫秒计数,1000 毫秒等一 1 秒。
  • 功能:在指定的时间后,延迟执行一个函数

清除延时器

  • window 对象的一个方法
  • 语法:window.clearTimeout(timeout);
  • 参数:指定的延时器变量名引用
  • 功能:清除指定的延时器
  • 注意:清除的延时器需要存储到一个变量中,便于后期清除调用

函数节流操作

  • 定义一个开关,给函数上一把锁,true表示锁住状态,不能执行后面的代码,false 表示打开状态,可以执行后面的代码
<body>
    <input type="button" name="" id="btn" value="点">
</body>
<script>
    var btn = document.getElementById("btn");
    var lock = false;
    btn.onclick = function() {
        if (lock) {
            return
        };
    }
    console.log(Math.random());

    lock = true;

    setTimeout(function(){
        lock = false;
    },2000);
</script>
定时器
  • 定时器是 window 对象的一个方法,相当于定时闹钟,每隔固定的时间响一次
  • 语法:window.setInterval(func,interval);
  • 第一个参数:每次执行的函数,可以是匿名函数定义,或者是一个函数名的引用,注意不要加()
  • 第二个参数:时间间隔,以毫秒计数,1000 毫秒等一 1 秒
  • 功能:每隔一个指定的时间,周期性的执行一个函数
var i = 1;
    window.setInterval(function(){
        console.log(i++)
    },500)

清除定时器

  • window 对象的一个方法
  • 语法:window.clearInterval(timer);
  • 参数:指定的定时器变量名引用
  • 功能:清除指定的定时器
  • 注意:清除的定时器需要存储到一个变量中,便于后期清除调用
简单运动

原理

  • 简单运动:是一种视觉暂留效果,只要元素变化过程时间够短,给人眼造成的效果就是一个运动的效果,人眼的视觉残留的时间 0.1 - 0.4 秒之间
  • 制作方法:通过定时器,实现每隔一个极短的时间(50 - 100 毫秒左右),执行函数,函数内部让运动的属性值发生变化
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box{
            position: absolute;
            top: 100px;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: skyblue;
        }
    </style>
</head>
<body>
    <input type="button" value="开始" id="start">
    <div class="box" id="box"></div>
</body>
<script>
    // 简单运动
    // 获取元素
    var start = document.getElementById("start")
    var box = document.getElementById("box")
    // 点击开始按钮,让box像右运动
    // 全局变量存储 left 的属性值,会每次发生变化
    // 信号量,初始值必须与属性初始值一致
    var nowleft = 0;
    // 定时器,制作运动过程
    start.onclick = function () {
        setInterval(function(){
        // 信号量进行自加
        nowleft += 10;
        // 将最新的 nowleft 的值赋值给元素的 css 属性
        box.style.left = nowleft + "px";
    },100);
    };
</script>
</html>

提高运动速度的方法

  • 1、缩短时间间隔,增加了每秒移动的次数
  • 2、加大步长,让每一次走的步长增加

清除定时器的问题

  • 问题1 将定时器的开始和停止过程书写在不同的事件函数内部,容易出现用户错误点击情况
    1 多次点击开始,会造成加速
    2 多次点击开始,不能够再停止

  • 问题2
    要求元素走到指定位置停止,例如让元素停止在 500px 的位置
    如果步长设置的不合理,停止的位置可能不是正好在 500 处

解决

  • 设表先关

  • 每次开启新的定时器之前,都清除一次前面的定时器

  • 拉终停表

  • 在定时器内部每次都要判断是否走到了终点,要不要停止定时器

  • 如果走到或超过了终点,强行拉到终点,并停止定时器

封装动画函数
  • 单一动画
  • 多属性动画
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>封装动画函数</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .box{
            position: absolute;
            top: 100px;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: #0f0;
        }
    </style>
</head>
<body>
    <input type="button" value="开始" id="start">
    <div class="box" id="box"></div>
</body>
<script>
    // 获取元素
    var start = document.getElementById("start");
    var box = document.getElementById("box");
    // 补充 获取计算后样式的方法
    console.log(window.getComputedStyle(box).width)

    // box 是需要运动的元素
    // 多属性运动
    // 共同点:总时间、时间间隔是相同的,自定义
    // 不同点:起始位置(通过程序方法自动获取当前页面最种显示效果)和结束位置(自定义指定的)

    // 函数参数
    // 参数1: 元素对象,它要进行运动
    // 参数2: 结束位置,以对象数据方式传递
    // 参数3: 总时间

    // 调用函数
    animate(box,{left: 400,width: 300,height: 200,opacity: 1},2000);

    // 自定义动画函数
    function animate(ele,end,time){
        // 已知结束位置,总时间,时间间隔 50,缺少起始位置
        // 起始位置要根据结束位置提供的属性进行获取
        // 起始位置的对象,需要先定义一个空对象
        var now = {};
        // start.left = 100;
        // end 对象遍历,获取属性名
        for(var k in end){
            now[k] = parseFloat(window.getComputedStyle(ele)[k]);
        }
        // console.log(start)
        // 自定义时间间隔
        var interval = 50;
        // 计算总次数
        var maxCount = time / interval;
        // 次数累加器
        var count = 0;
        // 对象种的每个属性都有自己的步长,也可以放到一个步长对象种
        var step = {};
        // 遍历结束对象,计算每个属性的步长
        for(var k in end){
            step[k] = (end[k] - now[k]) / maxCount;
        }
        // console.log(step);
        // =============== 准备工作结束,开启定时器 ===============
        var timer;
        timer = setInterval(function(){
            // 让每个属性发生变化,赋值给 now 对象中的每一项
            for(var k in end){
                now[k] += step[k];
            }
            // 累计运动次数
            count++
            // 判断定时器是否结束
            if(count >= maxCount){
                // 拉钟停表
                for(var k in end){
                    now[k] = end[k];
                }
                // nowLeft = endLeft;
                // nowWidth = endWidth;
                clearInterval(timer);
            }
            // 给属性赋值
            // box.style.left = nowLeft + "px";
            // box.style.width = nowWidth + "px";
            for(var k in now){
                // 判断如果是 不透明度属性,不要加 px 单位
                if(k === "opacity"){
                    ele.style[k] = now[k];
                }else{
                    ele.style[k] = now[k] + "px";
                }
            }
        },interval)
    }
</script>
</html>
location 对象
  • location 对象是 window 对象下的一个属性,使用的使用可以省略 window 对象
  • location 可以获取或者设置浏览器地址栏的 URL
URL
  • 统一资源定位符 (Uniform Resource Locator URL)
  • URL的组成:scheme://host:port/path?query#fragment
  • 例如:https://www.baidu.com
  • scheme:通信协议,常用的http ftp maito等
  • host:主机,服务器(计算机)域名系统(DNS)主机名或 IP 地址
  • port:端口号,整数,可选,省略时使用方案的默认端口,如http的默认端口为80
  • path:路径,由零或多个'/'符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
  • query:查询,可选,用于给动态网页传递参数,可有多个参数,用'&'符号隔开,每个参数的名和值用'='符号隔开。例如:name=zs
  • fragment:信息片段,字符串,锚点
history
  • history 对象是 window 对象下的一个属性,使用的时候可以省略 window 对象
  • history 对象可以与浏览器历史记录进行交互,浏览器历史记录是对用户所访问的页面按时间进行的记录和保存
  • back()
  • forward()
  • go()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • BOM的概念 浏览器对象模型,提供了独立于内容的,可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代...
    amanohina阅读 243评论 0 0
  • BOM BOM 是指浏览器对象的模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行交互的对象结构。BOM...
    GongShengM阅读 347评论 0 0
  • 概念 BOM(Browser Object Model) 是指浏览器对象模型,浏览器对象模型提供了独立于内容的、可...
    白棠阅读 179评论 0 0
  • webAPI API:应用程序编程接口 是预先定义的函数,目的是提供应用程序与开发人员基于某个软件或硬件得以访问一...
    你好好想想_be60阅读 316评论 0 1
  • BOM的概念 BOM指浏览器对象模型,BOM由多个对象组成,其中代表浏览器窗口的window对象是BOM的顶层对象...
    安掌门dear阅读 153评论 0 1