使用する想定状況
EC サイトにおける、商品一覧・商品詳細・カートページでそれぞれ固有の処理を走らせたい。
ただし、商品一覧(item-list.js)・商品詳細(item-detail.js)・カートページ(cart.js)を言ったように各ファイルを用意するのではなく、1 つの index.js に集約してページごとに実行処理を分岐させる。
準備
ページを特定できるよう属性を付与する
各ページに特定できるような属性を付けてスクリプト側から区別できるようにする(ここでは data-page)
<!-- 商品一覧 -->
<body data-page="itemList">
<!-- イカした一覧ページ -->
</body><!-- 商品詳細 -->
<body data-page="itemDetail">
<!-- イカした詳細ページ -->
</body><!-- カート -->
<body data-page="cart">
<!-- イカしたカートページ -->
</body>ハンドリングするスクリプト
export default eventLoader = (functions) => {
fire(functions, "common");
// ページ名を取得
const pageName = document.body.dataset.page;
if (!pageName) return;
// ページ固有のJSを実行
fire(functions, pageName);
};
const fire = (functions, pageName) => {
// ページ名とイベントが一致しているかチェック
const defaultFunction = "init";
const hasFunction =
functions[pageName] &&
typeof functions[pageName][defaultFunction] === "function";
if (!hasFunction) return;
// 一致したdefault eventを実行
try {
functions[pageName][defaultFunction]();
} catch (e) {
console.error(e);
}
};