如何用BOM獲取當前頁面的URL?

獲取當前頁面的完整url最直接的方法是使用window.location.href屬性。1. window.location.href返回包含協議、主機名、路徑、查詢參數和哈希值的完整url字符串;2. window.location對象還提供多個屬性用于獲取url的不同部分,如protocol、host、hostname、port、pathname、search、hash和origin;3. 使用urlsearchparams可解析和操作查詢參數,通過get、has、set等方法處理鍵值對,并自動管理編碼解碼;4. 在處理url時需注意編碼與解碼、相對路徑與絕對路徑的區別xss安全風險、以及url長度限制等問題,以確保代碼的安全性和健壯性。

如何用BOM獲取當前頁面的URL?

要獲取當前頁面的完整URL,最直接、最常用的方法就是利用瀏覽器對象模型(bom)中的window.location.href屬性。它會返回一個包含協議、主機名、路徑、查詢參數和哈希值在內的完整字符串。

如何用BOM獲取當前頁面的URL?

解決方案

當我們需要獲取當前頁面的URL時,JavaScript提供了非常便捷的途徑。核心就在于window.location對象。這個對象是BOM(Browser Object Model)的一部分,它封裝了當前窗口的URL信息。

如何用BOM獲取當前頁面的URL?

最簡單粗暴,也最直接有效的方式,就是使用window.location.href。它會返回一個字符串,這個字符串就是當前瀏覽器地址欄里顯示的完整URL。

舉個例子,如果你當前在https://www.example.com/products?id=123#section這個頁面,那么:

如何用BOM獲取當前頁面的URL?

const currentUrl = window.location.href; console.log(currentUrl); // 輸出: "https://www.example.com/products?id=123#section"

這幾乎是所有前端開發者獲取當前URL的首選。它干凈利落,一步到位。當然,window.location對象還有很多其他屬性,可以幫助我們更細致地獲取URL的各個部分,這在很多場景下非常有用。

BOM中獲取URL的常用屬性有哪些?

除了window.location.href這個“全能型”選手,window.location對象其實是一個寶藏,它把URL拆解成了好幾個更小的、更具體的屬性,方便我們按需取用。我個人在開發中經常會用到它們,尤其是在需要根據URL的某個部分做邏輯判斷時。

  • window.location.protocol: 獲取URL的協議部分,比如”http:”或”https:”。注意,它會包含冒號。
  • window.location.host: 獲取主機名和端口號的組合,比如”www.example.com:8080″。如果沒有指定端口,則不會顯示。
  • window.location.hostname: 僅獲取主機名,比如”www.example.com”。這是我判斷當前域名最常用的。
  • window.location.port: 獲取端口號,比如”8080″。如果使用默認端口(HTTP 80, HTTPS 443),這個屬性通常是空字符串。
  • window.location.pathname: 獲取URL的路徑部分,從根目錄開始,比如”/products”。這個在路由匹配時特別有用。
  • window.location.search: 獲取URL的查詢字符串部分,以問號?開頭,比如”?id=123&name=test”。
  • window.location.hash: 獲取URL的哈希(片段標識符)部分,以井號#開頭,比如”#section”。這個常用于單頁應用(SPA)的內部導航。
  • window.location.origin: 獲取協議、主機名和端口號的組合,類似于protocol + ‘//’ + host。例如”https://www.example.com”。這是一個相對較新的屬性,但非常好用,因為它直接提供了“源”的信息,對于跨域請求的判斷尤其方便。

舉個例子,假設當前URL是https://www.example.com:8080/path/to/page?query=abc#fragment:

console.log(window.location.protocol); // "https:" console.log(window.location.host);     // "www.example.com:8080" console.log(window.location.hostname); // "www.example.com" console.log(window.location.port);     // "8080" console.log(window.location.pathname); // "/path/to/page" console.log(window.location.search);   // "?query=abc" console.log(window.location.hash);     // "#fragment" console.log(window.location.origin);   // "https://www.example.com:8080"

這些屬性的組合使用,幾乎可以滿足所有對URL進行分析和操作的需求。

如何解析和操作URL參數?

獲取到window.location.search之后,我們通常會面臨一個問題:如何把像?id=123&name=test這樣的字符串,解析成我們可以在代碼中方便使用的鍵值對?以前,大家可能會手寫一些字符串分割和循環的邏輯,甚至用正則。但現在,瀏覽器提供了一個更現代、更強大的API:URLSearchParams。

URLSearchParams接口提供了一種簡單的方法來處理URL的查詢字符串。它就像一個map對象,可以輕松地添加、刪除、獲取和遍歷URL參數。我個人覺得,有了它,處理URL參數的那些繁瑣工作簡直是解放了。

要使用它,你可以直接傳入window.location.search:

const params = new URLSearchParams(window.location.search);  // 獲取特定參數的值 const userId = params.get('id'); console.log('用戶ID:', userId); // 如果URL是 ?id=123,則輸出 "用戶ID: 123"  const userName = params.get('name'); console.log('用戶名:', userName); // 如果URL是 ?name=Alice,則輸出 "用戶名: Alice"  // 檢查某個參數是否存在 if (params.has('debug')) {     console.log('調試模式已開啟'); }  // 遍歷所有參數 console.log('所有參數:'); for (const [key, value] of params.entries()) {     console.log(`${key}: ${value}`); }  // 添加或修改參數 params.set('source', 'website'); params.append('tag', 'new'); // append會保留同名參數,set會覆蓋 console.log('修改后的查詢字符串:', params.toString()); // 會輸出類似 "id=123&name=test&source=website&tag=new"

如果你需要構建一個新的URL查詢字符串,URLSearchParams也同樣方便:

const newParams = new URLSearchParams(); newParams.set('page', '2'); newParams.set('sort', 'price'); console.log(newParams.toString()); // 輸出 "page=2&sort=price"

然后你可以把這個字符串拼接到新的URL中。URLSearchParams會自動處理URL編碼/解碼,這大大減少了出錯的可能性,也省去了我們手動調用encodeURIComponent和decodeURIComponent的麻煩。強烈推薦使用這個API來處理URL參數,它讓代碼更清晰、更健壯。

獲取URL時可能遇到的挑戰與安全考量?

雖然獲取URL看起來很簡單,但實際開發中,還是有一些細節和潛在的問題需要我們留意。這不僅僅是技術實現的問題,有時也涉及到用戶體驗和安全性。

  • URL編碼與解碼: 當URL中包含非ASCII字符(如中文)或特殊字符(如空格、&、=等)時,它們會被URL編碼。例如,空格會變成%20,中文字符會變成%E4%BD%A0%E5%A5%BD。雖然window.location.href返回的是已編碼的完整URL,但當你從window.location.search中取出參數值時,如果這些值本身是編碼過的,你可能需要使用decodeURIComponent()來解碼,以便獲取原始的、可讀的字符串。URLSearchParams在獲取值時通常會自動解碼,但在手動處理時要特別注意。

    // 假設URL是 ?query=%E4%BD%A0%E5%A5%BD const searchParams = new URLSearchParams(window.location.search); console.log(searchParams.get('query')); // 自動解碼: "你好"  // 如果是手動解析 const encodedValue = '%E4%BD%A0%E5%A5%BD'; console.log(decodeURIComponent(encodedValue)); // "你好"
  • 相對路徑與絕對路徑: window.location.href總是返回絕對路徑。但在某些情況下,如果你的頁面中使用了標簽來定義基礎URL,那么頁面內部的一些相對路徑(如標簽的href、如何用BOM獲取當前頁面的URL?標簽的src)可能會受到影響。window.location屬性不受標簽的影響,它始終反映瀏覽器地址欄中的URL。這是一個容易混淆的點,我曾因此踩過坑,以為頁面上的相對鏈接會直接拼接在window.location.pathname后面,結果發現并不是。

  • URL的安全性考量(XSS風險): 直接獲取URL本身通常不是安全風險,但當你將URL的某個部分(尤其是查詢參數或哈希值)不加過濾地直接顯示在頁面上,或者用于構建新的html、JavaScript代碼時,就可能引入跨站腳本攻擊(XSS)的風險。惡意用戶可以通過構造包含惡意腳本的URL,來竊取用戶信息或進行其他破壞。

    例如,如果你的代碼是這樣: document.getElementById(‘welcomeMessage’).innerHTML = ‘歡迎,’ + new URLSearchParams(window.location.search).get(‘name’); 如果惡意用戶訪問your-site.com/?name=<script>alert(‘hack’);</script>,那么頁面上就會執行這個惡意腳本。 最佳實踐是: 任何從URL中獲取并用于頁面渲染或代碼執行的數據,都必須進行嚴格的輸入驗證和輸出編碼(如HTML實體編碼)。這與獲取URL本身無關,而是與如何使用獲取到的數據有關。

  • URL長度限制: 盡管現代瀏覽器對URL的長度限制放寬了很多(通常在2000-8000個字符之間,取決于瀏覽器),但理論上仍然存在上限。如果你的應用需要傳遞大量數據通過URL參數,可能需要考慮使用POST請求或其他存儲方式(如LocalStorage、sessionstorage)來避免URL過長的問題。

理解這些細節,能幫助我們更健壯、更安全地利用BOM來處理URL,避免一些不必要的麻煩。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享