[JavaScript] 指定ページのみ発火させるスクリプト構成

3 min read

使用する想定状況

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);
  }
};

使用方法

eventLoader を読み込む

import eventLoader from "./eventLoader";

import common from "./common";
import itemList from "./item-list";
import itemDetail from "./item-detail";
import cartPage from "./cart";

const functions = {
  // 共通
  common,
  // ページ
  itemList,
  itemDetail,
  cart: cartPage,
};

document.addEventListener("DOMContentLoaded", eventLoader(functions), false);

eventLoaderの引数に渡すObject :

keyvalue
data-pageと一致する名称data-pageで実行させたいモジュール

実行用モジュール

export default {
  init() {
    // SUGOI SYORI
  },
};

Object内にinit関数を用意する(Facade な役割)

※こちらは前述のeventLoaderの実装仕様に依るので、そちらの処理を書き換えることで当然クラスを実行するかたちにもできる

大まかな仕様

  1. DOMContentLoaded時にeventLoaderを実行
    1. eventLoaderには各種モジュールを定義したObjectを渡す
  2. eventLoader:
    1. body要素のdata-pageを取得する
    2. data-pageの文字列にマッチしたモジュール内のinit()を実行する

このページをシェアする

関連タグ

関連記事

[CSS] 究極のIE対策

条件付きコメント / メディアクエリを利用して IE10〜IE11 に対応する

Deprecated になった jQuery API を静的に検出する方法

モチベーション / eslint-plugin-no-jquery を導入する / 実行する

Boolean型の変数に適した命名規則

背景 / プレフィックス / どのような条件なのか分かりやすくする / 否定形を避ける / 同じ意味の単語を避ける / プロジェクトの命名規則やコーディング規約に従う / Linter で矯正する

CSS in JSとは何か

想定読者 / そもそも JS フレームワーク(React、Vue.js)を採用する理由とは何か / 「命令的 UI」 と 「宣言的 UI」 / 「命令的 UI」 VS 「宣言的 UI」 / CSS in JS とは / CSS in JS ライブラリ / Emotion の使い方 / 利用するメリット / 利用するデメ