diff options
author | Masaya Watanabe <sfbgwm30@gmail.com> | 2020-11-10 16:04:40 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-10 16:04:40 +0300 |
commit | 944ec499586db5c716a923c8696249b40abb6e97 (patch) | |
tree | 9e60c654a879b1a44210460f15bb2d81a8406893 | |
parent | 6b382dce2bb078c31602ed3cfde61ff19f8a09e2 (diff) | |
parent | b9ea6b8513b6aae6b089897d3f4aee1393fd561e (diff) |
Merge pull request #65 from matsuyoshi30/use-instant.min
Fix #63
-rw-r--r-- | layouts/partials/head.html | 2 | ||||
-rw-r--r-- | static/js/instantpage.js | 202 | ||||
-rw-r--r-- | static/js/instantpage.min.js | 2 |
3 files changed, 3 insertions, 203 deletions
diff --git a/layouts/partials/head.html b/layouts/partials/head.html index 006149a..746961a 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -18,5 +18,5 @@ {{ end }} <!-- script --> <script src="{{ .Site.BaseURL }}js/bundle.js"></script> -<script src="{{ .Site.BaseURL }}js/instantpage.js" type="module" defer></script> +<script src="{{ .Site.BaseURL }}js/instantpage.min.js" type="module" defer></script> {{ hugo.Generator -}} diff --git a/static/js/instantpage.js b/static/js/instantpage.js deleted file mode 100644 index 78a5480..0000000 --- a/static/js/instantpage.js +++ /dev/null @@ -1,202 +0,0 @@ -/*! instant.page v3.0.0 - (C) 2019 Alexandre Dieulot - https://instant.page/license */ - -let mouseoverTimer -let lastTouchTimestamp -const prefetches = new Set() -const prefetchElement = document.createElement('link') -const isSupported = prefetchElement.relList && prefetchElement.relList.supports && prefetchElement.relList.supports('prefetch') - && window.IntersectionObserver && 'isIntersecting' in IntersectionObserverEntry.prototype -const allowQueryString = 'instantAllowQueryString' in document.body.dataset -const allowExternalLinks = 'instantAllowExternalLinks' in document.body.dataset -const useWhitelist = 'instantWhitelist' in document.body.dataset - -let delayOnHover = 65 -let useMousedown = false -let useMousedownOnly = false -let useViewport = false -if ('instantIntensity' in document.body.dataset) { - const intensity = document.body.dataset.instantIntensity - - if (intensity.substr(0, 'mousedown'.length) == 'mousedown') { - useMousedown = true - if (intensity == 'mousedown-only') { - useMousedownOnly = true - } - } - else if (intensity.substr(0, 'viewport'.length) == 'viewport') { - if (!(navigator.connection && (navigator.connection.saveData || navigator.connection.effectiveType.includes('2g')))) { - if (intensity == "viewport") { - /* Biggest iPhone resolution (which we want): 414 × 896 = 370944 - * Small 7" tablet resolution (which we don’t want): 600 × 1024 = 614400 - * Note that the viewport (which we check here) is smaller than the resolution due to the UI’s chrome */ - if (document.documentElement.clientWidth * document.documentElement.clientHeight < 450000) { - useViewport = true - } - } - else if (intensity == "viewport-all") { - useViewport = true - } - } - } - else { - const milliseconds = parseInt(intensity) - if (!isNaN(milliseconds)) { - delayOnHover = milliseconds - } - } -} - -if (isSupported) { - const eventListenersOptions = { - capture: true, - passive: true, - } - - if (!useMousedownOnly) { - document.addEventListener('touchstart', touchstartListener, eventListenersOptions) - } - - if (!useMousedown) { - document.addEventListener('mouseover', mouseoverListener, eventListenersOptions) - } - else { - document.addEventListener('mousedown', mousedownListener, eventListenersOptions) - } - - if (useViewport) { - let triggeringFunction - if (window.requestIdleCallback) { - triggeringFunction = (callback) => { - requestIdleCallback(callback, { - timeout: 1500, - }) - } - } - else { - triggeringFunction = (callback) => { - callback() - } - } - - triggeringFunction(() => { - const intersectionObserver = new IntersectionObserver((entries) => { - entries.forEach((entry) => { - if (entry.isIntersecting) { - const linkElement = entry.target - intersectionObserver.unobserve(linkElement) - preload(linkElement.href) - } - }) - }) - - document.querySelectorAll('a').forEach((linkElement) => { - if (isPreloadable(linkElement)) { - intersectionObserver.observe(linkElement) - } - }) - }) - } -} - -function touchstartListener(event) { - /* Chrome on Android calls mouseover before touchcancel so `lastTouchTimestamp` - * must be assigned on touchstart to be measured on mouseover. */ - lastTouchTimestamp = performance.now() - - const linkElement = event.target.closest('a') - - if (!isPreloadable(linkElement)) { - return - } - - preload(linkElement.href) -} - -function mouseoverListener(event) { - if (performance.now() - lastTouchTimestamp < 1100) { - return - } - - const linkElement = event.target.closest('a') - - if (!isPreloadable(linkElement)) { - return - } - - linkElement.addEventListener('mouseout', mouseoutListener, {passive: true}) - - mouseoverTimer = setTimeout(() => { - preload(linkElement.href) - mouseoverTimer = undefined - }, delayOnHover) -} - -function mousedownListener(event) { - const linkElement = event.target.closest('a') - - if (!isPreloadable(linkElement)) { - return - } - - preload(linkElement.href) -} - -function mouseoutListener(event) { - if (event.relatedTarget && event.target.closest('a') == event.relatedTarget.closest('a')) { - return - } - - if (mouseoverTimer) { - clearTimeout(mouseoverTimer) - mouseoverTimer = undefined - } -} - -function isPreloadable(linkElement) { - if (!linkElement || !linkElement.href) { - return - } - - if (useWhitelist && !('instant' in linkElement.dataset)) { - return - } - - if (!allowExternalLinks && linkElement.origin != location.origin && !('instant' in linkElement.dataset)) { - return - } - - if (!['http:', 'https:'].includes(linkElement.protocol)) { - return - } - - if (linkElement.protocol == 'http:' && location.protocol == 'https:') { - return - } - - if (!allowQueryString && linkElement.search && !('instant' in linkElement.dataset)) { - return - } - - if (linkElement.hash && linkElement.pathname + linkElement.search == location.pathname + location.search) { - return - } - - if ('noInstant' in linkElement.dataset) { - return - } - - return true -} - -function preload(url) { - if (prefetches.has(url)) { - return - } - - const prefetcher = document.createElement('link') - prefetcher.rel = 'prefetch' - prefetcher.href = url - document.head.appendChild(prefetcher) - - prefetches.add(url) -} diff --git a/static/js/instantpage.min.js b/static/js/instantpage.min.js new file mode 100644 index 0000000..4a08db3 --- /dev/null +++ b/static/js/instantpage.min.js @@ -0,0 +1,2 @@ +/*! instant.page v5.1.0 - (C) 2019-2020 Alexandre Dieulot - https://instant.page/license */ +let t,e;const n=new Set,o=document.createElement("link"),i=o.relList&&o.relList.supports&&o.relList.supports("prefetch")&&window.IntersectionObserver&&"isIntersecting"in IntersectionObserverEntry.prototype,s="instantAllowQueryString"in document.body.dataset,a="instantAllowExternalLinks"in document.body.dataset,r="instantWhitelist"in document.body.dataset,c="instantMousedownShortcut"in document.body.dataset,d=1111;let l=65,u=!1,f=!1,m=!1;if("instantIntensity"in document.body.dataset){const t=document.body.dataset.instantIntensity;if("mousedown"==t.substr(0,"mousedown".length))u=!0,"mousedown-only"==t&&(f=!0);else if("viewport"==t.substr(0,"viewport".length))navigator.connection&&(navigator.connection.saveData||navigator.connection.effectiveType&&navigator.connection.effectiveType.includes("2g"))||("viewport"==t?document.documentElement.clientWidth*document.documentElement.clientHeight<45e4&&(m=!0):"viewport-all"==t&&(m=!0));else{const e=parseInt(t);isNaN(e)||(l=e)}}if(i){const n={capture:!0,passive:!0};if(f||document.addEventListener("touchstart",function(t){e=performance.now();const n=t.target.closest("a");if(!h(n))return;v(n.href)},n),u?c||document.addEventListener("mousedown",function(t){const e=t.target.closest("a");if(!h(e))return;v(e.href)},n):document.addEventListener("mouseover",function(n){if(performance.now()-e<d)return;const o=n.target.closest("a");if(!h(o))return;o.addEventListener("mouseout",p,{passive:!0}),t=setTimeout(()=>{v(o.href),t=void 0},l)},n),c&&document.addEventListener("mousedown",function(t){if(performance.now()-e<d)return;const n=t.target.closest("a");if(t.which>1||t.metaKey||t.ctrlKey)return;if(!n)return;n.addEventListener("click",function(t){1337!=t.detail&&t.preventDefault()},{capture:!0,passive:!1,once:!0});const o=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1,detail:1337});n.dispatchEvent(o)},n),m){let t;(t=window.requestIdleCallback?t=>{requestIdleCallback(t,{timeout:1500})}:t=>{t()})(()=>{const t=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){const n=e.target;t.unobserve(n),v(n.href)}})});document.querySelectorAll("a").forEach(e=>{h(e)&&t.observe(e)})})}}function p(e){e.relatedTarget&&e.target.closest("a")==e.relatedTarget.closest("a")||t&&(clearTimeout(t),t=void 0)}function h(t){if(t&&t.href&&(!r||"instant"in t.dataset)&&(a||t.origin==location.origin||"instant"in t.dataset)&&["http:","https:"].includes(t.protocol)&&("http:"!=t.protocol||"https:"!=location.protocol)&&(s||!t.search||"instant"in t.dataset)&&!(t.hash&&t.pathname+t.search==location.pathname+location.search||"noInstant"in t.dataset))return!0}function v(t){if(n.has(t))return;const e=document.createElement("link");e.rel="prefetch",e.href=t,document.head.appendChild(e),n.add(t)}
\ No newline at end of file |