Appending parameter to URL without refresh

109,635

Solution 1

You can use the pushState or replaceState methods, i.e. :

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

OR

window.history.replaceState(null, null, "?arg=123");

Example with argument:

var refresh = window.location.protocol + "//" + window.location.host + window.location.pathname + '?arg=1';    
window.history.pushState({ path: refresh }, '', refresh);

Solution 2

You can also use URL API if you want to add and remove params at the same time:

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

Solution 3

If anyone wants to add a parameter to a more complex url (I mean, https://stackoverflow.com/questions/edit?newParameter=1), the following code worked for me:

var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?newParameter=1';
window.history.pushState({ path: newurl }, '', newurl);

Hope this helps!

Solution 4

Modified Medhi answer and this did the trick

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);
    }
}
Share:
109,635

Related videos on Youtube

Mina Hafzalla
Author by

Mina Hafzalla

Updated on February 24, 2022

Comments

  • Mina Hafzalla
    Mina Hafzalla about 2 years

    I know this has been asked many times before but answers were not descriptive enough to solve my problem. I don't want to change the whole URL of page. I want to append a parameter &item=brand on button click without refresh.

    Using document.location.search += '&item=brand'; makes the page refresh.

    Using window.location.hash = "&item=brand"; append without refresh but with a hash # which eliminates the usage/effect of the parameter. I tried to remove the hash after appending but that didn't work.


    This answer and many others suggest the use of HTML5 History API, specifically the history.pushState method, and for old browsers is to set a fragment identifier to prevent page from reloading. But how?


    Assuming the URL is: http://example.com/search.php?lang=en

    How can I append &item=brand using HTML5 pushState method or a fragment identifier so the output would be like this: http://example.com/search.php?lang=en&item=brand without a page refresh?


    I hope someone can throw some light on how to use the HTML5 pushState to append a parameter to an existing/current URL. Or alternatively how to set a fragment identifier for the same purpose. A good tutorial, demo or piece of code with a little explanation would be great.

    Demo of what I've done so far. Your answers would be greatly appreciated.

  • Mina Hafzalla
    Mina Hafzalla over 8 years
    Thank you so much! that worked, but surprisingly the parameter didn't apply into the system. However, it take effect when I add it manually into the URL. I will take this as an accepted answer as it solves my main question but please if you have a suggestion on why the parameter won't be applied to system when added using the history.pushState please tell me :) Thank you again.
  • rustycode
    rustycode over 6 years
    Thanks, I ending up using window.history.replaceState(null, null, "?mock"); To add a url param without reload.
  • Hasan Badshah
    Hasan Badshah about 5 years
    here is the reference to this working code. eureka.ykyuen.info/2015/04/08/…
  • Andre
    Andre about 4 years
    I also add window.location.hash to the end of the new URL.
  • Radvylf Programs
    Radvylf Programs over 3 years
    Browser compatibility is somewhat good, but note that it won't work for below IE10 or (potentially) some mobile browsers.
  • Elijah Mock
    Elijah Mock almost 2 years
    Much nicer than reconstructing the URL like window.location.protocol + "//" + window.location.host + window.location.pathname + '?arg=1'