将参数附加到URL而不刷新

时间:2015-09-28 16:57:34

标签: javascript jquery html5 pushstate html5-history

我知道之前已经多次询问过,但答案的描述性不足以解决我的问题。我不想更改页面的整个URL。我想在按钮点击时附加参数&item=brand而不刷新。

使用document.location.search += '&item=brand';可以刷新页面。

使用window.location.hash = "&item=brand";追加而不刷新但使用散列#来消除参数的使用/效果。我试图在追加后删除散列,但这不起作用。

This answer以及其他许多人建议使用HTML5历史记录API,特别是history.pushState方法,对于旧浏览器,则设置片段标识符以防止重新加载页面。但是如何?

假设网址为:http://example.com/search.php?lang=en

如何使用HTML5 pushState方法或片段标识符附加&item=brand,以便输出如下:http://example.com/search.php?lang=en&item=brand没有页面刷新?

我希望有人可以说明如何使用HTML5 pushState将参数附加到现有/当前URL。或者,如何为相同目的设置片段标识符。一个很好的教程,演示或一段代码,只需要一点解释就可以了。

Demo到目前为止我所做的一切。非常感谢您的回答。

5 个答案:

答案 0 :(得分:50)

您可以使用pushStatereplaceState方法,即:

window.history.pushState("object or string", "Title", "new url");

OR

window.history.replaceState(null, null, "/another-new-url");

答案 1 :(得分:9)

如果您想同时添加和删除参数,也可以使用 URL API:

const url = new URL(window.location.href);
url.searchParams.set('param1', 'val1');
url.searchParams.delete('param2');
window.history.replaceState(null, null, url); // or pushState

答案 2 :(得分:8)

如果有人想要将参数添加到更复杂的网址(我的意思是https://stackoverflow.com/questions/edit?newParameter=1),以下代码对我有用:

box     match
Box100  yes
Box200  no
Box300  yes
Box400  no

希望这有帮助!

答案 3 :(得分:0)

export function getHash(hash: string, key: string): string | undefined {
  return hash
    .split("#")
    .find((h) => h.startsWith(key))
    ?.replace(`${key}=`, "");
}
export function setHash(hash: string, key: string, value: string): string {
  let hashArray = hash.split("#").filter((h) => !h.startsWith(key));
  hashArray.push(`${key}=${value}`);
  return hashArray.length > 0
    ? hashArray.reduce((s1, s2) => `${s1}#${s2}`)
    : "";
}
export function deleteHash(hash: string, key: string): string {
  let hashArray = hash.split("#").filter((h) => !h.startsWith(key));
  return hashArray.length > 0
    ? hashArray.reduce((s1, s2) => `${s1}#${s2}`)
    : "";
}

答案 4 :(得分:0)

修改了 Medhi 的答案,这成功了

const insertParam = (key: string, value: string) => {
    key = encodeURIComponent(key);
    value = encodeURIComponent(value);

    let kvp = window.location.search.substr(1).split('&');
    if (kvp[0] === '') {
        const path = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + key + '=' + value;
        window.history.pushState({ path: path }, '', path);

    } else {
        let i = kvp.length; let x; while (i--) {
            x = kvp[i].split('=');

            if (x[0] === key) {
                x[1] = value;
                kvp[i] = x.join('=');
                break;
            }
        }

        if (i < 0) { 
            kvp[kvp.length] = [key, value].join('=');
        }

        const refresh = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + kvp.join('&');  
        window.history.pushState({ path: refresh }, '', refresh);
    }
}