mirror of
https://github.com/metosin/reitit.git
synced 2026-02-04 03:13:12 +00:00
Fix HTML5 history in IE11 (and hopefully others)
closest method is not available in IE, but we only need to find ancestor by tag name which is easy and relatively fast anyway.
This commit is contained in:
parent
6123230f98
commit
cbff7d10bf
1 changed files with 12 additions and 2 deletions
|
|
@ -49,6 +49,16 @@
|
||||||
(if path
|
(if path
|
||||||
(str "#" path))))
|
(str "#" path))))
|
||||||
|
|
||||||
|
(defn- closest-by-tag [el tag]
|
||||||
|
;; nodeName is upper case for HTML always,
|
||||||
|
;; for XML or XHTML it would be in the original case.
|
||||||
|
(let [tag (.toUpperCase tag)]
|
||||||
|
(loop [el el]
|
||||||
|
(if el
|
||||||
|
(if (= tag (.-nodeName el))
|
||||||
|
el
|
||||||
|
(recur (.-parentNode el)))))))
|
||||||
|
|
||||||
(defrecord Html5History [on-navigate router listen-key click-listen-key]
|
(defrecord Html5History [on-navigate router listen-key click-listen-key]
|
||||||
History
|
History
|
||||||
(-init [this]
|
(-init [this]
|
||||||
|
|
@ -66,7 +76,7 @@
|
||||||
(fn ignore-anchor-click
|
(fn ignore-anchor-click
|
||||||
[e]
|
[e]
|
||||||
;; Returns the next matching anchestor of event target
|
;; Returns the next matching anchestor of event target
|
||||||
(when-let [el (.closest (.-target e) "a")]
|
(when-let [el (closest-by-tag (.-target e) "a")]
|
||||||
(let [uri (.parse Uri (.-href el))]
|
(let [uri (.parse Uri (.-href el))]
|
||||||
(when (and (or (and (not (.hasScheme uri)) (not (.hasDomain uri)))
|
(when (and (or (and (not (.hasScheme uri)) (not (.hasDomain uri)))
|
||||||
(= current-domain (.getDomain uri)))
|
(= current-domain (.getDomain uri)))
|
||||||
|
|
@ -79,7 +89,7 @@
|
||||||
(= 0 (.-button e))
|
(= 0 (.-button e))
|
||||||
;; isContentEditable property is inherited from parents,
|
;; isContentEditable property is inherited from parents,
|
||||||
;; so if the anchor is inside contenteditable div, the property will be true.
|
;; so if the anchor is inside contenteditable div, the property will be true.
|
||||||
(not (.-isContentEditable (.-target e)))
|
(not (.-isContentEditable el))
|
||||||
(reitit/match-by-path router (.getPath uri)))
|
(reitit/match-by-path router (.getPath uri)))
|
||||||
(.preventDefault e)
|
(.preventDefault e)
|
||||||
(let [path (str (.getPath uri)
|
(let [path (str (.getPath uri)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue