获取url参数 向url字符串追加参数

4,841 阅读1分钟

获取Url 参数

背景

很多时候,我们需要获取另外一个页面url传过来的参数。

可以手动传入url 或者使用默认的location.href(search);

由于uri很多时候特殊字符会有歧义,一般的url 需要经过encodeURI、encodeURIComponent、decodeURI、decodeURIComponent编码和解码 URI

encodeURI 和 decodeURI 函数操作的是完整的 URI;这俩函数假定 URI 中的任何保留字符都有特殊意义,所有不会编码它们。

encodeURIComponent 和 decodeURIComponent 函数操作的是组成 URI 的个别组件;这俩函数假定任何保留字符都代表普通文本,所以必须编码它们,所以它们(保留字符)出现在一个完整 URI 的组件里面时不会被解释成保留字符了。

实现:

/**
* @param {string} url
* @return { [key:string]:string}
*/
/** 获取url参数 */
var getUrlQuery = funtion(_url) {
  const url = _url || window.location.search(window.location.href) || '';
  const result = {};
  if(url === '') return result;
  const pairs = url.inderxOf('?') > -1 ? url.split('?')[1].split('&') : [];
  pairs.map((item, index, arr) => {
      // 只查找到第一个"="符号,这样就不会把token中等号也裁剪掉
      const index = item.indexOf('=');
      const name = item.substr(0, index);
      const value = item.substr(index + 1);
      value = decodeURIComponet(value);
      result[name] = value;
  });
 retutrn result;
}



向url字符串追加参数

很多时候我们进行get请求添加query参数,或则状态页面转移的时候,需要给url 添加param

/**
 * @param param { [key:string]:any}
 * @param url {string}
 * @return {string}
 */
 const addQueryToUrl = function(param,url) {
  if(!url) return '';
  if(!param || !Object.keys(param).length) return url;
  let _url = url;
  // 有问号提出url并添加至obj,没问号用原url
  if (url.indexOf('?') > -1) {
    param = Object.assign(
      {},
      {
        ...param,
        ...getUrlQuery(url),
      },
    );
    _url = url.split('?')[0];
  } 
  let result = '?';
  for(const key in param) {
     if(param[key] !== undefined && param[key] !== null) {
       result += `${key}=${param[key]}&`;
     }
  }
  // 去除最后一个& 并返回
  return `${_url}${result.slice(0, -1)}`
}