js獲取URL參數值的幾種方式

示例URL
query:https://editor.csdn.net/?a=1&b=2&c=3
hash:https://editor.csdn.net/#a=4&b=5&c=6

方法一:採用正則表達式獲取地址欄參數 (代碼簡潔,重點正則)

function getUrlParam(name, type = 0) {
  let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"),
      paramHash = window.location.hash.split("#")[1] || "",
      paramSearch = window.location.search.split("?")[1] || "",
      param;

  param = type === 0 ? paramSearch : paramHash;

  let result = param.match(reg);

  if (result != null) {
    return result[2].split("/")[0];
  }
  return null;
}

console.log(getUrlParam('a'));// 1
console.log(getUrlParam('b'));// 2

console.log(getUrlParam('a'), 1);// 4
console.log(getUrlParam('b'), 1);// 5

new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 正則表達式詳解:

  1. 其中的正則表達式用到了字符串拼接
    (^|&) 表示行首或以&開頭
    name 表示傳進來的變量
    = 表示要獲取值的參數名後面的等號
    ([^&]*) 表示非&的任意個字符 (0到多個)
    (&|$) 表示以&結束或者行尾
  2. paramSearchparamHash 得到 URL 中 ?# 後面的內容
    比如 paramSearch 爲: name=hufi&age=18,假設此時傳進來的參數爲 name,則:
    result[0] = "name=hufi&"整個 正則表達式匹配到的內容
    result[1] = "" 是正則表達式中第一個括號匹配到的內容,即 (^|&) 匹配到的內容
    result[2] = "hufi" 是正則表達式中第二個括號匹配到的內容,即 ([^&]*) 匹配到的內容
    result[3] = "&" 是正則表達式中最後一個括號匹配到的內容即 (&|$) 匹配到的內容

方法二:split拆分法 (代碼較複雜,較易理解)

function getRequest() {
   const url = location.search; //獲取url中"?"符後的字串
   let theRequest = new Object();
   if (url.indexOf("?") != -1) {
      let str = url.substr(1);
      let strs = str.split("&");
      for(let i = 0; i < strs.length; i ++) {
      	 let strsArr = strs[i].split("=");
         theRequest[strsArr[0]] = unescape(strsArr[1]);
      }
   }
   return theRequest;
}
console.log(getRequest());
/*
{a: "1", b: "2", c: "3"}
*/

方法三:split拆分法(易於理解,代碼中規)

function getQueryString(name){
    let query = window.location.search.substring(1);
    let vars = query.split("&");
    for (let i = 0; i < vars.length; i++) {
        let pair = vars[i].split("=");
        if(pair[0] == name)
        	{return pair[1];}
   }
   return(false);
}
 console.log(getQueryString('a));// 1
 console.log(getQueryString('b));// 2

方法四:使用URLSearchParams API

它會返回給我們一個 URLSearchParams 對象。

方法
該接口不繼承任何屬性。

  • URLSearchParams.append() 插入一個指定的鍵/值對作爲新的搜索參數。
  • URLSearchParams.delete() 從搜索參數列表裏刪除指定的搜索參數及其對應的值。
  • URLSearchParams.entries() 返回一個iterator可以遍歷所有鍵/值對的對象。
  • URLSearchParams.get() 獲取指定搜索參數的第一個值。
  • URLSearchParams.getAll() 獲取指定搜索參數的所有值,返回是一個數組。
  • URLSearchParams.has() 返回 Boolean 判斷是否存在此搜索參數。
  • URLSearchParams.keys() 返回iterator 此對象包含了鍵/值對的所有鍵名。
  • URLSearchParams.set() 設置一個搜索參數的新值,假如原來有多個值將刪除其他所有的值。
  • URLSearchParams.sort() 按鍵名排序。
  • URLSearchParams.toString() 返回搜索參數組成的字符串,可直接使用在URL上。
  • URLSearchParams.values() 返回iterator 此對象包含了鍵/值對的所有值。

官方示例

var paramsString = "q=URLUtils.searchParams&topic=api"
var searchParams = new URLSearchParams(paramsString);

for (let p of searchParams) {
  console.log(p);
}

searchParams.has("topic") === true; // true
searchParams.get("topic") === "api"; // true
searchParams.getAll("topic"); // ["api"]
searchParams.get("foo") === null; // true
searchParams.append("topic", "webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=api&topic=webdev"
searchParams.set("topic", "More webdev");
searchParams.toString(); // "q=URLUtils.searchParams&topic=More+webdev"
searchParams.delete("topic");
searchParams.toString(); // "q=URLUtils.searchParams"

使用

const params = new URLSearchParams(location.search.replace(/\?/ig, "")); // location.search = "?name=young&sex=male"
params.has("young"); // true
params.get("sex"); // "male"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章