吉見です。自己フォロー。

Takashi YOSHIMIさんの<bje8ee$hdq$1@nwall2.odn.ne.jp>から
>T. Sugitaさんの<27f2aa3c03e499ebb65db6fdd617ac56@local.news00.iij4u.or.jp>から
>>イベントの一つ上(親)が必ずしもTRでないことから、row が tr 以外
>>のとき、おかしくなっていると思われますので、イベントターゲット
>>から遡って、TR を見つけるのが良さそうです。
>
>これでうまくいきました。イベントハンドラは TR タグの中に書いてあって
>も、その中に TD があれば イベントのノードはTD アンカーがあればアンカー
>の(要はイベントを起こした最下層の)ノードが帰るということで、TRに対し
>て何かの処理をしようと思ったら、イベントで呼ばれた関数内でさかのぼる必
>要があるわけですね。

あとで気づいたのですが、一般的にはこれでは不十分ですね。
というのは、テーブルの中にテーブルがある場合があるわけです。

<table>
  <tr onMouseOver="flipbg();">  // 上位の TR:色を変えたい部分
     <td>
        <table>
           <tr>                   // 下位の TR
        <td>
                 Ant              // イベントのノード
              </td>
           </tr>
        </table>
     </td>
  </tr>
</table>

のような表だと、下位の TR でループが停止しています。

<table>
  <tr id="target" onMouseOver="flipbg("target");">  // 対象
     <td>
        <table>
           <tr>                   // 下位の TR
        <td>
                 Ant              // イベントのノード
              </td>
           </tr>
        </table>
     </td>
  </tr>
</table>

のように id をつけて、関数内でさかのぼるときに id をチェックしながら
さかのぼれば、完璧です。

つまり、
function flipbg()
{
...
      while(row.nodeName != "TR") {
        if(!(row = row.parentElement))
          return;
      }
...
}
を
function flipbg(id0)
{
...
      while(row.id != id0) {
        if(!(row = row.parentElement))
          return;
      }
...
}
とする具合。 

ただ、すごくスマートでないのは、
<tr id="target" onMouseOver="flipbg('target');">
の中でタグ内に同じ文字列を書かなければならないこと。イベントがこのタグ
自身の情報を渡してくれないことに起因しているわけですが、なんとかならな
いものでしょうかねえ。

-- 
Takashi YOSHIMI mailto:tak-yoshimi@rio.odn.ne.jp