1. 程式人生 > 其它 >JS4-BOM瀏覽器物件型別

JS4-BOM瀏覽器物件型別

什麼是BOM

瀏覽器的頂級物件

頁面載入事件以及注意事項

定時器函式

JS執行機制

頁面跳轉、重新整理

history、navigator物件

什麼是BOM

瀏覽器物件模型(Browser Object Model),主要作用是提供獨立於內容而與瀏覽器視窗進行互動的物件,核心是window,BOM缺乏標準

對比

DOM BOM

文件物件模型 瀏覽器物件模型

頂級物件的document 頂級物件是window

主要學習操作元素 主要和瀏覽器視窗互動,重新整理跳轉等

W3C BOM是瀏覽器廠商各自定義的,相容性差

BOM的構成

window物件是瀏覽器的頂級物件,具有雙重角色

  • 是JS訪問瀏覽器視窗的一個介面
  • 是一個全域性物件,定義在全域性作用域中的變數、函式都會變成window物件的方法和屬性
  • 在呼叫的時候可以省略window,前面學習的對話方塊alert()、prompt()等
  • window下不要直接定義變數為name,因為有個特殊屬性window.name

window物件常見事件

視窗載入事件

window.onload=function(){}
window.addEventListener=("load",function(){})

window.onload是視窗載入事件,當文件enrich完全載入完成會觸發該事件(包括影象、指令碼檔案、CSS檔案等),就呼叫的處理函式

  1. 有了window.onload就可以把JS程式碼寫到頁面元素的上方,但是寫了多個後只處理最後一個
  2. 如果用addEventListener則沒有限制
document.addEventListener('DOMContentLoaded',function(){})

僅當DOM載入完成時才會觸發,不包含樣式表、圖片、flash等,ie9以上才支援

在頁面圖片很多載入很慢的時候,可以提前獲取互動,保證使用者體驗

調整視窗大小事件

window.onresize=function(){}
window.addEventListener=("resize",function(){})

調整視窗大小事件

  1. 只要視窗帶下發生畫素變化時,就會觸發
  2. 用於響應式佈局;window.innerWidth可以獲得螢幕寬度
        var div = document.querySelector('div');
        window.addEventListener('resize', function () {
            if (window.innerWidth <= 800) {
                div.style.display = 'none';
            }	else {
                div.style.display = 'block';
            }
        })

定時器

兩種定時器

setTimeOut()

window.setTimeout(呼叫函式,[延遲的毫秒數]);

  • 延遲時間可以省略
  • 呼叫函式可以直接寫函式,還可以寫函式名
  • 還有一個寫法'函式名()',不提倡
  • 頁面中可能有很多定時器,我們經常給定時器加識別符號
  function callback() {
            console.log('111');
        }
        var time1 = setTimeout(callback, 3000);
        var time2 = setTimeout(callback, 1000);

回撥函式callback:需要等待時間,時間到了才去呼叫這個函式以前的.onclick=function()裡面的函式也是回撥函式

案例:5s後自動隱藏廣告

        var ad = document.querySelector('.ad');
        setTimeout(function () {
            ad.style.display = 'none';
        }, 5000)

計時器停止:

window.clearTimeout(timeoutID)

setInterval()定時器

window.setInterval(回撥函式,[間隔的毫秒數])

執行過程不同,本函式是每間隔一定時間就執行一次,會不斷執行,setTimeout只執行一次

案例:秒殺倒計時

  • 這個倒計時是不斷變化的 ,因此需要定時器來自動變化(setInterval)
  • 三個盒子分別存放時分秒
  • 三個黑色盒子利用innerHTML放入計算的小時分鐘秒數
  • 最好先呼叫一次函式,防止剛重新整理頁面時出現空白
        var hour = document.querySelector('.hour');
        var minute = document.querySelector('.minute');
        var second = document.querySelector('.second');
        var inputTime = +new Date('2021-3-13 18:00:00');//使用者想輸入的時間
        countDown();//最好先呼叫一次函式,防止剛重新整理頁面時出現空白
        //開啟定時器 每秒都呼叫該函式
        setInterval(countDown, 1000);
        function countDown(time) {
            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;
        }

window.clearInterval();停止定時器

  • 有時外界需要內部的變數,需要在函式外定義物件,可以定義為null

this

指向呼叫它的物件

  1. 全域性作用域下或者普通函式下this指向window;(定時器裡面的this指向window)

  2. 方法呼叫中this指向的是呼叫它的物件

btn.addEventListener('click',function(){})
btn.onclick=function(){};
//都指向btn
  1. 建構函式中this指向建構函式的例項
var fun=new Fun();//this指向fun

JS執行佇列

JS單執行緒

JS是單執行緒語言,同一時間只能做一件事。

單執行緒意味著所有任務需要排隊,如果JS執行事件過長,會造成其他程式碼等待時間過長

為了解決這個問題,HTM5提出了Web Worker標準,允許JS建立多個執行緒,因此出現了同步和非同步

同步和非同步

同步

前一個任務結束後再執行後一個任務,程式的執行順序和任務的排列順序是一致的、同步的

非同步:

做一件事情的時候同時還可以做其他事情

本質區別:這條流水線上各個流程執行順序不同

同步任務:同步任務都在主執行緒上進行,行程一個執行棧

非同步任務:JS的非同步是通過回撥函式實現的,

  1. 普通事件:如click、resize等
  2. 資源載入,如load、error等
  3. 定時器,如setinterval、setTimeout等

非同步任務相關回調函式新增到任務佇列(訊息佇列)中。

JS執行機制

  1. 先執行執行棧中同步任務
  2. 非同步任務放入任務佇列中
  3. 一旦執行棧中所有同步任務執行完畢,系統就會按次序讀取任務佇列中的非同步任務,於是被讀取的非同步任務結束等待狀態,進入執行棧,開始執行

由於主執行緒不斷的獲取任務、執行任務、再獲取任務、再執行任務,這種機制被稱為事件迴圈

Location物件

window物件給我們提供了一個location屬性用於獲取或設定窗體的URL,並且可以用於解析URL。該屬性返回的是一個物件,因此也稱為Location物件

URL

統一資源定位符(Uniform Resource Locator),是網際網路標準資源的地址,網際網路每個檔案都有位移的URL,包含的資訊之處檔案的位置以及瀏覽器該如何處理它

URL一般格式

protocol://host[:port]/path/[?query]#fragment
http://www.itcast.cn/index.html?name=andy&age=18#link
  • protocol 通訊協議 常用的http、ftp、maito等
  • host 主機(域名)
  • port 埠號 可選,省略時使用方案的預設埠,如http的預設埠為80
  • path路徑 由零或多個'/'符號隔開的字串,一般用來表示主機上的一個目錄或檔案地址
  • query 引數 以鍵值對的形式,用&號分割開
  • fragment 片段 #後面內容,常見於連線錨點

Location物件的屬性

location.href 獲取或設定整個URL 可以實現點選某位置跳轉其他頁面

location.host 返回主機(域名)

location.port 返回埠號

location.pathname返回路徑

location.search 返回引數(query)

location.hash 返回片段 #後面內容常見於連結 錨點

案例:5s後自動跳轉頁面

var timer=5;
setInterval(function(){
if(timer==0){
    location.href='http://www.itcast.cn';
}else{
    div.innerHTML='將在'+timeer+'s 後跳轉首頁'; 
    timer--;}
},1000)

案例:提交表單後跳轉到另一個頁面並顯示

  1. 第一個登陸頁面,裡有提交表單,利用action='index.html'提交到第二個頁面,input表單必須有name屬性,作為提交的屬性
  2. 第二個頁面,可以使用第一個頁面的引數,利用了引數的傳遞,從location.search可以得到
  3. location.search得到的是形如 ?name=Andy 的樣式,需要去掉問號(substr(開始的位置,位數)
  4. 還需要利用split('=')分開引數和值

Location常用方法

location.assign 跳轉頁面,記錄瀏覽器歷史,可以使用後退功能

location.replace 跳轉頁面,但是不記錄歷史,無法後退

location.reload 重新載入,相當於重新整理頁面,如果引數為true表示強制重新整理(不讀取快取中圖片,機載較慢),不填表示類似於F5直接重新整理

navigator.userAgent顯示瀏覽器資訊、系統資訊

if((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad|hpwOS|SysbianOS|Windows Phone|UCWEB|BlackBerry|Nokia|RIM|IEMobile|Mobile)/i){
location.href="http://www.cnblogs.com/dying"}
else{
    location.href="";
}

history物件

history.forward() 前進功能

history.back()後退

go() 引數是2表示前進2個頁面,-2表示後退2個頁面

一些OA辦公系統有可能會用到