JavaScriptでタイマーセットして、コンテンツの表示・非表示を制御
2019年4月22日
皆さんこんにちは!
花粉症が治らないせいなのか、毎晩定期的に起きてそのまま眠れない老人末吉です。
GWに備えたコンテンツの表示・非表示スクリプト
さて、もういくつねるとGWがやってきます。
今回のGWは10連休もあり、いくつかの企業さんは実際に10連休取られることもあるでしょう。
そんなときに困ることがひとつ、GW中の更新です。
きっと多くのウェブ担当者さんは以下のことをお考えでしょう。
GW中に終了するサービスがあるけど、更新のために休日出勤したくない・・・
きっと多くの経営者さんは以下のことをお考えでしょう。
たった1時間の業務のために従業員を出社させ、手当を払わなければいけないのか・・・
ならば、もうJavaScriptを使用して自動的にコンテンツの表示・非表示を制御しましょう。
JavaScript
/**
* HTMLエレメント内に書かれたdata属性の日付に従い、
* コンテンツを表示・非表示処理する。
*/
window.onload = () => {
const elements = document.querySelectorAll('.js-timer');
elements.forEach((el) => {
const now = new Date().getTime();
const start = new Date(el.dataset.start).getTime();
const end = new Date(el.dataset.end).getTime();
let flag = false; // Global Flag
/**
* 現在が開始日以降か判定
*
* @return Boolean;
*/
const checkerStart = () => {
if (now > start) {
return true;
} else {
return false;
}
};
/**
* 現在が終了日以前か判定
*
* @return Boolean;
*/
const checkerEnd = () => {
if (now < end) {
return true;
} else {
return false;
}
};
/*
* メイン判定処理
*/
if (start && end) {
if (checkerStart() && checkerEnd()) flag = true;
} else if (start && !end) {
if (checkerStart()) flag = true;
} else if (!start && end) {
if (checkerEnd()) flag = true;
} else {
flag = false;
}
if (!flag) el.setAttribute('style', 'display: none;');
});
};
HTML
<!DOCTYPE>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>コンテンツの日付を判定して表示、非表示</title>
</head>
<body>
<div class="js-timer" data-start="2019/04/01 0:00" data-end="2019/05/01 0:00">aaaa1</div>
<div class="js-timer" data-start="2019/04/10 0:00">eeee1</div>
<div class="js-timer" data-end="2019/05/15 0:00">cccc1</div>
<script src="./timer.js" async></script>
</body>
</html>
コードレビュー
はい荒っぽいコードですが、見ていきましょう。
const elements = document.querySelectorAll('.js-timer');
elements.forEach((el) => {});
まずはHTMLの中から js-timer というclassを持ったエレメントを拾い出し、
forEachでひとつひとつまわします。
const now = new Date().getTime();
const start = new Date(el.dataset.start).getTime();
const end = new Date(el.dataset.end).getTime();
let flag = false; // Global Flag
/**
* 現在が開始日以降か判定
*
* @return Boolean;
*/
const checkerStart = () => {
if (now > start) {
return true;
} else {
return false;
}
};
/**
* 現在が終了日以前か判定
*
* @return Boolean;
*/
const checkerEnd = () => {
if (now < end) {
return true;
} else {
return false;
}
};
now に現在の時刻、startにHTML要素に書かれた表示開始日(data-start)、endにHTML要素に書かれた表示終了日(data-end)をしまいます。
そして flag に false をセットしておきます。
また、checkerStart は”今”が表示開始日以降か判定し、そうであればtrueを返します。そうでなければfalseです。
checkerEndは”今”が表示終了日以前か判定し、そうであればtrueを返します。そうでなければfalseです。
/*
* メイン判定処理
*/
if (start && end) {
if (checkerStart() && checkerEnd()) flag = true;
} else if (start && !end) {
if (checkerStart()) flag = true;
} else if (!start && end) {
if (checkerEnd()) flag = true;
} else {
flag = false;
}
さて、ここからが判定処理です。
表示開始日と表示終了日、どちらもセットされていれば一個目のifが走ります。
表示開始日のみ、あるいは表示終了日のみであればその後の処理が走ります。
どれもそれぞれ、先ほどの無名関数checkerStartとcheckerEndが走り判定がtrueであれば、flagをtrueに変更します。
そして・・・
if (!flag) el.setAttribute('style', 'display: none;');
flagがfalseであるならば、その要素に display: none; を付与します。
trueであるならば、表示してよい期間内ということなので何もしません。
まとめ
もちろんこの仕組みは逆にしてしまってもよいです。
最初にdisplay: none;になってる要素を検出し、表示期間内であれば表示するということもOKです。
ただし、その場合はその要素が display: float; や display: block; でありたかった場合困ります。
そのため、.is-hide { display: none !important; } など非表示にするutility classを用意し、表示期間内であればis-hideを取り除くといった処理にしましょう。
本記事に書いたスクリプトはES5では動きませんので、babel等でトランスパイルして使用してください!
さて、これにてGWを満喫できるようになったGWの担当者さん、よいGWを!

カテゴリ




