搜尋
首頁web前端js教程深入淺析JavaScript進階BOM技術

這篇文章為大家帶來了關於JavaScript中BOM的相關知識,BOM 由一系列相關的物件構成,每個物件都提供了許多方法與屬性,希望對大家有幫助。

深入淺析JavaScript進階BOM技術

目錄概述

深入淺析JavaScript進階BOM技術

#1、BOM概述

  • BOM = Browser Object Model 瀏覽器物件模型
  • 它提供了獨立於內容而與瀏覽器視窗互動的物件,其核心物件是window
  • BOM由一系列相關的物件構成,每個物件都提供了許多方法與屬性
  • BOM 缺乏標準,JavaScript 語法的標準化組織是ECMA, DOM 的標準化組織是W3C, BOM最初是Netscape 瀏覽器標準的一部分
DOM BOM
文件物件模型 瀏覽器物件模型
DOM 就是把文件當作一個物件來看待 瀏覽器當作一個物件來看
#DOM 的頂層物件是document BOM 的頂層物件是window
DOM 主要學習的是操作頁面元素 BOM 學習的是瀏覽器視窗互動的一些對象
DOM 是W3C 標準規格 BOM 是瀏覽器廠商在各自瀏覽器上定義的,相容性較差

1.1、BOM的構成

深入淺析JavaScript進階BOM技術

  • #BOM 比 DOM 更大。它包含 DOM。

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

  • ##它是JS 訪問瀏覽器窗口的一個介面

  • 它是一個全域物件。定義在全域作用域中的變數、函數都會變成window 物件的屬性和方法

  • #在呼叫的時候可以省略window,前面學習的對話方塊都屬於window 物件方法,如

    alert()、prompt()等。

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

// 定义在全局作用域中的变量会变成window对象的属性
var num = 10;
console.log(window.num);
// 10

// 定义在全局作用域中的函数会变成window对象的方法
function fn() {
    console.log(11);
}
console.fn();
// 11

var name = 10;  //不要用这个name变量,window下有一个特殊属性window.name
console.log(window.num);

2、window 物件的常見事件

2.1、視窗載入事件

#window.onload是視窗(頁面)載入事件,當文件內容完全載入完成會觸發該事件(包括圖像,腳本文件,CSS文件等),就呼叫的處理函數。

window.onload = function(){
    };// 或者window.addEventListener("load",function(){});

注意:

  • 有了

    window.onload就可以把JS程式碼寫到頁面元素的上方

  • 因為

    onload是等頁面內容全部載入完畢,再去執行處理函數

  • window.onload 傳統註冊事件方式,只能寫一次

  • 如果有多個,會以最後一個

    window.onload為準

  • 如果使用addEventListener 則沒有限制

document.addEventListener('DOMContentLoaded',function(){})
接收兩個參數:

  • DOMCountentLoaded事件觸發時,僅當DOM加載完成,不包括樣式表,圖片,flash等等

  • 如果頁面的圖片很多的話, 從用戶訪問到onload觸發可能需要較長的時間

  • 互動效果就無法實現,必然影響使用者的體驗,此時用

    DOMContentLoaded事件比較適合。

2.1.1、區別

  • #load等頁面內容全部載入完畢,包括頁面dom元素,圖片,flash,css等等
  • DOMContentLoaded 是DOM載入完畢,不包含圖片flash css 等就可以執行,載入速度比load更快一些
<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 加载完毕,不包含图片 falsh css 等就可以执行 加载速度比 load更快一些</script>

2.2 、調整視窗大小事件

window.onresize 是調整視窗大小載入事件,當觸發時就呼叫的處理函數

window.onresize = function() {}// 或者window.addEventListener('resize',function(){});
    只要窗口大小會發生像素變化,就會觸發這個事件
  • 我們經常利用這個事件完成響應式佈局。
  • window.innerWidth 目前螢幕的寬度
    <script>
        window.addEventListener('load', function() {
            var p = document.querySelector('p');
            window.addEventListener('resize', function() {
                console.log(window.innerWidth);

                console.log('变化了');
                if (window.innerWidth <= 800) {
                    p.style.display = 'none';
                } else {
                    p.style.display = 'block';
                }

            })
        })
    </script>
    <p></p>

3、計時器

window 物件給我們提供了兩個計時器

  • setTimeout()
  • setInterval()

3.1、setTimeout()定時器

setTimeout()方法用於設定計時器,該定時器在計時器到期後執行呼叫函數。

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

注意

  • window可以省略
  • 這個呼叫函數
    • 可以直接寫函數
    • 或寫函數名稱
    • 或採取字串
    • '函數名()'(不推薦)
  • 延遲的毫秒數省略預設是0,如果寫,必須是毫秒
  • 因為計時器可能有很多,所以我們經常給定時器賦值一個標識符
  • setTimeout() 這個呼叫函數我們也稱為回呼函數callback
  • 普通函數就是依照程式碼順序直接調用,而這個函數,需要等待事件,事件到了才會去調用這個函數,因此稱為回調函數。
    <script>
        // 1. setTimeout 
        // 语法规范:  window.setTimeout(调用函数, 延时时间);
        // 1. 这个window在调用的时候可以省略
        // 2. 这个延时时间单位是毫秒 但是可以省略,如果省略默认的是0
        // 3. 这个调用函数可以直接写函数 还可以写 函数名 还有一个写法 '函数名()'
        // 4. 页面中可能有很多的定时器,我们经常给定时器加标识符 (名字)
        // setTimeout(function() {
        //     console.log('时间到了');

        // }, 2000);
        function callback() {
            console.log('爆炸了');

        }
        var timer1 = setTimeout(callback, 3000);
        var timer2 = setTimeout(callback, 5000);
        // setTimeout('callback()', 3000); // 我们不提倡这个写法
    </script>

3.2、clearTimeout()停止計時器

  • clearTimeout()方法取消了先前透過呼叫setTimeout()建立的計時器##
    window.clearTimeout(timeoutID)
注意

    window
  • 可以省略 裡面的參數就是計時器的識別碼
  •     <button>点击停止定时器</button>
        <script>
            var btn = document.querySelector('button');
            var timer = setTimeout(function() {
                console.log('爆炸了');
            }, 5000);
            btn.addEventListener('click', function() {
                clearTimeout(timer);
            })
        </script>
3.3、setInterval()計時器

    setInterval()
  • 方法重複呼叫一個函數,每隔這個時間,就去呼叫一次回呼函數
    window.setInterval(回调函数,[间隔的毫秒数]);
    #window
  • 可以省略#這個回呼函數:
  • 可以直接寫函數
    • 或寫函數名稱
    • 或是採取字元'函數名稱()'
    第一次執行也是間隔毫秒數之後執行,之後每隔毫秒數就執行一次
  •     <script>
            // 1. setInterval 
            // 语法规范:  window.setInterval(调用函数, 延时时间);
            setInterval(function() {
                console.log('继续输出');
    
            }, 1000);
            // 2. setTimeout  延时时间到了,就去调用这个回调函数,只调用一次 就结束了这个定时器
            // 3. setInterval  每隔这个延时时间,就去调用这个回调函数,会调用很多次,重复调用这个函数
        </script>
#3.4、clearInterval()停止定時器

    clearInterval ( )
  • 方法取消了先前透過呼叫setInterval() 建立的定時器
  • ##注意

  • window可以省略
  • 里面的参数就是定时器的标识符
    <button>开启定时器</button>
    <button>停止定时器</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('ni hao ma');

            }, 1000);
        })
        stop.addEventListener('click', function() {
            clearInterval(timer);
        })
    </script>

3.5、this指向

  • this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁

现阶段,我们先了解一下几个this指向

  • 全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window)
  • 方法调用中谁调用this指向谁
  • 构造函数中this指向构造函数实例
    <button>点击</button>
    <script>
        // this 指向问题 一般情况下this的最终指向的是那个调用它的对象

        // 1. 全局作用域或者普通函数中this指向全局对象window( 注意定时器里面的this指向window)
        console.log(this);

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

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

        }, 1000);
        // 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这个按钮对象

        // }
        btn.addEventListener('click', function() {
                console.log(this); // this指向的是btn这个按钮对象

            })
            // 3. 构造函数中this指向构造函数的实例
        function Fun() {
            console.log(this); // this 指向的是fun 实例对象

        }
        var fun = new Fun();
    </script>

4、JS执行机制

4.1、JS是单线程

  • JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这是因为 Javascript 这门脚本语言诞生的使命所致——JavaScript 是为处理页面中用户的交互,以及操作 DOM 而诞生的。比如我们对某个 DOM 元素进行添加和删除操作,不能同时进行。 应该先进行添加,之后再删除。
  • 单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。这样所导致的问题是: 如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

4.2、一个问题

以下代码执行的结果是什么?

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

那么以下代码执行的结果又是什么?

console.log(1);setTimeout(function() {
    console.log(3);},0);console.log(2);

4.3、同步和异步

  • 为了解决这个问题,利用多核 CPU 的计算能力,HTML5 提出 Web Worker 标准,允许 JavaScript 脚本创建多个线程
  • 于是,JS 中出现了同步和异步。
  • 同步:
    • 前一个任务结束后再执行后一个任务
  • 异步
    • 在做这件事的同时,你还可以去处理其他事情

同步任务

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

异步任务

  • JS中的异步是通过回调函数实现的
  • 异步任务有以下三种类型
    • 普通事件,如click,resize
    • 资源加载,如load,error
    • 定时器,包括setInterval,setTimeout
  • 异步任务相关回调函数添加到任务队列

深入淺析JavaScript進階BOM技術

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

深入淺析JavaScript進階BOM技術

此时再来看我们刚才的问题:

console.log(1);setTimeout(function() {
    console.log(3);},1000);console.log(2);
  • 执行的结果和顺序为 1、2、3
console.log(1);setTimeout(function() {
    console.log(3);},0);console.log(2);
  • 执行的结果和顺序为 1、2、3
// 3. 第三个问题console.log(1);document.onclick = function() {
    console.log('click');}console.log(2);setTimeout(function() {
    console.log(3)}, 3000)

深入淺析JavaScript進階BOM技術

同步任务放在执行栈中执行,异步任务由异步进程处理放到任务队列中,执行栈中的任务执行完毕会去任务队列中查看是否有异步任务执行,由于主线程不断的重复获得任务、执行任务、再获取任务、再执行,所以这种机制被称为事件循环( event loop)。

5、location对象

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

5.1、url

==统一资源定位符(uniform resouce 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 主机(域名) www.itheima.com
port 端口号,可选
path 路径 由零或多个'/'符号隔开的字符串
query 参数 以键值对的形式,通过&符号分隔开来
fragment 片段 #后面内容 常见于链接 锚点

5.2、location对象属性

location对象属性 返回值
location.href 获取或者设置整个URL
location.host 返回主机(域名)www.baidu.com
location.port 返回端口号,如果未写返回空字符串
location.pathname 返回路径
location.search 返回参数
location.hash 返回片段 #后面内容常见于链接 锚点

重点记住:hrefsearch

需求:5s之后跳转页面

    <button>点击</button>
    <p></p>
    <script>
        var btn = document.querySelector('button');
        var p = document.querySelector('p');
        var timer = 5;
        setInterval(function() {
            if (timer == 0) {
                location.href = 'http://www.itcast.cn';
            } else {
                p.innerHTML = '您将在' + timer + '秒钟之后跳转到首页';
                timer--;
            }

        }, 1000);
    </script>

5.3、location对象方法

location对象方法 返回值
location.assign() 跟href一样,可以跳转页面(也称为重定向页面)
location.replace() 替换当前页面,因为不记录历史,所以不能后退页面
location.reload() 重新加载页面,相当于刷新按钮或者 f5 ,如果参数为true 强制刷新 ctrl+f5
    <button>点击</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            // 记录浏览历史,所以可以实现后退功能
            // location.assign('http://www.itcast.cn');
            // 不记录浏览历史,所以不可以实现后退功能
            // location.replace('http://www.itcast.cn');
            location.reload(true);
        })
    </script>

5.4、获取URL参数

我们简单写一个登录框,点击登录跳转到 index.html

    
        用户名:               

接下来我们写 index.html

    <p></p>
    <script>
        console.log(location.search); // ?uname=andy
        // 1.先去掉?  substr('起始的位置',截取几个字符);
        var params = location.search.substr(1); // uname=andy
        console.log(params);
        // 2. 利用=把字符串分割为数组 split('=');
        var arr = params.split('=');
        console.log(arr); // ["uname", "ANDY"]
        var p = document.querySelector('p');
        // 3.把数据写入p中
        p.innerHTML = arr[1] + '欢迎您';
    </script>

这样我们就能获取到路径上的URL参数

6、navigator对象

  • navigator 对象包含有关浏览器的信息,它有很多属性
  • 我们常用的是userAgent,该属性可以返回由客户机发送服务器的user-agent头部的值

下面前端代码可以判断用户是用哪个终端打开页面的,如果是用 PC 打开的,我们就跳转到 PC 端的页面,如果是用手机打开的,就跳转到手机端页面

if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
    window.location.href = "";     //手机
 } else {
    window.location.href = "";     //电脑
 }

7、history对象

  • window 对象给我们提供了一个 history 对象,与浏览器历史记录进行交互
  • 该对象包含用户(在浏览器窗口中)访问过的 URL。
history对象方法 作用
back() 可以后退功能
forward() 前进功能
go(参数) 前进后退功能,参数如果是 1 前进1个页面 如果是 -1 后退1个页面
    <a>点击我去往列表页</a>
    <button>前进</button>
    <script>
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            // history.forward();
            history.go(1);
        })
    </script>

相关推荐:javascript学习教程

以上是深入淺析JavaScript進階BOM技術的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

如何安裝JavaScript?如何安裝JavaScript?Apr 05, 2025 am 12:16 AM

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器