直前の内容を再現する

textarea に対して

  • onfocus したとき、空じゃなかったら直前の内容を保持しておいてその内容をクリア
  • onblur したとき、空だったらさっき保持した直前の内容を埋め込む

というのをサクッと書いてみた。

var tmp;

$('[name = "source"]').on({
  focus: function () {
    if($(this).val()) {
      tmp = $(this).val();
      $(this).val("");
    }
  },
  blur: function () {
    if(!$(this).val()) {
      $(this).val(tmp);
    }    
  }
});

何となくグローバル変数の tmp が気持ち悪いんだけど、無名関数だの高階関数だのバリバリ使ってるし、もうこれはこれでええんやろか ? 変数のスコープ的にもここしか考え付かん。ちなみに name 属性で拾ってるのは Struts 使ってるからその方が早いってだけです。
2013/04/16 追記 : 直前の内容を再現するというのもちょっと何だし、JavaScript 版の挙動に合わせて以下のように変更。

$('[name = "source"]').on({
  focus: function () {
    if($(this).val() == "ここにソースを貼り付けてください。") {
      $(this).val("");
    }
  },
  blur: function () {
    if(!$(this).val()) {
      $(this).val("ここにソースを貼り付けてください。");
    }    
  }
});

JavaScript 版だと DOM で書き変えてるので this.defaultValue で拾ってこれるんだけど、Web アプリ版だと HTML そのものが書き換わるので this.defaultValue が実行結果に依存してよろしくない。