在当前URL上附加一个参数
我想在项目现场的角落里放一个小复活节彩蛋按钮。 单击时,它只是将一个字符串放到当前URL上并重新加载页面。
所以,如果我在: http : //test.com/projects/view/134
单击该按钮
页面重新加载: http : //test.com/projects/view/134?ts = true
不知道我怎么会这样做。
试试这段代码,
var separator = (window.location.href.indexOf("?")===-1)?"?":"&"; window.location.href = window.location.href + separator + "ts=true";
编辑:为了避免重复参数或url中的非常大的字符串,您需要替换已存在的旧参数。
var url=window.location.href, separator = (url.indexOf("?")===-1)?"?":"&", newParam=separator + "ts=true"; newUrl=url.replace(newParam,""); newUrl+=newParam; window.location.href =newUrl;
您可以将location.href分配给它当前具有的值,以及新的查询字符串:
(编辑为对现有的查询字符串友好)
$("#yourButtonId").click({ var loc = location.href; if (loc.indexOf("?") === -1) loc += "?"; else loc += "&"; location.href = loc + "ts=true"; });
或者更简洁:
$("#yourButtonId").click({ var loc = location.href; loc += loc.indexOf("?") === -1 ? "?" : "&"; location.href = loc + "ts=true"; });
location.href += '?ts=true';
就像那样。
我发现以前的答案缺乏,因此这里有一个更好地处理当前查询字符串中其他参数的方法
appendToQueryString = function (param, val) { var queryString = window.location.search.replace("?", ""); var parameterListRaw = queryString == "" ? [] : queryString.split("&"); var parameterList = {}; for (var i = 0; i < parameterListRaw.length; i++) { var parameter = parameterListRaw[i].split("="); parameterList[parameter[0]] = parameter[1]; } parameterList[param] = val; var newQueryString = "?"; for (var item in parameterList) { if (parameterList.hasOwnProperty(item)) { newQueryString += item + "=" + parameterList[item] + "&"; } } newQueryString = newQueryString.replace(/&$/, ""); return location.origin + location.pathname + newQueryString; }
您必须使用location.href = appendToQueryString(ts, true)
来实际重新加载页面。
充分利用location
DOM API,并计入哈希值:
location.protocol + '//' + location.pathname + (location.search ? location.search + '&a=b' : '?a=b') + location.hash;
使用:
- https://developer.mozilla.org/en-US/docs/Web/API/URL
- https://developer.mozilla.org/fr/docs/Web/API/URLSearchParams
例:
var url = new URL("http://foo.bar/?x=1&y=2"); // If your expected result is "http://foo.bar/?x=1&y=2&x=42" url.searchParams.append('x', 42); // If your expected result is "http://foo.bar/?x=42&y=2" url.searchParams.set('x', 42); // Build result url.toString();
你的意思是:
$(document).ready(function() { $("#yourButtonId").click(function() { var currentUrl = window.location.pathname + "?ts=true"; }); });
$(document).ready(function() { $("#yourButtonId").click(function() { var currentUrl = window.location.pathname + "?ts=true"; }); });
如果要考虑URL中可能存在哈希“#”,请按以下步骤操作:
var href = location.href; var hasQuery = href.indexOf("?") + 1; var hasHash = href.indexOf("#") + 1; var appendix = (hasQuery ? "&" : "?") + "ts=true"; location.href = hasHash ? href.replace("#", appendix + "#") : href + appendix;
请参阅history API的文档:
https://developer.mozilla.org/en-US/docs/Web/API/History_API
用法示例:
var obj = { Title: title, Url: url }; history.pushState(obj, obj.Title, obj.Url);
来自@Bobbzorzen的改进回答,能够通过仅传递名称来删除param:
function AlterQueryString(param, val) { var queryString = window.location.search.replace("?", ""); var parameterListRaw = queryString == "" ? [] : queryString.split("&"); var parameterList = {}; for (var i = 0; i < parameterListRaw.length; i++) { var parameter = parameterListRaw[i].split("="); if (typeof val != 'undefined') { parameterList[parameter[0]] = parameter[1]; } else if (param != parameter[0]) { parameterList[parameter[0]] = parameter[1]; } } if (typeof val != 'undefined') { parameterList[param] = val; } var newQueryString = Object.keys(parameterList).length > 0 ? "?" : ""; for (var item in parameterList) { if (parameterList.hasOwnProperty(item)) { newQueryString += item + "=" + parameterList[item] + "&"; } } newQueryString = newQueryString.replace(/&$/, ""); return location.origin + location.pathname + newQueryString; }
要点:https://gist.github.com/envil/bc1832503bef55ffdabb0cde32bb06f1