« モテるエンジニアの7つの習慣 | メイン | Google App Engine Java 触ってみたメモ »

IEでlabelの子要素に画像を含める
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

yamaokaです。

HTMLのフォームでチェックボックスやラジオボタンを扱う場合、 対応したlabel要素を用意することが多いと思います。

<input type="checkbox" id="foo" name="foo">
<label for="foo">
  キャプション
</label>
わざわざ小さなチェックボックスやラジオボタンを狙ってクリックする必要がなくなり、 labelタグで囲まれたキャプションの部分をクリックすればよいようになります。

しかし、次のような場合どうでしょう。

<input type="checkbox" id="foo" name="foo">
<label for="foo">
  <img src="bar.gif">
  キャプション
</label>
label要素の中にimg要素(画像)が含まれているような場合を考えてみます。

もっと具体的にいうと、ユーザーを選択する画面でそれぞれのユーザーのアイコンと名前を表示させるような場合です。
ユーザー選択画面例
ユーザー選択画面例 posted by (C)フォト蔵

動作は先程と変わらないはず......なのですが、IEの場合(IE6、IE7、IE8ともに)、 画像をクリックしてもチェックボックスの値が切り替わりません。 そこでブラウザーシェアの一番大きなIEで使い勝手が落ちてしまうのを防ぐべく、 次のようなJavaScriptを書きました。

<input type="checkbox" id="foo" name="foo">
<label for="foo" onclick="return clickFormLabel(this)">
  <img src="bar.gif">
  キャプション
</label>

<script type="text/javascript">
var clickFormLabel = function(label) {
  var e = null;
  try {
    e = document.getElementById(label.htmlFor);
  } catch (exception) {}
  if (e != null) {
    if (e.tagName == "INPUT") {
      switch (e.type) {
      case "checkbox":
        e.checked = !e.checked;
        break;
      case "radio":
        e.checked = true;
        break;
      default:
        e.focus();
        break;
      }
    } else {
      e.focus();
    }
  }
  return false;
};
</script>

何をしているのかというと、label要素がクリックされた場合にfor属性で指定されたidの要素が チェックボックスだったら値のON/OFFを切り替え、ラジオボタンだったら選択状態に。 それ以外の場合は要素にフォーカスを当てているだけです。 これでIEでも他のブラウザと同じような使い勝手を実現できます。

少しのJavaScriptでサイト訪問者の使い勝手が向上するケースは結構あるように思います。 そういう場合は積極的にJavaScriptを使っていきたいところですね。

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/1608

この一覧は、次のエントリーを参照しています: IEでlabelの子要素に画像を含める:

» Comments/JavaScript from PukiWiki Plus! (PukiWiki/TrackBack 0.4)
JavaScript arguments.lengthで実際に渡された引数の数がわかる -- 2010-08-10 (Tue) 11:04:05 htt... [詳しくはこちら]

コメントを投稿


画像の中に見える文字を入力してください。

  [PR] 転職
ウノウラボはウノウ株式会社のエンジニア/デザイナーによる大小のアウトプットを行っていく場です。

現在ウノウは絶賛人材募集中です。詳細は求人ページへ。

About

2009年4月 8日 17:47に投稿されたエントリーのページです。

ひとつ前の投稿は「モテるエンジニアの7つの習慣」です。

次の投稿は「Google App Engine Java 触ってみたメモ」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

ウノウサービス