BOM (作爲學習筆記)

pink老師 有點意思~

目標

  1. 能夠說出什麼是BOM
  2. 能夠知道瀏覽器的頂級對象 window
  3. 能夠寫出頁面加載時間以及注意事項
  4. 能夠寫出兩種定時器函數並說出區別
  5. 能夠說出 JS執行機制
  6. 能夠使用 location 對象完成頁面之間的跳轉
  7. 能夠知曉 navigator 對象涉及的屬性
  8. 能夠使用 history 提供的方法實現頁面刷新

1. BOM 概述

1.1 什麼是BOM

  1. BOM(Browser Object Model)即瀏覽器對象模型,它提供了獨立於內容而與瀏覽器窗口進行交互的對象,其核心對象是 window
  1. BOM由一系列相關的對象構成,並且每個對象都提供了很多方法和屬性,
  1. BOM 缺乏標準,JavaScript 語法的標準化組織是 ECMA,DOM 的標準化是 W3C,BOM最初是Netscape 瀏覽器的標準的一部分
DOM BOM
文檔對象模型 瀏覽器對象模型
DOM 就是把(文檔)當做一個(對象)來看待 把(瀏覽器)當做一個(對象)來看待
DOM 的頂級對象是 document BOM 的頂級對象是 window
DOM主要學習的是操作頁面元素 BOM 學習的是瀏覽器窗口交互的一些對象
DOM是 W3C 標準規範 BOM 是瀏覽器廠商在各自瀏覽器上定義的,兼容性較差

1.2 BOM的構成

BOM 比DOM 更大,它包含 DOM

在這裏插入圖片描述

widow 對象是瀏覽器的頂級對象,它具有雙重角色

  1. 他是 JS 訪問瀏覽器的窗口的一個接口
  2. 他是一個全局對象,定義在作用域中的變量,函數都會變成 window 對象的屬性和方法。在調用的時候可以省略 window,前面學習的對話框都屬於 window對象方法,如alert(), prompt() 等。

注意:window下的一個特殊屬性 window.name

    <script>
        // window.document.querySelector()
        var num = 10;
        console.log(window.num);

        function fn() {
            console.log(11);

        }
        fn();
        window.fn();

        // alert(11);
        // window.alert(11);
        console.dir(window);

        console.log(window.name);
    </script>

2. window 對象的的常見事件

2.1 窗口(頁面)加載事件(兩種)

window.onload = function(){}

window.addEventListener(‘load’, function() {} )

window.onload 是窗口(頁面)加載事件,當文檔內容完全加載完成會觸發該事件(包括圖像,腳本文件,css文件等),就調用的處理函數

注意:

  1. 有了window.onload 就可以把 JS 代碼寫到頁面的上方,因爲 onload 是等頁面內容全部加載完畢,再去執行處理函數。
  2. window.onload 傳統註冊事件方式只能寫一次,如果有多個,會以最後一個 window.onload 爲準。
  3. 如果使用 addEventListener 則沒有限制

注意:

  1. DOMContentLoaded 事件觸發是,僅當DOM加載完成,不包括樣式表,圖片,flash等等。
  2. ie9以上才支持
  3. 如果頁面的圖片很多的話,從用戶訪問到onload觸發可能需要較長的時間,交互效果就不能實現,必然影響用戶的體驗,此時用DOMContentLoaded 事件比較合適

document.addEventListener(‘DOMContentLoaded’,function() {})

<body>
    <script>
        // 注意:傳統的方式只能識別最後一個

        // window.onload = function() {
        //     var btn = document.querySelector('button');
        //     btn.addEventListener('click', function() {
        //         alert('點擊我');
        //     })
        // }
        // window.onload = function() {
        //     alert('22');
        // }

        // 這種方式可以識別很多個
        window.addEventListener('load', function() {
            var btn = document.querySelector('button');
            btn.addEventListener('click', function() {
                alert('點擊我');
            })
        })

        window.addEventListener('load', function() {
            alert('22');
        })

        document.addEventListener('DOMContentLoaded', function() {
            alert('33');
            // load 等頁面內容全部加載完畢,包含頁面dom元素 圖片 flash css 等等
            // DOMContentLoaded 是 DOM 加載完畢,不包含圖片 flash css 等就可以執行 加載速度比 load 更快一點
        })
    </script>
    <button>點擊</button>
</body>

2.2 調整窗口大小事件

window.onresize = function(){ }

window.addEventListener(“resize”, function(){ });

window.onresize 是調整窗口大小加載事件,當觸發時就調用的處理函數

注意:

  1. 注意只要窗口發生像素變化,就會觸發這個事件。
  2. 我們經常利用這個事件完成響應式佈局。window.innerWidth 當前屏幕的寬度
<body>
    <script>
        window.addEventListener('load', function() {
            var div = document.querySelector('div');
            window.addEventListener('resize', function() {
                console.log(window.innerWidth);
                console.log('變化了');

                if (window.innerWidth <= 800) {
                    div.style.display = 'none';
                } else {
                    div.style.display = 'block';
                }
            })
        })
    </script>
    <div style="width: 100px; height: 100px; background-color: pink;"></div>
</body>

3. 定時器

3.1 兩種定時器

window 對象給我們提供了2個非常好用的方法 - 定時器

3.1.1 setTimeout()

window.setTimeout(調用函數,[延遲的毫秒數]);

setTimeout()方法用於設置一個定時器,該定時器在定時器到期後執行調用函數。
注意:

  1. window 可以省略。
  2. 這個調用函數可以直接寫函數,或者寫 函數名, 或採取字符串 ‘函數名()’ 三種形式,第三種不推薦
  3. 延遲的毫秒數省略默認是0,如果寫,必須是毫秒
  4. 因爲定時器可能有很多,所以我們經常給定時器賦值一個標識符
<body>
    <script>
        // 1. setTimeout
        // 語法規範: window.setTimeout(調用函數,延遲時間);
        // 1. 這個window在調用的時候可以省略
        // 2. 這個延時時間單位是毫秒 但是可以省略,如果省略默認是0
        // 3. 這個時間調用可以直接寫函數 還可以寫函數名 還有一個寫法 '函數名()'
        // 4. 頁面中可能有很多的定時器,我們經常給定時器加個標識符 (起個名字)

        setTimeout(function() { /* 1 */
            console.log('時間到了');
        }, 2000);


        function callback() {
            console.log('爆雜');
        }
        var time1 = setTimeout(callback, 3000); /* 2 */
        var time2 = setTimeout(callback, 5000); /* 2 */

        setTimeout('callback()', 3000); /* 3 */ /* 不提倡 */
    </script>
</body>

拓展1:

  1. setTimeout() 這個調用函數我們也稱爲回調函數 callback
  2. 普通函數是按照代碼順序直接調用
  3. 而這個函數,需要等待時間,時間到了採取調用這個函數,因此稱爲回調函數
  4. 簡單理解:回調,就是回頭調用的意思,上一件事幹完,再回頭調用這個函數
  5. 例 element.onclick = function(){ } 或者 element.addEventListener(“click”, fn);裏面的函數也是回調函數

拓展2:

window.clearTimeout(timeoutID)

clearTimeout() 方法取消了先前通過調用 setTimeout() 建立的定時器。
注意:

  1. window 可以省略
  2. 裏面的參數就是定時器的標識符
<body>
    <button>點擊停止定時器</button>
    <script>
        var btn = document.querySelector('button');

        var timer = setTimeout(function() { /* 1 */
            console.log('時間到了');
        }, 2000);

        btn.addEventListener('click', function() {
            clearTimeout(timer);
        })
    </script>
</body>
3.1.2 setInterval()

setInterval(回調函數,[間隔的毫秒數]);

setInterval() 方法重複調用一個函數,每間隔這個時間,就用一次回調函數。

注意:

  1. window 可以省略。
  2. 這個調用函數可以直接寫函數,或者寫 函數名, 或採取字符串 ‘函數名()’ 三種形式,第三種不推薦
  3. 延遲的毫秒數省略默認是0,如果寫,必須是毫秒
  4. 因爲定時器可能有很多,所以我們經常給定時器賦值一個標識符
<body>
    <button>點擊停止定時器</button>
    <script>
        // 1. setInterval
        // 語法規範: window.setInterval(調用函數, 延遲時間);
        var btn = document.querySelector('button');

        var timer = setInterval(function() { /* 1 */
            console.log('時間到了');
        }, 1000);
        // 2. setTimeout 延遲時間到了,就去調用這個函數,只調用一次 就結束了這個定時器
        // 3. setInterval 每間隔這個延遲時間,就去調用這個回調函數,會調用很多次,重複調用這個函數
    </script>
</body>
  1. 案例:倒計時https://blog.csdn.net/weixin_45773503/article/details/106205120

  2. 清除 setInterval 定時器

<body>
    <button class="begin">開啓定時器</button>
    <button class="stop">停止定時器</button>
    <script>
        var begin = document.querySelector('.begin');
        var stop = document.querySelector('.stop');
        var timer = null; // 定義成全局變量   null是一個空對象  要賦值
        begin.addEventListener('click', function() {
            timer = setInterval(function() {
                console.log('hello');
            }, 1000)
        })
        stop.addEventListener('click', function() {
            clearInterval(timer)
        })
    </script>
</body>

2.1 發送短信案例https://blog.csdn.net/weixin_45773503/article/details/106210439

3.2 this指向問題

<body>
    <button>點擊</button>
    <script>
        // 1. this 指向問題 一般情況下 this 的最終指向全局變量window(注意定時器裏面的this指向window)
        console.log(this);
        window.fn();

        function fn() {
            console.log(this);
        }
        window.setTimeout(function() {
            console.log(this);
        }, 1000);

        // 2. 方法調用中誰調用this指向誰
        var o = {
            sayHi: function() {
                console.log(this);
            }
        }
        o.sayHi();
        var btn = document.querySelector('button');
        // btn.onclick = function() {
        //     console.log(this); // this 指向的是btn這個按鈕
        // }

        btn.addEventListener('click', function() {
                console.log(this);
            })
            // 3. 構造函數中this指向構造函數的實例

        function Fun() {
            console.log(this); // this 指向的是Fun 實例對象
        }

        var fun = new Fun();
        console.log(fun);
    </script>
</body>

4 JS 執行隊列問題

4.1 JS 是單線程

  1. JavaScript 語言的一大特點就是單線程,也就是說,同一個時間只能做一件事。這是因爲JavaScript這門腳本語言誕生的使命所致——JavaScript 是爲了處理頁面中用戶的交互,以及操作 DOM 而誕生的。比如,我們對某個 DOM 元素進行添加和刪除操作,不能同時進行,應該先進行添加,之後在刪除
  2. 單線程就意味着,所有的任務都要排隊,前一個任務結束,纔會執行後一個任務,這樣所導致的問題就是:如果 JS 執行的事件過長,這樣就會造成頁面渲染的不連貫,導致頁面加載阻塞的感覺

引出問題:

    <script>
        console.log(1);

        setTimeout(function() {
            console.log(3);
        }, 1000)

        console.log(2);
    </script>

4.2 同步和異步

爲了解決這個問題,利用多核 CPU 的計算能力,HTML5 提出WEB Worker 標準,允許JavaScript腳本創建多個線程。於是,JS中出現了同步異步

同步
前一個任務結束後再去執行後一個任務,程序的執行順序與任務的排列順序是一致的,同步的,比如做飯的同步做法:先燒水煮飯,等水開了(10分鐘後),再去切菜,炒菜

異步
你在做一件事情的時候,因爲這件事情會花費很長時間,在做這件事情的同事你還可以去處理其他的事情,比如做飯的異步做法:先燒水煮飯,同時切菜,炒菜

他們的本質區別:這條流水線上各個流程的執行順序不同
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

4.3 JS執行機制

在這裏插入圖片描述

5. location 對象

1.什麼是location對象

window對象給我們提供了一個 location 屬性用於 獲取或設置窗體的URL,並且可以用於解析URL。因爲這個屬性返回的是一個對象,所以我們將這個屬性也稱爲 location對象。

2. URL

在這裏插入圖片描述

3. location對象屬性

在這裏插入圖片描述
重點記住:href 和 search

栗子1 點擊跳轉頁面

<body>
    <button>點擊</button>
    <div></div>
    <script>
        var btn = document.querySelector('button');
        var div = document.querySelector('div');
        // 1. 點擊按鈕跳轉
        btn.addEventListener('click', function() {
            location.href = 'http://baidu.com'; // 點擊按鈕跳轉
        })

        // 2. 實現5s後自動跳轉
        fn();
        setInterval(fn, 1000)
        var timer = 5;

        function fn() {
            if (timer == 0) {
                clearInterval(fn)
                location.href = 'http://baidu.com'; // 點擊按鈕跳轉
            } else {
                div.innerHTML = '您將在' + timer + '秒之後跳轉';
                timer--;
            }

        }
    </script>
</body>

栗子2 實現不同頁面之間的數據傳遞

  1. 第一個登陸頁面,裏面有提交表單,action 提交到 index.html頁面
  2. 第二個頁面可以使用第一個頁面的參數,這樣實現了一個數據不同頁面之間的傳遞效果
  3. 第二個頁面之所以可以使用第一個頁面的數據,是利用了URL裏面的location.search參數
  4. 在第二個頁面中,需要把這個參數提取
  5. 第一步去掉 ?利用 substr
  6. 第二步 利用=好分割鍵和值 split(‘=’)

第一個頁面:

<body>
    <form action="index.html">
        用戶名:<input type="text" name='uname'>
        <input type="submit" value="登錄">
    </form>
</body>

第二個頁面:

<body>
    <script>
        console.log(location.search); // uname = andy
        // 1. 先去掉 ?   substr('起始的位置',截取幾個字符);  都是數字不是字符 第二個參數默認爲到末尾
        var params = location.search.substr(1);
        console.log(params);

        // 2. 利用 = 把字符串分割爲數組 split('=');
        var arr = params.split('=');
        // console.log(arr);
        document.write(arr[1] + '歡迎您!')
    </script>
</body>

4. location對象方法

location隊形方法 返回值
location.assign() 跟 href 一樣,可以跳轉頁面(也稱爲重定向頁面)
location.replace 替換當前頁面,因爲不記錄歷史,所以不能後退頁面
location.reload() 重新加載頁面,相當於刷新按鈕或者 f5 如果參數爲 true 強制刷新 ctrl+f5
<body>
    <button>點擊</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            // 記錄瀏覽歷史。可以後退
            // location.assign('http://www.baidu.com');

            // 不記錄瀏覽歷史,所以不能實現後退
            // location.replace('http://baidu.com');

            // 刷新
            location.reload(true);
        })
    </script>
</body>

6. navigator 對象

在這裏插入圖片描述

7. history 對象

1. 方法

在這裏插入圖片描述

2. 栗子:

index:

<body>
    <a href="list.html">點擊我去往list頁</a>
    <button>前進</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            history.forward();
            //history.go(1);/* 向後一個頁面 */
        })
    </script>
</body>

list:

<body>
    <a href="index.html">點擊我去往首頁</a>
    <button>後退</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            history.back();
            //history.go(-1);
        })
    </script>
</body>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章