Modifying a query string without reloading the page

前端 未结 5 2065
北荒
北荒 2020-11-29 17:18

I am creating a photo gallery, and would like to be able to change the query string and title when the photos are browsed.

The behavior I am looking for is often see

相关标签:
5条回答
  • 2020-11-29 17:35

    Then the history API is exactly what you are looking for. If you wish to support legacy browsers as well, then look for a library that falls back on manipulating the URL's hash tag if the browser doesn't provide the history API.

    0 讨论(0)
  • 2020-11-29 17:39

    If you are looking for Hash modification, your solution works ok. However, if you want to change the query, you can use the pushState, as you said. Here it is an example that might help you to implement it properly. I tested and it worked fine:

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

    It does not reload the page, but it only allows you to change the URL query. You would not be able to change the protocol or the host values. And of course that it requires modern browsers that can process HTML5 History API.

    For more information:

    http://diveintohtml5.info/history.html

    https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

    0 讨论(0)
  • 2020-11-29 17:49

    I want to improve Fabio's answer and create a function which adds custom key to the URL string without reloading the page.

    function insertUrlParam(key, value) {
        if (history.pushState) {
            let searchParams = new URLSearchParams(window.location.search);
            searchParams.set(key, value);
            let newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + searchParams.toString();
            window.history.pushState({path: newurl}, '', newurl);
        }
    }
    
    0 讨论(0)
  • 2020-11-29 17:53

    I've used the following JavaScript library with great success:

    https://github.com/balupton/jquery-history

    It supports the HTML5 history API as well as a fallback method (using #) for older browsers.

    This library is essentially a polyfill around `history.pushState'.

    0 讨论(0)
  • 2020-11-29 17:56

    Building off of Fabio's answer, I created two functions that will probably be useful for anyone stumbling upon this question. With these two functions, you can call insertParam() with a key and value as an argument. It will either add the URL parameter or, if a query param already exists with the same key, it will change that parameter to the new value:

    //function to remove query params from a URL
    function removeURLParameter(url, parameter) {
        //better to use l.search if you have a location/link object
        var urlparts= url.split('?');   
        if (urlparts.length>=2) {
    
            var prefix= encodeURIComponent(parameter)+'=';
            var pars= urlparts[1].split(/[&;]/g);
    
            //reverse iteration as may be destructive
            for (var i= pars.length; i-- > 0;) {    
                //idiom for string.startsWith
                if (pars[i].lastIndexOf(prefix, 0) !== -1) {  
                    pars.splice(i, 1);
                }
            }
    
            url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
            return url;
        } else {
            return url;
        }
    }
    
    //function to add/update query params
    function insertParam(key, value) {
        if (history.pushState) {
            // var newurl = window.location.protocol + "//" + window.location.host + search.pathname + '?myNewUrlQuery=1';
            var currentUrlWithOutHash = window.location.origin + window.location.pathname + window.location.search;
            var hash = window.location.hash
            //remove any param for the same key
            var currentUrlWithOutHash = removeURLParameter(currentUrlWithOutHash, key);
    
            //figure out if we need to add the param with a ? or a &
            var queryStart;
            if(currentUrlWithOutHash.indexOf('?') !== -1){
                queryStart = '&';
            } else {
                queryStart = '?';
            }
    
            var newurl = currentUrlWithOutHash + queryStart + key + '=' + value + hash
            window.history.pushState({path:newurl},'',newurl);
        }
    }
    
    0 讨论(0)
提交回复
热议问题