From 5b2854dce984654fe5aa92040f9591bf7be5ce64 Mon Sep 17 00:00:00 2001 From: Arunoda Susiripala Date: Sun, 5 Feb 2017 14:28:44 +0530 Subject: [PATCH] Properly handle hash URL changes. (#996) * Properly handle hash URL changes. * Make sure we replace origin correctly. * Get rid of RegExp for getUrl(). --- lib/router/router.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/router/router.js b/lib/router/router.js index 8ac708440f116..9f16572378133 100644 --- a/lib/router/router.js +++ b/lib/router/router.js @@ -34,11 +34,18 @@ export default class Router extends EventEmitter { } async onPopState (e) { - // Older versions of safari and chrome tend to fire popstate event at the - // page load. - // We should not complete that event and the following check will fix it. - // Fixes: if (!e.state) { + // We get state as undefined for two reasons. + // 1. With older safari (< 8) and older chrome (< 34) + // 2. When the URL changed with # + // + // In the both cases, we don't need to proceed and change the route. + // (as it's already changed) + // But we can simply replace the state with the new changes. + // Actually, for (1) we don't need to nothing. But it's hard to detect that event. + // So, doing the following for (1) does no harm. + const { pathname, query } = this + this.replace(format({ pathname, query }), getURL()) return } @@ -276,7 +283,8 @@ export default class Router extends EventEmitter { } function getURL () { - return window.location.pathname + (window.location.search || '') + (window.location.hash || '') + const { href, origin } = window.location + return href.substring(origin.length) } function toRoute (path) {