DasBeasto
DasBeasto

Reputation: 2282

Update uri hash javascript

I find it hard to believe this hasn't been asked but I can find no references anywhere. I need to add a URI hash fragment and update the value if it already is in the hash. I can currently get it to add the hash but my regex doesn't appear to catch if it exists so it adds another instead of updating.

    setQueryString : function() {
        var value = currentPage; 
        var uri = window.location.hash;
        var key = "page";
        var re = new RegExp("([#&])" + key + "=.*#(&|$)", "i");
        var separator = uri.indexOf('#') !== -1 ? "&" : "#";
        if (uri.match(re)) {
            return uri.replace(re, '$1' + key + "=" + value + '$2');
        }
        else {
            return uri + separator + key + "=" + value;
        }
    },

Also if this can be made any cleaner while preserving other url values/hashes that would be great.

example input as requested

Starting uri value: www.example.com#page=1 (or no #page at all)

then on click of "next page" setQueryString gets called so the values would equal:

var value = 2;
var uri = '#page1'
var key = 'page'

So the hopeful output would be '#page2'.

Upvotes: 1

Views: 255

Answers (1)

Tomas Langkaas
Tomas Langkaas

Reputation: 4731

As to your regex question, testing if the pattern #page=(number) or &page=(number) is present combined with capturing the number, can be done with the regex /[#&]page\=(\d*)/ and the .match(regex) method. Note that = needs escaping in regexes.

If the pattern exists in the string, result will contain an array with the integer (as a string) at result[1]. If the pattern does not exist, result will be null.

//match #page=(integer) or &page=(integer)

var test = "#foo=bar&page=1";
var regex = /[#&]page\=(\d*)/;
var result = test.match(regex);

console.log(result);

If you want to dynamically set the key= to something other than "page", you could build the regex dynamically, like the following (note that backslashes needs escaping in strings, making the code a bit more convoluted):

//dynamically created regex

var test = "#foo=bar&page=1";
var key = "page"
var regex = new RegExp("[#&]" + key + "\\=(\\d*)");
var result = test.match(regex);

console.log(result);

Upvotes: 1

Related Questions