Rewish

ウェブデザイン、HTML、CSS、JavaScript、PHP、WordPress、Movable Typeなど、Web制作で役立つかも知れないBlog.

Search

Entry Search

シンプルなイベントカレンダーを実装するjQueryプラグイン

カテゴリー
JavaScript
タグ
Download, jQuery

ある朝僕は、以下の用件を満たすカレンダープラグインを探していました。

  • シンプルなHTMLを吐いてデザインの変更が容易
  • コールバック関数である程度処理をイジれる
  • 月移動のアニメーションが素人ウケしそう

小一時間色々なプラグインを見ましたが、中々しっくり来るモノが無く、「これは探すより作った方が早そうかなぁ」と思ったので作ってみました。

目次

  1. 機能概要
  2. ダウンロード
  3. 動作デモ
  4. 導入方法
  5. オプション
  6. イベントを追加
  7. コールバック関数
  8. イベントをプリロード

機能概要

記事の初めで大方出ていますが、主に以下の機能を備えています。

  • 月移動時のスライドアニメーション
  • 生成するHTMLを包含する要素のclass変更
  • イベント追加、月移動などに対応するコールバック関数
  • JSON形式でのイベント追加
  • イベント用JSONの先読み機能 (月移動時の遅延対策)
  • 表示中の月に属さない日付の表示、非表示

ダウンロード

jQuery.calendar [圧縮版] - v1.0.3

※開発版はrewish's jQuery.calendar at master - GitHubに置いています。

  1. 2010-01-20 - v1.0.3 - addDayコールバックのthis.dayで日を取得できるように変更。
  2. 2010-01-20 - v1.0.2 - bugfix
  3. 2009-12-05 - v1.0.1 - bugfix
  4. 2009-11-05 - v1.0.0 - 公開

動作デモ

デモを見る

導入方法

jQueryプラグインではお馴染み、jQueryを読み込んでからプラグインを読み込む

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.calendar-min.js"></script>

実際にカレンダーを呼び出すコードは以下のようになります。

jQuery(document).ready(function($) {
	// 初期状態でカレンダーを呼び出す
	$(expr).calendar();

	// オプションを付けて呼び出す
	$(expr).calendar({
		オプション名: オプション値,
		オプション名: オプション値
	});
});

オプション

以下のオプションが指定できます。

オプション名 オプション値 初期値 説明
year 初期表示する年 現在の年
month 初期表示する月 現在の月
week 日曜日から始まる週の配列 [日, 月, 火, 水, 木, 金, 土] thead部分
caption 表示月のキャプション %Y年%M月 %Y=年、%M=月に置換
navi 0=前月、1=次月の配列 [前の月へ, 次の月へ]
todayLink 「今日」へのリンク 今日 [%Y年%M月%D日] %Y=年、%M=月、%D=日に置換
moveTime スライドアニメの速度 700
events イベント(行事)を指定 イベントを追加
hideOther 表示中の月以外の日付を非表示 false 非表示にする場合はtrue
cssClass 包含要素のclass jqueryCalendar
addDay 日付追加コールバック addDay
addEvent イベント追加コールバック addEvent
beforeMove 月移動前のコールバック beforeMove
afterMove 月移動後のコールバック afterMove
preloadEvent イベントデータ先読み イベントをプリロード

イベントを追加

イベントを追加するには、オプションeventsに連想配列を渡します。

addEventコールバック関数をデフォルトの状態で使用する場合は、以下のような書式になります。

$(expr).calendar({
	events: {
		// 月と日はゼロパディングしてもしなくてもOK
		'2009-10-01': {
			title: 'titleを指定すると、指定した文字列がtitle属性に挿入される',
			url: 'urlを指定した場合リンクになる'
		},
		'2009-10-2': {
			title: 'titleを指定すると、指定した文字列がtitle属性に挿入される',
			url: 'urlを指定した場合リンクになる'
		}
	}
});

addEventコールバック関数を使って独自の処理にする場合は、連想配列の内容に制限はありません。

$(expr).calendar({
	events: {
		'2009-10-01': {
			hoge: 'addEventの第二引数で受け取れる (evt.hoge など)'
		}
	}
});

詳しくはコールバック関数 - addEvent参照して下さい。

コールバック関数

addDay

表示月の日付セルを追加する際に呼ばれる関数。

実行するタイミング
日付セル追加時
第一引数
日付セル(td)のjQueryオブジェクト

this.dayで日(day)を取得できます。これはtd.text()の戻り値と同じ値です。

$(expr).calendar({
	addDay: function(td) {
		// 日付の後ろに「日」を付ける (例: 10日)
		td.text(td.text() + '日');
		// 上記と下記の結果は同じ
		td.text(this.day + '日');
	}
});

addEvent

イベント(行事)を追加する際に呼ばれる関数。

実行するタイミング
イベント(行事)追加時
第一引数
日付セル(td)のjQueryオブジェクト
第二引数
eventsオプションで指定したイベント

第二引数にはeventsで指定した日付の内容がそのまま渡される。イベントを追加の例では連想配列を渡しています。

$(expr).calendar({
	// 以下は初期値
	addEvent: function(td, evt) {
		var elem = typeof evt.url != 'undefined'
			? $('<a />').attr('href', evt.url)
			: $('<span />');
		if (evt.id) {
			elem.attr('id', 'event-' + evt.id);
		}
		if (evt.title) {
			elem.attr('title', evt.title);
		}
		elem.text(td.text());
		td.text('').append(elem).addClass('event');
	}
});

beforeMove & afterMove

月移動前後に呼ばれる関数。

実行するタイミング
月移動前後
第一引数
全オプションの連想配列
第二引数
移動する年
第三引数
移動する月
$(expr).calendar({
	// 月移動前に次のイベントをセット
	beforeMove: function(option, year, month) {
		// /hoge/YYYYMM からJSONを取得
		$.getJson('/hoge/' + year + month, function(json) {
			option.events = json;
		});
	}
});

preloadEventがあるので使用用途が微妙。

イベントをプリロード

イベントデータを月ごとに読み込む場合、月移動時にAjaxなどでイベントデータを読み込むと遅延が発生するので、プリロード(先読み)機能を用意しました。

実行するタイミング
カレンダーを表示した直後
第一引数
表示している年
第二引数
表示している月

使用方法

オプションpreloadEventに関数を定義して、以下のようにイベントデータをreturnして下さい。

$(expr).calendar({
	preloadEvent: function(year, month) {
		// 表示月が2009年10月の場合
		:
		: AjaxでJSONを読み込むなど
		:
		return {
			'2009-09-1': {
				title: '前月のイベント'
			},
			'2009-11-1': {
				title: '次月のイベント'
			}
		}
	}
});

この場合、前月と次月のイベントを含むデータをreturnしなければなりません。

イベントデータが多い場合は、前月と次月を分けて記述することも出来ます。

$(expr).calendar({
	preloadEvent: function(year, month) {
		// 表示月が2009年10月の場合
		:
		: AjaxでJSONを読み込むなど
		:
		return {
			// 前月のデータはprevの中に
			prev: {
				'2009-09-1': {
					title: '前月のイベント'
				}
			},
			// 次月のデータはnextの中に
			next: {
				'2009-11-1': {
					title: '次月のイベント'
				}
			}
		}
	}
});

イベント追加の処理が少なくなるので、少しだけ速くなります。