お手軽クロスブラウザ対応イベント処理関数

prototype.jsMochiKitを使うまでもないんだけどお手軽にクロスブラウザ対応イベント処理がしたいというときに使うと便利。

var observeFunc = null;

function observe(elem, eventType, listener, capture) {
  if (observeFunc == null) {
    if (elem.addEventListener) {
      observeFunc = function(_elem, _eventType, _listener, _capture) {
        _elem.addEventListener(_eventType, _listener, _capture);
      };
    }
    else if (elem.attachEvent) {
      observeFunc = function(_elem, _eventType, _listener, _capture) {
        _elem.attachEvent('on' + _eventType, function() {
            _listener.call(_elem, window.event);
          });
      };
    }
  }

  if (observeFunc) {
    observeFunc(elem, eventType, listener, capture);
  }
}

それを使って書いたのが以下のコード。

function attach_infield_annotation(field, default_value) {

  function show_default(field) {
    if (field.value == "") {
     field.value = default_value;
    }
  }

  function clear_default(field) {
    if (field.value == default_value) {
      field.value = "";
    }
  }

  observe(field,      'blur',   function(e) { show_default(this); });
  observe(field,      'focus',  function(e) { clear_default(this); });
  observe(field.form, 'submit', function(e) { clear_default(field); });

  show_default(field);
}


参考: