UNPKG

@ivujs/i-utils

Version:

前端模块化 JavaScript 工具库

244 lines (241 loc) 8.78 kB
import { REGEXP } from '../constants/regexp.mjs'; import { isArray } from '../validate/index.mjs'; import { arrayInsertBefore, arrayInsertAfter } from '../array/index.mjs'; /** * @module 浏览器Url */ /** * 获得协议名 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回协议名 */ function getProtocol(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return match[1]; } } /** * 获得主机地址 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回主机地址 */ function getHost(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return (match[2] || "") + (match[3] ? ":" + match[3] : ""); } } /** * 获得主机名称 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回主机名称 */ function getHostName(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return match[2]; } } /** * 获得端口号 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回端口号 */ function getPort(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return match[3]; } } /** * 获得地址路径 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回地址路径 */ function getUrlPath(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return match[4]; } } /** * 获得hash字符串 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回hash字符串 */ function getUrlHash(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return match[6]; } } /** * 获得查询参数字符串 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回查询参数字符串 */ function getSearchString(url = window.location.href) { const match = url.match(REGEXP.URL); if (match) { return match[5]; } } /** * 查询参数字符串中是否包含某个参数 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @returns {boolean} 返回结果 */ function hasSearchParam(url = window.location.href, name) { const params = parseSearchParam(url); return params[name] !== undefined; } /** * 查询参数字符串中获得某个参数的值 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @returns {string} 返回查询到的值 */ function getSearchParam(url = window.location.href, name = "") { name = name.replace(/[[\]]/g, "\\$&"); url = getSearchString(url) || ""; const reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); const match = url.substring(0).match(reg); if (match) { return decodeURIComponent(match[2]); } } /** * 查询参数字符串中设置某个参数的值 * @param {string} name 参数名 * @param {string|number|Array} value 参数值,如果是数组,则解析为:&ids[0]=1&ids[2]=2 * @param {string} url url地址,默认当前url地址 * @returns {string} 返回查询参数字符串 */ function setSearchParam(url = window.location.href, name = "", value) { const params = parseSearchParam(url); params[name] = value; // 返回替换后的url return url.replace(/(\?.+?)(?=#|$)/, "?" + stringifySearchParam(params)); } /** * 查询参数字符串转为对象 * @param {string} url url地址,默认当前url地址 * @returns {Object} 返回参数对象 */ function parseSearchParam(url = window.location.href) { const searchString = getSearchString(url) || ""; const searchArr = searchString.split("&"); const param = {}; for (let i = 0; i < searchArr.length; i++) { const arr = searchArr[i].split("="); param[decodeURIComponent(arr[0])] = decodeURIComponent(arr[1] || ""); } return param; } /** * 对象转为查询参数字符串 * @param {Object} params 参数对象 * @param {string} url url地址,如果不为空,则会拼接好查询参数字符串的url地址 * @returns {string} 返回参数字符串 */ function stringifySearchParam(params, url = "") { if (typeof params !== "object") return params; const arr = []; for (const key in params) { const value = params[key]; if (isArray(value)) { for (let i = 0; i < value.length; ++i) { arr.push(encodeURIComponent(key + "[" + i + "]") + "=" + encodeURIComponent(value[i])); } } else { arr.push(encodeURIComponent(key) + "=" + encodeURIComponent(params[key])); } } // 如果url不为空,则会返回拼接好url字符串 if (url) { return url.replace(/(\?.+?)(?=#|$)/, "?" + arr.join("&")); } else { return arr.join("&"); } } /** * 查询参数字符串中在最前面追加新参数和值 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @param {string|number|Array} value 参数值,如果是数组,则解析为:&ids[0]=1&ids[2]=2 * @returns {string} 返回查询参数字符串 */ function prependSearchParam(url = window.location.href, name, value) { const searchArr = (getSearchString(url) || "").split("&") || []; if (Array.isArray(value)) { const arr = []; for (let i = 0; i < value.length; i++) { arr.push(`${encodeURIComponent(name)}[${i}]=${encodeURIComponent(value[i])}`); } searchArr.unshift(...arr); } else { searchArr.unshift(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`); } return url.replace(/(\?.+?)(?=#|$)/, "?" + searchArr.join("&")); } /** * 查询参数字符串中在某个参数的前面追加新参数和值 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @param {string|number|Array} value 参数值,如果是数组,则解析为:&ids[0]=1&ids[2]=2 * @param {string} beforeParam 在前面追加参数的名称 * @returns {string} 返回查询参数字符串 */ function prependToSearchParam(url = window.location.href, beforeParam, name, value) { const searchArr = (getSearchString(url) || "").split("&"); const beforeIndex = searchArr.findIndex((v) => v.includes(beforeParam)); const beforeArr = arrayInsertBefore(searchArr, beforeIndex, `${name}=${value}`); return url.replace(/(\?.+?)(?=#|$)/, "?" + beforeArr.join("&")); } /** * 查询参数字符串中在最后面追加新参数和值 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @param {string,number,Array} value 参数值,如果是数组,则解析为:&ids[0]=1&ids[2]=2 * @returns {string} 返回查询参数字符串 */ function appendSearchParam(url = window.location.href, name, value) { const searchArr = (getSearchString(url) || "").split("&"); searchArr.push(`${name}=${value}`); return url.replace(/(\?.+?)(?=#|$)/, "?" + searchArr.join("&")); } /** * 查询参数字符串中在某个参数的后面追加新参数和值 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @param {string,number,Array} value 参数值,如果是数组,则解析为:&ids[0]=1&ids[2]=2 * @param {string} afterName 在后面追加参数的名称 * @returns {string} 返回查询参数字符串 */ function appendToSearchParam(url = window.location.href, afterName, name, value) { const searchArr = (getSearchString(url) || "").split("&"); const beforeIndex = searchArr.findIndex((v) => v.includes(afterName)); const afterArr = arrayInsertAfter(searchArr, beforeIndex, `${name}=${value}`); return url.replace(/(\?.+?)(?=#|$)/, "?" + afterArr.join("&")); } /** * 查询参数字符串中移除某个参数和值 * @param {string} url url地址,默认当前url地址 * @param {string} name 参数名 * @returns {string} 返回查询参数字符串 */ function removeSearchParam(url = window.location.href, name) { const searchArr = (getSearchString(url) || "").split("&"); const delIndex = searchArr.findIndex((v) => v.includes(name)); if (delIndex > -1) { searchArr.splice(delIndex, 1); } return url.replace(/(\?.+?)(?=#|$)/, "?" + searchArr.join("&")); } export { appendSearchParam, appendToSearchParam, getHost, getHostName, getPort, getProtocol, getSearchParam, getSearchString, getUrlHash, getUrlPath, hasSearchParam, parseSearchParam, prependSearchParam, prependToSearchParam, removeSearchParam, setSearchParam, stringifySearchParam };