make doc search context work on Edge
This patch is by Ben Lerner.
This commit is contained in:
parent
f95723e70e
commit
247fc89f15
|
@ -15,11 +15,69 @@
|
||||||
<noscript>Sorry, you must have JavaScript to use this page.<br></noscript>
|
<noscript>Sorry, you must have JavaScript to use this page.<br></noscript>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
function decode(str) { return decodeURIComponent(str.replace(/\+/g, ' ')); }
|
||||||
|
|
||||||
|
function appendTo(dict, name, value) {
|
||||||
|
// dict :: Dict<String, Array<String>>
|
||||||
|
// Since keys can be presented multiple times, map each key
|
||||||
|
// to an array of values, "just in case" of repeats
|
||||||
|
var val;
|
||||||
|
if (typeof value === "string") {
|
||||||
|
val = value;
|
||||||
|
} else if (value && typeof value.toString === "function") {
|
||||||
|
val = value.toString();
|
||||||
|
} else {
|
||||||
|
val = JSON.stringify(value);
|
||||||
|
}
|
||||||
|
if (name in dict) {
|
||||||
|
dict[name].push(val);
|
||||||
|
} else {
|
||||||
|
dict[name] = [val];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// String -> Dict<String, Array<String>>
|
||||||
|
function parseToDict(search) {
|
||||||
|
var dict = {};
|
||||||
|
if (search.indexOf("?") === 0) {
|
||||||
|
search = search.slice(1);
|
||||||
|
}
|
||||||
|
var pairs = search.split("&");
|
||||||
|
for (var j = 0; j < pairs.length; j++) {
|
||||||
|
var value = pairs[j];
|
||||||
|
var index = value.indexOf('=');
|
||||||
|
if (index != -1) {
|
||||||
|
appendTo(dict, decode(value.slice(0, index)), decode(value.slice(index + 1)));
|
||||||
|
} else {
|
||||||
|
if (value) {
|
||||||
|
appendTo(dict, decode(value), '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
function searchParams(url) {
|
||||||
|
if (url.searchParams && url.searchParams.get && url.searchParams.keys) {
|
||||||
|
return {
|
||||||
|
keys: Array.from(url.searchParams.keys()),
|
||||||
|
get: function(key) { return url.searchParams.get(key); }
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
var dict = parseToDict(url.search);
|
||||||
|
return {
|
||||||
|
keys: Object.keys(dict),
|
||||||
|
get: function(key) { return dict[key]; }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (location.search.length > 0) {
|
if (location.search.length > 0) {
|
||||||
var u = new URL(location);
|
var u = new URL(location);
|
||||||
var newsearch = "";
|
var newsearch = "";
|
||||||
for(var key of u.searchParams.keys()) {
|
var searchParams = searchParams(u);
|
||||||
var val = u.searchParams.get(key);
|
searchParams.keys.forEach(function(key) {
|
||||||
|
var val = searchParams.get(key);
|
||||||
// an empty "hq=" can be used to clear the cookie
|
// an empty "hq=" can be used to clear the cookie
|
||||||
if (key == "hq") {
|
if (key == "hq") {
|
||||||
SetCookie("PLT_ContextQuery", val);
|
SetCookie("PLT_ContextQuery", val);
|
||||||
|
@ -29,7 +87,7 @@ if (location.search.length > 0) {
|
||||||
if (newsearch == "") newsearch = "?";
|
if (newsearch == "") newsearch = "?";
|
||||||
newsearch = newsearch + "&" + key + "=" + encodeURIComponent(val);
|
newsearch = newsearch + "&" + key + "=" + encodeURIComponent(val);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
// localtion.replace => jump without leaving the current page in the history
|
// localtion.replace => jump without leaving the current page in the history
|
||||||
// (the new url uses "index.html" and the new search part)
|
// (the new url uses "index.html" and the new search part)
|
||||||
location.replace(location.href.replace(/\/[^\/?#]*[?][^#]*/,
|
location.replace(location.href.replace(/\/[^\/?#]*[?][^#]*/,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user