ポンクソフト

発生したイベントの状態を保持・保存する6つのパターン - jQuery入門

前ページ jQuery入門 TOP 次ページ

目次

  1. jQuery入門
  2. jQueryのインストール・簡単な使い方
  3. クイズゲームの作り方
  4. 秘密の暗号を作ってみよう(たぬき暗号)
  5. アクションゲームを作ってみよう(ぬりかべ)
  6. 画像を使ったジグソーパズルを作ってみよう
  7. もぐらたたきっぽいゲーム
  8. ドラッグ可能なポップアップウインドウを作ろう
  9. jQuery UI Sortableで1ラインオセロゲーム
  10. ブラウザ全体をブロックしてみる
  11. Geolocation APIを使って都道府県のセレクトボックスを現在地に近い順にソートする
  12. 発生したイベントの状態を保持・保存する6つのパターン
  13. Ajaxを利用したシンプルなイメージギャラリーを作ってみる
  14. テーブルにページ送り(ページング)を実装してみる
  15. jQuery UI Draggableを使って付箋(sticky)を作ってみる
  16. カラムでソートできるテーブルを自作してみる
  17. テーブルを使ったシンプルなドット絵エディタを作ってみる
  18. iPhoneのようにマウスではじいてスクロール(フリックスクロール)を実装してみる
  19. テキストフィールドの数値をマウスの上下移動で増減する
  20. iPhoneのように大きい画像の表示領域をマウスのドラッグで移動してみる
  21. iPhoneのように画像をダブルクリックした地点を中心に拡大縮小する
  22. リアルタイムプレビュー付きのHTMLエディタを作ろう
  23. 保存できる付箋を作ってみる(Cookie、localStorage)

イベントの状態を保持するパターン

仕事でjQueryを触ってみて、結局jQuery(JavaScript)でやることのほとんどは、DOM要素へのユーザーのイベント(クリックやキー入力など)の状態を保持しておき、最終的にGETやPOSTでサーバアプリに値を送る、という感じだと感じました。

そんなわけで、イベントの状態を保持する方法を6パターンほど考えました。

実行サンプル

テーブルの各セルをクリックするたびに背景色が黄色と白でトグルするサンプルで、保持パターンを考えます。

1.変化したCSSの値をそのままチェックする

何かイベントが起こった後というのはふつう、対象となるDOM要素の色が変わっていたり大きさが変わっていたりするので、その値を直接見るという、一番シンプルな方法です。
state_save1.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<title>状態保存1(CSSの値をチェック)</title>
<script>
$(function() {
  $('td').mousedown(function() {
    if ($(this).css('backgroundColor') == 'yellow') {
      $(this).css('backgroundColor', 'white');
    } else {
      $(this).css('backgroundColor', 'yellow');
    }
  });
});
</script>
<style>
td {
  background-color: white;
  border: 1px solid black;
  padding: 8px;
  cursor: pointer;
}
</style>
</head>
<body>
<table>
<tr><td>1</td><td>2</td><td>3</td></tr>
<tr><td>4</td><td>5</td><td>6</td></tr>
<tr><td>7</td><td>8</td><td>9</td></tr>
</table>
</body>
</html>
シンプルで良さそうですが、ブラウザによっては動いたり動かなかったりします。背景色の「white」や「yellow」の値がRGBの数値で格納されるのが原因のようです。このようにCSSの値を直接チェックするのは危険なものがあります。

2.クラスの追加・削除

2番目の方法は、イベントの状態を各要素ごとにクラスを追加・削除して管理する方法です。jQueryにはクラスを追加・削除する便利なメソッドがいくつか用意されています。以下にスクリプト部分を示します。
state_save2.html
・・・
<script>
$(function() {
  $('td').mousedown(function() {
    $(this).toggleClass('selected');
  });
});
</script>
<style>
td {
  background-color: white;
  border: 1px solid black;
  padding: 8px;
  cursor: pointer;
}
td.selected {
  background-color: yellow;
}
</style>
・・・
ずいぶんシンプルになりました。toggleClassによってselectedクラスがあれば消し、無ければ追加しています。クラスをトグルすると同時に色も変化するので直感的な方法だと思います。

3.オリジナルの属性値として保存する

簡単なものならば2番目の方法で十分なのですが、保持する情報が複雑になってくると別の方法を考えなければなりません。3番目は、タグに値を保存する専用の属性を用意する方法です。以下にサンプルを示します。
state_save3.html
・・・
<script>
$(function() {
  $('td').mousedown(function() {
    if ($(this).attr('color') == 'yellow') {
      $(this).attr('color', 'white');
    } else {
      $(this).attr('color', 'yellow');
    }
    $(this).css('backgroundColor', $(this).attr('color'));
  });
});
</script>
・・・
「color」というタグの属性を用意してそこに現在の色を保存しています。一応動きますが、勝手に独自の属性を増やしていいのか分かりません。やっちゃダメかも。

4.値を保存する場所を外に出す

規模が大きくなってきたら、値を保持する領域は外出しの配列などにしたほうが、デザインとの分離が出来て良いと思います。以下にスクリプト部分を示します。
state_save4.html
・・・
<script>
$(function() {
  var colors = [];
  $('td').mousedown(function() {
    var n = this.id.split('_')[1] - 1;
    if (colors[n] == 'yellow') {
      colors[n] = 'white';
    } else {
      colors[n] = 'yellow';
    }
    $(this).css('backgroundColor', colors[n]);
  });
});
</script>
<style>
td {
  background-color: white;
  border: 1px solid black;
  padding: 8px;
  cursor: pointer;
}
</style>
</head>
<body>
<table>
<tr><td id="td_1">1</td><td id="td_2">2</td><td id="td_3">3</td></tr>
<tr><td id="td_4">4</td><td id="td_5">5</td><td id="td_6">6</td></tr>
<tr><td id="td_7">7</td><td id="td_8">8</td><td id="td_9">9</td></tr>
</table>
・・・
テーブルのそれぞれのセルにIDを付けているのがポイントです。このID値によってクリックされた要素がどの要素か判別し、配列colorsに状態を保持します。デメリットとしてて、管理する情報が多くなってしまいます。

5.DOM要素のプロパティに保持する

そもそもDOM要素はJavaScriptのオブジェクトなので、そのプロパティとして情報を保持してしまえばシンプルで楽です。
state_save5.html
・・・
<script>
$(function() {
  $('td').mousedown(function() {
    if (this.color == 'yellow') this.color = 'white';
    else this.color = 'yellow';
    $(this).css('backgroundColor', this.color);
  });
});
</script>
・・・
この方法はシンプルなのですが、オブジェクトのプロパティとして既に定義されているものと重複する危険性があります。

6.dataメソッドで保持する

jQueryオブジェクトのdataメソッドというものを使うと、オブジェクトに独自のデータをいくらでも追加することができます。以下にサンプルを示します。
state_save6.html
・・・
<script>
$(function() {
  $('td').mousedown(function() {
    if ($(this).data('color') == 'yellow') {
      $(this).data('color', 'white');
    } else {
      $(this).data('color', 'yellow');
    }
    $(this).css('backgroundColor', $(this).data('color'));
  });
});
</script>
・・・
jQueryっぽく、直感的に安全に使えると思います。

まとめ

上に示した6つのパターンはどれもメリットとデメリットがあり、決定版というものはありません。自分が仕事でjQueryを使ったときは、データは外出しのオブジェクト(4)として管理しておき、タグにはdataメソッドを付けて(6)関連付けしました。
前ページ jQuery入門 TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0

このページに関するコメントをどうぞ

お名前:


ページング作成中
シンプルだけど結構応用が効く!
2016/07/25 18:26

良く理解しましょう
$(function() {
$('input').click(function() {
if ($(this).val() == 3) alert('正解!');
else alert('はずれ!');
});
});

valの値が2番なら正解を表示と言う意味なので、3番目を正解にするなら

val() == 3)書き換えればいいです。

inputのところは関係ないです。
2016/03/07 15:52

教えてください
クイズゲームの作り方で、2問目、3問目を作っても絶対に
2番が正解になりますよね?

input要素を読み込んでいるので、全て同じ動作になると思うんですが、他の番号を正解にしたい場合どうしたら良いでしょうか?

また、inputにid行ってみましたが、うまく反応しませんでした。
2016/03/07 14:13

まほ
わかりやすく説明していただきありがとうございます!
ところで、
$.each(items, function(i, item) {
make().css(item.css).html(item.html);
});
の部分だけ今ひとつ理解ができなかったのですが
localStorage.stickyに値が入っているときに
①itemsという配列に JSON形式の文字列をjsのオブジェクトとして返し
②それぞれのitemsの要素に対してcss、htmlの要素の中身を入れている

という認識で良いでしょうか?

function(i,item)のところにiが入っていますが、これはどこに影響を与えているのでしょうか?

長々とすみませんがご回答いただければ嬉しいです!
2016/02/17 21:03

ぴよよ
↓ 目次8からHTMLのheadの部分の記述が・・・スミマセン
2016/02/06 01:34

ぴよよ
これまでスムーズにできたのですが、今回わからないです><;
2016/02/06 01:31

UT
わかりやすいですね!感謝します。
2016/01/26 10:02

こっぺぱん
ありがとです
2016/01/19 15:32


ありがとうございます。
2016/01/19 15:32

tetu
ありがとうございます
面白いものができそう予感
2015/11/02 15:36

残りを読む »