通過 js 獲取 QueryString (location.search部分) 參數很常見,網上代碼也滿天飛。
不過現在的框架,基本上都通過路由偽靜態了,把以前的 QueryString 變成了
pathname (location.pathname部分) 路徑參數了。
例如:/index.html?id=22&name=abc
很多框架都是渲染為 /index/id/22/name/abc.html
那么怎么獲取 pathname 級的參數呢?有人覺得改下 QueryString 代碼的正則即可。
雖然可以,但是比較麻煩,而且正則寫的不嚴謹,可能匹配不精確,導致有些參數匹配不到。
其實無論是 QueryString,pathname,用正則都不是最合理的,而應該采取 split 大法。
為什么這么說呢,我舉個例子,大家就會明白了。
例如 /index.html?id=22&name=abc&DEBUG
例如 /index/id/22/name/ab.cd?DEBUG
正則都很難處理這的情況,QueryString 到還好,pathname 的,就糾結的要死了。
這種情況,我們就應該祭出 split 大法來處理這些煩人的問題了。
由於 split 無論是否分割成功,都會返回數組,所以最合適處理這樣的問題。
1 /** 2 * 獲取 QueryString 3 * @param {string} [name] 參數名,可空 4 * @param {string} [search] search部分值,可空 5 * @return {string|object} 值或整個對象 6 */ 7 function getQueryString(name, search) { 8 var url = search || location.search; 9 var params = {}; 10 11 if (url.indexOf('?') != -1) { 12 var arr = url.substring(1).split('&'); // 分割參數 13 for(var i = 0, l = arr.length; i < l; i ++) { // 遍歷參數 14 var kv = arr[i].split('='); // 分隔鍵值對 15 params[kv.shift()] = kv.length ? decodeURIComponent(kv.join('=')) : undefined; // 如果有值就解碼存儲 16 } 17 } 18 19 return name ? params[name] : params; // 輸出 name 的值或整個參數對象 20 } 21 22 // 假設 search 值為 ?uid=KB1R+qyhl24II350DQ=&name=abc&DEBUG 23 console.log( getQueryString() ); // => {uid: "KB1R+qyhl24II350DQ=", name: "abc", DEBUG: undefined} 24 console.log( getQueryString('uid') ); // => KB1R+qyhl24II350DQ= 25 // 或 26 console.log( getQueryString('name', '?uid=KB1R+qyhl24II350DQ=&name=abc&DEBUG') ); // => abc
1 /** 2 * 獲取 pathname 3 * @param {string} [name] 參數名,可空 4 * @param {string} [path] pathname部分值,可空 5 * @return {string|object} 值或整個對象 6 */ 7 function getPathNmae(name, path) { 8 var params = {}; 9 path = (path || location.pathname) 10 .split('.html')[0] // 獲取 .html 之前的部分 11 .split('/'); // 分隔目錄 12 13 while (path.length) { // 從后遍歷數組 14 var val = path.pop(); // 得到值 15 var key = path.pop(); // 得到鍵 16 17 if (key) { 18 params[key] = decodeURIComponent(val); // 解碼存儲 19 } 20 } 21 22 return name ? params[name] : params; // 輸出name的值或整個參數對象 23 } 24 25 // 假設 pathname 值為 /index/id/22/name/abc.html 26 console.log( getPathNmae() ); // {id: "22", name: "abc"} 27 console.log( getPathNmae('name') ); // abc 28 // 或 29 console.log( getPathNmae('name', '/index/id/22/name/abc.html') ); // abc