/
DOMUtils.js
50 lines (43 loc) · 1.63 KB
/
DOMUtils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
export const canUseDOM = !!(
typeof window !== "undefined" &&
window.document &&
window.document.createElement
)
export const getConfirmation = (message, callback) =>
callback(window.confirm(message)) // eslint-disable-line no-alert
/**
* Returns true if the HTML5 history API is supported. Taken from Modernizr.
*
* https://github.com/Modernizr/Modernizr/blob/master/LICENSE
* https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
* changed to avoid false negatives for Windows Phones: https://github.com/reactjs/react-router/issues/586
*/
export const supportsHistory = () => {
const ua = window.navigator.userAgent
if (
(ua.indexOf("Android 2.") !== -1 || ua.indexOf("Android 4.0") !== -1) &&
ua.indexOf("Mobile Safari") !== -1 &&
ua.indexOf("Chrome") === -1 &&
ua.indexOf("Windows Phone") === -1
)
return false
return window.history && "pushState" in window.history
}
/**
* Returns true if browser fires popstate on hash change.
* IE10 and IE11 do not.
*/
export const supportsPopStateOnHashChange = () =>
window.navigator.userAgent.indexOf("Trident") === -1
/**
* Returns false if using go(n) with hash history causes a full page reload.
*/
export const supportsGoWithoutReloadUsingHash = () =>
window.navigator.userAgent.indexOf("Firefox") === -1
/**
* Returns true if a given popstate event is an extraneous WebKit event.
* Accounts for the fact that Chrome on iOS fires real popstate events
* containing undefined state when pressing the back button.
*/
export const isExtraneousPopstateEvent = event =>
event.state === undefined && navigator.userAgent.indexOf("CriOS") === -1