我有三个函数来处理url参数,但它不够好,我的意思是它有点复杂,我正在寻找在这三个参数之间使用的简单函数。
function getUrlParameter(sParam) { // this function to get single parameter
var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++) {
var sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] == sParam) {
return sParameterName[1];
}
}
}
function replaceUrlParam(paramName, paramValue) { // this to replace parameters value by other value
var currentUrl = window.location.href;
var pattern = new RegExp('(' + paramName + '=).*?(&|$)')
var newUrl = currentUrl.replace(pattern, '$1' + paramValue + '$2');
if (newUrl == currentUrl && newUrl.indexOf(paramName + '=' + paramValue) == -1) {
newUrl = newUrl + (newUrl.indexOf('?') > 0 ? '&' : '?') + paramName + '=' + paramValue
}
window.history.pushState('', document.title, newUrl);
return newUrl;
}
function getUrlParameters() { // this to get all parameters
var sParam = 'p'; var viewParam = 'v'; var lanPram = 'l'; var ukomPram = 'uk'; var catPram = 'ca'; var ucatPram = 'uc';
l = getUrlParameter(lanPram);
ukmun = getUrlParameter(ukomPram);
kat = getUrlParameter(catPram);
uKat = getUrlParameter(ucatPram);
pagenumber = getUrlParameter(sParam);
viewIndex = getUrlParameter(viewParam);
if (l || l == 0) { l = l; } else { l = replaceUrlParam(lanPram, 0); }
if (ukmun) { ukmun = ukmun; } else { ukmun = replaceUrlParam(ukomPram, 0); }
if (kat) { kat = kat; } else { kat = replaceUrlParam(catPram, 0); }
if (uKat) { uKat = uKat; } else { uKat = replaceUrlParam(ucatPram, 0); }
if (viewIndex) { viewIndex = viewIndex; } else { viewIndex = 'l'; }
if (pagenumber) { pagenumber = pagenumber; } else { pagenumber = 1; }
}
这可行,但它调用了许多函数replaceUrlParam
和函数getUrlParameter
而且我不喜欢的大事是当页面加载了那些网址然后我想要回到上一页它可以追溯到每个参数
例如:如果有此网址myfile.php?p=1&v=l&l=0&uk=0&ca=0&uc=0
然后,如果我点击上一页进入浏览器中的上一页,我会返回一个像
这样的参数 myfile.php?p=1&v=l&l=0&uk=0&ca=0
然后再次上一次它会与myfile.php?p=1&v=l&l=0&uk=0
之类的下一个参数停留在同一页面中,依此类推,直到参数消失为止。
是否可以轻松解决这3个功能,使其变得简单易行?
感谢。
答案 0 :(得分:-2)
首先,每次获得var时,遍历整个查询字符串似乎效率很低。我建议立即将整个查询字符串解析为一个对象,如下所示:
function getParameters() {
// Get just the query string, and split it on &
var param_arr = window.location.search.substring(1).split('&'),
param_obj = {};
// Iterate through results
for (var i = 0; i < param_arr.length; i++) {
var param = param_arr[i].split('=');
if (param === param_arr[i])
// If this did not have a value, it goes into the object as key = true
param_obj[param] = true;
else
// If this did have a value, we enter it into the object as key = value
param_obj[param[0]] = param[1];
}
return param_obj;
};
现在,getParameters将返回一个如下所示的对象:
{
p: 1,
v: 1,
uk: 0
}
对于默认值,最简单的方法是使用默认值创建一个看起来像这样的对象,然后将它们合并在一起。有很多库可以做得更优雅和万无一失,但这只是一个简单的例子:
function mergeParams(defaults, params) {
var obj = {};
for (var i in defaults) {
if (i in params)
obj[i] = params[i];
else
obj[i] = defaults[i];
}
return obj;
}
所以你会这样做:
var defaults = {
i: 0,
v: 1
};
var params = getParameters();
params = mergeParams(defaults, params);
所有这些仅仅是一个开始。还有其他可能的考虑因素,具体取决于您的需求,例如解析查询字符串编码。我强烈建议您查看可以为您执行此操作的库。 URI.js非常合适:http://medialize.github.io/URI.js/