Web標準普及プロジェクト

ホームページビルダーのイメージ切り替え処理を修正する

IBMのホームページビルダーはイメージをダイナミックに切り替える処理を行うJavaScriptコードを出力してくれますが、 そのコードはNetscape Communicator 4.xとInternet Explorer 4以上にしか対応していません。

function HpbImgPreload()
{
  var appVer=parseInt(navigator.appVersion);
  var isNC=(document.layers && (appVer >= 4));
  var isIE=(document.all    && (appVer >= 4));
  if (isNC || isIE)
  {
    if (document.images)
    {
      var imgName = HpbImgPreload.arguments[0];
      var cnt;
      swImg[imgName] = new Array;
      for (cnt = 1; cnt < HpbImgPreload.arguments.length; cnt++)
      {
        swImg[imgName][HpbImgPreload.arguments[cnt]] = new Image();
        swImg[imgName][HpbImgPreload.arguments[cnt]].src = HpbImgPreload.arguments[cnt];
      }
    }
  }
}
function HpbImgSwap(imgName, imgSrc)
{
  var appVer=parseInt(navigator.appVersion);
  var isNC=(document.layers && (appVer >= 4));
  var isIE=(document.all    && (appVer >= 4));
  if (isNC || isIE)
  {
    if (document.images)
    {
      var img = document.images[imgName];
      if (!img) img = HpbImgFind(document, imgName);
      if (img) img.src = imgSrc;
    }
  }
}

function HpbImgFind(doc, imgName)
{
  for (var i=0; i < doc.layers.length; i++)
  {
    var img = doc.layers[i].document.images[imgName];
    if (!img) img = HpbImgFind(doc.layers[i], imgName);
    if (img) return img;
  }
  return null;
}

問題の箇所と修正方法

上記のソースで問題があるのはブラウザの判定部分です。

  var isNC=(document.layers && (appVer >= 4));
  var isIE=(document.all    && (appVer >= 4));
  if (isNC || isIE)

documentオブジェクトにlayersが存在したらNetscape Communicator 4.x、document.allが存在したらInternet Explorerと判定しています。しかしMozillaはWeb標準にはないこれらのプロパティをサポートしていませんので、この条件文のどちらにも引っかかりません。

しかし条件文の後にある実際の処理を行うコードはMozillaでも有効ですので、条件文を追加すればMozillaでも動くようになります。

var isNC=(document.layers && (appVer >= 4));
var isIE=(document.all    && (appVer >= 4));
var isDOM1 = (document.getElementById);
if (isNC || isIE || isDOM1)

追加された条件文はMozillaにかぎらずDOM1の仕様に準拠した全てのブラウザに対して有効です。

動作例

マウスポインタを下のイメージに重ねてください

このホームページビルダーが出力するコードはブラウザ判別とオブジェクト検出で説明したオブジェクト検出の方法を使えばもっと単純化できますが、さしあたっては最小限度の修正方法だけ提示しておきます。