\s*\)/i); var u = m ? m[2] : ""; return /\.gif(\?|#|$)/i.test(u) ? new URL(u, location.href).href : ""; } catch (e) { return ""; } } function introActive() { try { return !!(window.top && window.top !== window && window.top.mnIntroActive); } catch (e) { return false; } } function setBg(url) { document.body.style.setProperty("background-image", "url(\"" + url + "\")", "important"); } /* 대문이 사라질 때까지 기다림: 바깥 틀의 신호 또는 0.3초마다 확인 */ function waitIntro(cb) { if (!introActive()) { cb(); return; } var fired = false; function go() { if (fired) return; fired = true; window.removeEventListener("message", onMsg); clearInterval(t); cb(); } function onMsg(e) { if (e.origin === location.origin && e.data && e.data.type === "mn-intro-done") go(); } window.addEventListener("message", onMsg); var t = setInterval(function () { if (!introActive()) go(); }, 300); } /* GIF 첫 장면을 정지 그림으로 만들어 대문이 끝날 때까지 깔아 둠 (지원하는 브라우저만) */ function stillFrame(blob) { if (!("ImageDecoder" in window)) return Promise.resolve(""); try { var dec = new ImageDecoder({ data: blob.stream(), type: "image/gif" }); return dec.decode({ frameIndex: 0 }).then(function (r) { var f = r.image, c = document.createElement("canvas"); c.width = f.displayWidth; c.height = f.displayHeight; c.getContext("2d").drawImage(f, 0, 0); f.close(); dec.close(); return new Promise(function (res) { c.toBlob(function (b) { res(b ? URL.createObjectURL(b) : ""); }, "image/png"); }); }).catch(function () { return ""; }); } catch (e) { return Promise.resolve(""); } } /* GIF 파일은 바깥 틀(index.php) 창에 한 번만 받아 두고 페이지마다 다시 씀 → 페이지를 옮겨도 다시 내려받지 않음 */ function getBlob(url) { var host = null; try { if (window.top && window.top !== window && window.top.location.origin === location.origin) host = window.top; } catch (e) {} var store = host || window; if (store.mnBgBlob && store.mnBgBlob.url === url) return store.mnBgBlob.p; var p = fetch(url, { cache: "force-cache", credentials: "same-origin" }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.blob(); }); store.mnBgBlob = { url: url, p: p }; p.catch(function () { if (store.mnBgBlob && store.mnBgBlob.p === p) store.mnBgBlob = null; }); return p; } function start() { var url = gifUrl(); if (!url || !window.fetch || !window.URL || !URL.createObjectURL) { done(); return; } getBlob(url) .then(function (blob) { var play = function () { var obj = URL.createObjectURL(blob); /* 새 주소 = 새 이미지 → 처음부터 재생 */ setBg(obj); done(); window.addEventListener("pagehide", function () { URL.revokeObjectURL(obj); }); }; if (!introActive()) { play(); return; } stillFrame(blob).then(function (still) { if (still) { setBg(still); done(); } else window.mnBgReady = true; /* 정지 그림을 못 만들면 대문이 끝날 때까지 배경 이미지를 비워 둠 */ waitIntro(play); }); }) .catch(function () { done(); }); } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", start); else start(); })();
Twemoji © Twitter · CC-BY 4.0

배너 / 그 외

비밀글 기능으로 보호된 글입니다. 작성자와 관리자만 열람하실 수 있습니다.
본인이라면 비밀번호를 입력하세요.