import DOM from './data/domData'; import { setState } from '@js/modules/data/stateData'; /** * クリックイベント処理をまとめたオブジェクト */ export const clickEvents = { pageTop() { const thisFunc = clickEvents.pageTop; const nowY = window.pageYOffset; window.scrollTo(0, Math.floor(nowY * 0.8)); if (0 < nowY) { window.setTimeout(thisFunc, 10); } }, toggleMenu(e) { e.preventDefault(); const drawerMenu = DOM.drawerMenu; if (null === drawerMenu) return false; // マウスクリックで発火したイベントかどうか const isMouseClicked = 0 !== e.screenX && 0 !== e.screenY; // クリックされたドロワーメニューのトグルボタンをセット const theToggleBtn = e.currentTarget; DOM.drawerToggleBtn = theToggleBtn; const dataDrower = document.documentElement.getAttribute('data-drawer'); if ('opened' !== dataDrower) { // オープン処理 document.documentElement.setAttribute('data-drawer', 'opened'); setState.modalOpen(true); // クリックしたボタンを記憶 DOM.lastFocusedElem = theToggleBtn; } else { // クローズ処理 document.documentElement.setAttribute('data-drawer', 'closed'); // キー操作でクローズした場合、元のボタンにフォーカスを戻す if (!isMouseClicked && DOM.lastFocusedElem) { DOM.lastFocusedElem.focus(); DOM.lastFocusedElem = null; setState.modalOpen(false); } } }, toggleSearch(e) { e.preventDefault(); const searchModal = DOM.searchModal; if (null === searchModal) return false; // マウスクリックで発火したイベントかどうか const isMouseClicked = 0 !== e.screenX && 0 !== e.screenY; // クリックされた検索トグルボタンをセット const theToggleBtn = e.currentTarget; // DOM.searchToggleBtn = theToggleBtn; if (!searchModal.classList.contains('is-open')) { // オープン処理 searchModal.classList.add('is-open'); setState.modalOpen(true); // クリックしたボタンを記憶 DOM.lastFocusedElem = theToggleBtn; // 入力エリアにフォーカス setTimeout(() => { searchModal.querySelector('[name="s"]').focus(); }, 250); } else { // クローズ処理 searchModal.classList.remove('is-open'); // キー操作でクローズした場合、元のボタンにフォーカスを戻す if (!isMouseClicked && DOM.lastFocusedElem) { DOM.lastFocusedElem.focus(); DOM.lastFocusedElem = null; setState.modalOpen(false); } } }, /** * サブメニューのアコーディオン */ toggleSubmenu(e) { e.preventDefault(); const btn = e.currentTarget; const submenu = btn.parentNode.nextElementSibling; btn.classList.toggle('is-opened'); submenu.classList.toggle('is-opened'); e.stopPropagation(); }, }; /** * data-onclick属性を持つ要素にクリックイベントを登録 * * @param {*} dom 該当要素を検索する親( AJAXで読み込んだ要素からも探せるように引数化 ) */ export default function addClickEvents(dom) { const elemsHasClickEvent = dom.querySelectorAll('[data-onclick]'); for (let i = 0; i < elemsHasClickEvent.length; i++) { const elem = elemsHasClickEvent[i]; if (elem) { const funcName = elem.getAttribute('data-onclick'); const clickFunc = clickEvents[funcName]; elem.addEventListener('click', function (e) { clickFunc(e); }); } } }