Web標準普及プロジェクト

ブラウザ判別とオブジェクト検出

JavaScriptを使ったダイナミックHTMLを実現する場合、現状ではブラウザ毎に別々にコードを記述する必要があります。 そこで多くのサイトではブラウザ判別のコードが書かれています。

function toggleLayer(id){
  if (navigator.appName == "Microsoft Internet Explorer") {
    if (document.all(id).style.visibility == "hidden") {
      document.all(id).style.visibility = "visible";
    } else {
      document.all(id).style.visibility = "hidden";
    }
  } else if (navigator.appName == "Netscape") {
    if (parseInt(navigator.appVersion) < 5) {
      if (document.layers[id].visibility == "hide") {
        document.layers[id].visibility = "show";
      } else {
        document.layers[id].visibility = "hide";
      }
    } else {
      if (document.getElementById(id).style.visibility == "hidden") {
        document.getElementById(id).style.visibility = "visible";
      } else {
        document.getElementById(id).style.visibility = "hidden";
      }
    }
  }

動作例:このリンクをクリックしてください

上の例ではnavigatorオブジェクトのappNameというプロパティの値を見てブラウザを判別し、 "Microsoft Internet Explorer"と"Netscape"に対応するコードを実行します。

しかし、Operaのようにnavigator.appNameやnavigator.appVersionの値を簡単に変更できるブラウザもありますし、 個々のブラウザを一つ一つ判別しなければならないので、良い方法とは言えません。

オブジェクト検出による振り分け

ブラウザ判別に代わる方法として、実際に使いたいオブジェクトの有無を判定するオブジェクト検出という方法があります。

function toggleLayer2(id){
  if (document.getElementById) {
      if (document.getElementById(id).style.visibility == "hidden") {
        document.getElementById(id).style.visibility = "visible";
      } else {
        document.getElementById(id).style.visibility = "hidden";
      }
  } else if (document.all) {
    if (document.all(id).style.visibility == "hidden") {
      document.all(id).style.visibility = "visible";
    } else {
      document.all(id).style.visibility = "hidden";
    }
  } else if (document.layers) {
    if (document.layers[id].visibility == "hide") {
      document.layers[id].visibility = "show";
    } else {
      document.layers[id].visibility = "hide";
    }
  } 
}

動作例:このリンクをクリックしてください

この例はdocument.getElementByIdというオブジェクトを持っているブラウザに対しては同じコードを実行します。 document.getElementByIdというオブジェクトはW3Cが規定しているDOMの標準にあるので、 最近のブラウザはたいていサポートしています。通常はこの方法を使うべきです。