jQueryで一回だけイベント

jQueryで一回だけクリックできる(または二回目以降別のハンドラに切り替わる)ボタンを作りたい場合、もっとも簡単な方法はこんな感じじゃないかなという話です。

まずは、ありがちな方法。

var oneshot = function(){
  alert('oneshot');
  $('button').unbind('click', oneshot);
  return false;
};
$('button').click(oneshot);

関数をいったん定義しないといけないので、ひと手間食いますね。jQueryのサンプルのように、関数を直接引数のところに書けたらな。じゃあ、こう書けばどうでしょう。

$('button').click(function(){
  alert('oneshot');
  $('button').unbind('click', arguments.callee);
  return false;
});

arguments.calleeを使いました。この変数はシステム予約変数で、呼び出された関数インスタンスを指しています。まあ、クラスでいうthisのようなものの関数版ですね。これで、固有な名前を設けずに、「自分」をunbindすることができました。

これからは、ハンドラ抜くレベルでイベントを無効化する必要があったり、動作そのものが変化するようなものでも、関数リテラルをががーっと勢いで作ることができそうです。


追記: yamada-22さんに添削いただきました。もっとも短く書くというのは、つまりこういうことですよね。上のは、短いというより、かゆいところに手を届かせる感じですね。

$('button').one('click', function(){
  alert('oneshot');
  return false;
});