How to update the URL of a page without causing a reload using vanilla JavaScript
Yesterday, we looked at how to build a vanilla JavaScript search feature for a static website. At the end, I mentioned…
Tomorrow, I’ll show you how I update the URL with the search query, and run a search automatically on page load if there’s a query in the URL.
Well, today is tomorrow, so let’s dig in!
Note: If you haven’t yet, you should probably read yesterday’s post first, or today’s won’t make much sense.
Updating the URL
In our search()
function, we create an array of regex patterns, get an array of matching items (sorted by how many matches they have), and then render them into the UI.
Let’s create another function, updateURL()
, to update the URL for us. We’ll pass in the search query
as an argument.
/**
* Search for matches
* @param {String} query The term to search for
*/
function search (query) {
// ...
// Display the results
showResults(results);
// Update the URL
updateURL(query);
}
We’re going to use the history.pushState()
method to update our URL.
This creates a new entry in the browser’s history (and updates the URL) without causing the page to reload. It accepts three arguments: the browser state
, a title
to use in the document
, and the url
.
We’ll use the current history.state
, no need to replace anything. We’ll also use the current document.title
.
For the url
, we’ll combine the location.origin
and location.pathname
, then append the ?s
query string parameter, and use the query
for its value. We’ll pass the query
into the encodeURI()
method to encode it.
/**
* Update the URL with a query string for the search string
* @param {String} query The search query
*/
function updateURL (query) {
// Create the properties
let state = history.state;
let title = document.title;
let url = window.location.origin + window.location.pathname + '?s=' + encodeURI(query);
}
Finally, we can pass all three into the history.pushState()
method to update the URL.
/**
* Update the URL with a query string for the search string
* @param {String} query The search query
*/
function updateURL (query) {
// Create the properties
// ...
// Update the URL
history.pushState(state, title, url);
}
Running a search on page load
If the URL has an s
query string parameter when the page loads, we should also run a search immediately. This lets users bookmark search pages for later.
First, we’ll create an onload()
function to run immediately with the script.
// Create a submit handler
form.addEventListener('submit', submitHandler);
// Check for query strings onload
onload();
We’ll use the new URLSearchParams()
constructor to create a URLSearchParams
object from the location.search
property.
Then, we’ll use the URLSearchParams.get()
method to look for a query string parameter with a key of s
.
If one is not found, we’ll use the return
operator to end our function.
/**
* If there's a query string search term, search it on page load
*/
function onload () {
let query = new URLSearchParams(window.location.search).get('s');
if (!query) return;
}
If a query
exists, we’ll update the input.value
property with it so that the search field contains the search query
. Then, we’ll pass the query
into the search()
function to run a search.
The URLSearchParams.get()
method automatically decodes the parameter for us, so we don’t need to worry about that.
/**
* If there's a query string search term, search it on page load
*/
function onload () {
let query = new URLSearchParams(window.location.search).get('s');
if (!query) return;
input.value = query;
search(query);
}
Now, when someone reloads or revists a search page, a new search will automatically run.