Adding a parameter to the URL with JavaScript

后端 未结 30 2234
刺人心
刺人心 2020-11-22 07:33

In a web application that makes use of AJAX calls, I need to submit a request but add a parameter to the end of the URL, for example:

Original URL:

相关标签:
30条回答
  • 2020-11-22 08:03

    Try this.

    // uses the URL class
    function setParam(key, value) {
                let url = new URL(window.document.location);
                let params = new URLSearchParams(url.search.slice(1));
    
                if (params.has(key)) {
                    params.set(key, value);
                }else {
                    params.append(key, value);
                }
            }
    
    0 讨论(0)
  • 2020-11-22 08:03

    With the new achievements in JS here is how one can add query param to the URL:

    var protocol = window.location.protocol,
        host = '//' + window.location.host,
        path = window.location.pathname,
        query = window.location.search;
    
    var newUrl = protocol + host + path + query + (query ? '&' : '?') + 'param=1';
    
    window.history.pushState({path:newUrl}, '' , newUrl);
    

    Also see this possibility Moziila URLSearchParams.append()

    0 讨论(0)
  • 2020-11-22 08:04

    The simplest solution I can think of is this method, which will return the modified URI. I feel like most of you are working way too hard.

    function setParam(uri, key, val) {
        return uri
            .replace(new RegExp("([?&]"+key+"(?=[=&#]|$)[^#&]*|(?=#|$))"), "&"+key+"="+encodeURIComponent(val))
            .replace(/^([^?&]+)&/, "$1?");
    }
    
    0 讨论(0)
  • 2020-11-22 08:05

    Sometime we see ? at the end URL, i found some solutions which generate results as file.php?&foo=bar. i came up with my own solution work perfectly as i want!

    location.origin + location.pathname + location.search + (location.search=='' ? '?' : '&') + 'lang=ar'
    

    Note: location.origin doesn't work in IE, here is its fix.

    0 讨论(0)
  • 2020-11-22 08:05

    I would go with this small but complete library to handle urls in js:

    https://github.com/Mikhus/jsurl

    0 讨论(0)
  • 2020-11-22 08:06

    I have a 'class' that does this and here it is:

    function QS(){
        this.qs = {};
        var s = location.search.replace( /^\?|#.*$/g, '' );
        if( s ) {
            var qsParts = s.split('&');
            var i, nv;
            for (i = 0; i < qsParts.length; i++) {
                nv = qsParts[i].split('=');
                this.qs[nv[0]] = nv[1];
            }
        }
    }
    
    QS.prototype.add = function( name, value ) {
        if( arguments.length == 1 && arguments[0].constructor == Object ) {
            this.addMany( arguments[0] );
            return;
        }
        this.qs[name] = value;
    }
    
    QS.prototype.addMany = function( newValues ) {
        for( nv in newValues ) {
            this.qs[nv] = newValues[nv];
        }
    }
    
    QS.prototype.remove = function( name ) {
        if( arguments.length == 1 && arguments[0].constructor == Array ) {
            this.removeMany( arguments[0] );
            return;
        }
        delete this.qs[name];
    }
    
    QS.prototype.removeMany = function( deleteNames ) {
        var i;
        for( i = 0; i < deleteNames.length; i++ ) {
            delete this.qs[deleteNames[i]];
        }
    }
    
    QS.prototype.getQueryString = function() {
        var nv, q = [];
        for( nv in this.qs ) {
            q[q.length] = nv+'='+this.qs[nv];
        }
        return q.join( '&' );
    }
    
    QS.prototype.toString = QS.prototype.getQueryString;
    
    //examples
    //instantiation
    var qs = new QS;
    alert( qs );
    
    //add a sinle name/value
    qs.add( 'new', 'true' );
    alert( qs );
    
    //add multiple key/values
    qs.add( { x: 'X', y: 'Y' } );
    alert( qs );
    
    //remove single key
    qs.remove( 'new' )
    alert( qs );
    
    //remove multiple keys
    qs.remove( ['x', 'bogus'] )
    alert( qs );
    

    I have overridden the toString method so there is no need to call QS::getQueryString, you can use QS::toString or, as I have done in the examples just rely on the object being coerced into a string.

    0 讨论(0)
提交回复
热议问题