2008/09/09(火)IEとFFの互換性を維持するために

片方にあったり無かったりするメソッドやプロパティを何とかするためのメモ。
無い場合はundefinedとか返されるので || で繋いでしまえばなんとかなることが多い。

メモ書きなので間違えてるかも。
でも、
x = obj.yyy || obj.zzz;
って書く分には逆でも問題なかったりする。

そのうちいろいろ追加したりすると思う。

プロパティまわり

IE FF 用途
innerTexttextContentエレメントの中のテキストのみ取り出す
e.srcElemente.targetイベントの発生元
tagNamelocalNameタグの名前(AとかIMGとか)*
obj.currentStyledocument.defaultView.getComputedStyle(obj, '')実際に表示されているスタイル
clientHeightoffsetHeightエレメントの高さ
clientWidthoffsetWidthエレメントの幅

* Safari, Google ChromeはlocalNameは小文字で、tagNameは大文字で返すっぽい

イベントまわり

デフォルトの動作を止める

_preventDefault = function (ev){
  if(IsIE)  ev.returnValue = false;
  else      ev.preventDefault();
}

これ以上次の要素にイベントを送らない

但し、IEとFFではイベントの発生順が逆なので注意

_stopPropagation = function (ev){
  if(ADIARY.IsIE) ev.cancelBubble = true;
  else            ev.stopPropagation();
}

エレメントのイベントにメソッドを割り当てる

クリックとかいろいろ。
但し、無名関数を登録すると取り除けなくなるので注意*1

addEvent = function (target, name, func) {
  if(target == undefined || name == '' || func == undefined) return;
  if(target.addEventListener) target.addEventListener(name, func, false);
  else if(target.attachEvent) target.attachEvent('on'+name, func);
  else return false;// setAttribute('on'+name, func);

  return true;
}

エレメントのイベントからメソッドを取り除く

上のaddEventで追加したやつ限定

delEvent = function (target, name, func) {
  if(target == undefined || name == '' || func == undefined) return;
  if(target.removeEventListener) target.removeEventListener(name, func, false);
  else if(target.detachEvent)    target.detachEvent) ('on'+name, func);
  else return false;// setAttribute('on'+name, '');

  return true;
}

*1 : arguments.calleeを使うと取り除けたりするけどそれは例外