How to use jquery to manipulate the querystring

后端 未结 6 2031
别跟我提以往
别跟我提以往 2021-02-08 22:36

I have a select dropdown with id\'s mapped to values. On the onChange event I want to redirect to the same url but with \'id=value\' appended to the querystring.

How do

相关标签:
6条回答
  • 2021-02-08 23:18

    Based on CoffeeMonster's answer:

    There is a problem when the location.href contains a hash part:

    www.example.com#hash becomes www.example.com#hash?id=whatever which results in ?id=whatever not being interpreted by the server.

    Fixed it by removing the hash part of the url: url.split("#")[0];

    // put function into jQuery namespace
    jQuery.redirect = function(url, params) {
    
        url = url || window.location.href || '';
        url = url.split("#")[0];
        url =  url.match(/\?/) ? url : url + '?';
    
        for ( var key in params ) {
            var re = RegExp( ';?' + key + '=?[^&;]*', 'g' );
            url = url.replace( re, '');
            url += ';' + key + '=' + params[key]; 
        }  
        // cleanup url 
        url = url.replace(/[;&]$/, '');
        url = url.replace(/\?[;&]/, '?'); 
        url = url.replace(/[;&]{2}/g, ';');
        // $(location).attr('href', url);
        window.location.replace( url ); 
    };
    

    Now www.example.com#hash becomes www.example.com?id=whatever

    0 讨论(0)
  • 2021-02-08 23:19

    This works like a charm:

    jQuery.redirect = function( url ) {
       window.location.replace( url );  
    };
    $( "#selector" ).change( function() {
        var href = window.location.href.substring( 0, window.location.href.indexOf( '?' ) );
        $.redirect( href + '?id=' + $( this ).val() );
    } );
    
    0 讨论(0)
  • 2021-02-08 23:24

    setting window.location.search will update the url's query string (and overwrite a value if it already exits)

    $('#selector').change(function(){  
      window.location.search = "id=" + $(this).val();
    }); 
    
    0 讨论(0)
  • 2021-02-08 23:25

    I ended up going with a RegExp match to override the options. jQuery.param takes a hash and serialises it to a query_string but it doesn't provide the inverse (breaking up a query_string).

    // put function into jQuery namespace
    jQuery.redirect = function(url, params) {
    
        url = url || window.location.href || '';
        url =  url.match(/\?/) ? url : url + '?';
    
        for ( var key in params ) {
            var re = RegExp( ';?' + key + '=?[^&;]*', 'g' );
            url = url.replace( re, '');
            url += ';' + key + '=' + params[key]; 
        }  
        // cleanup url 
        url = url.replace(/[;&]$/, '');
        url = url.replace(/\?[;&]/, '?'); 
        url = url.replace(/[;&]{2}/g, ';');
        // $(location).attr('href', url);
        window.location.replace( url ); 
    };
    

    Then in the html

    $('#selector').change(function(){ 
       $.redirect( location.href, { id : $(this).val() })
    })
    

    Thanks to everyone that responded.

    0 讨论(0)
  • 2021-02-08 23:33

    I suspect the alleged solution is not working with specific variable names. Especially the line:

    RegExp( ';?' + key + '=?[^&;]*', 'g' )
    

    If key is a character sequence present elsewhere within the querystring, that occurrence will be mistakenly replaced also (try one letter, e.g. 'a'). This is because the regex leaves the string boundaries open (leading ';' and trailing '=' are both optional). Maybe the epxression better be something like:

    RegExp( '[;&]' + key + '=?[^&;]*', 'g' )
    

    Though I haven't tested it yet.

    0 讨论(0)
  • 2021-02-08 23:34

    Try using the split function:

    var url = location.href.split('?')[0] + '?;id=' + $(this).val();
    

    split returns a list made up of the string split up by the string (like '?'), with that string removed.

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