Re: [報告 2/2]フレーム非対応のブラウザと擬似フレーム動作
すぎたです。
In message news:20040325001829.5300007.1062544894@uranus.interq.or.jp
"笠原 励(氷炎 雷光風)" <cuncuku@uranus.interq.or.jp> wrote ...
> > var b = (document.all && (document.compatMode == undefined || document.compatMode == "BackCompat"))
> > ? document.body : document.documentElement;
> >
> > の方が良いかもしれません。(IEなら、document.body.scrollTop でも十分かも)
> 互換モードを条件に入れての判定のように思うのですが、
条件としては、IE であり、かつ、互換モードの場合、document.body、
そうでない場合は document.documentElement を b に代入しています。
? : は条件演算子、または三項演算子と呼ばれるもので、
v = e ? x : y;
は
if (e)
v = x;
else
v = y;
とほぼ同等です。ほぼというのは、
v = if (e) x else y;
という記述は出来ない(はず。試してないです(^^;;)という意味です。
if 文で細かく分解して書くと、
if (document.all) { // IE
if (document.compatMode == undefined) { // IE4.x, IE5.x
b = document.body;
} else if (document.compatMode == "BackCompat") { // IE6 互換モード
b = document.body;
} else { // IE6 標準モード
b = document.documentElement;
}
} else { // { NN7, Opera7 }等の、IE 以外の「標準モード」
// IE 以外の「互換モード」は考慮せず
b = document.documentElement;
}
となり、同じ値について条件をまとめると、IE については、
compatMode が undefined または(OR、JavaScriptでは||)
"BackCompat" ならば body ですので、これらの条件を A とおくと、
IE であり、かつ(AND、JavaScriptでは&&) A が真であれば body
IE であり、かつ A が偽であれば documentElement
IE でなければ、documentElement
となって、body の条件が IE であり、かつ A が真のときで、
それ以外は documentElement となるので、
全てを繋げて、
if (IE && A)
b = body;
else
b = documentElement
となり、展開すると
var b;
if (document.all && ((document.compatMode == undefined) || (document.compatMode == "BackCompat")))
b = document.body;
else
b = documentElement;
となります。
var b に直接代入するため 式1(条件) ? 式2 : 式3 を用いていますが、
わかりやすいと思う記述を選択すれば良いかと思います。
(三項演算子は、結果を演算式(代入含む)に利用する場合に用います)
> で、こうすることによるメリットというのは、どういうことでしょうか?
条件の意味ということであれば、IE5.5sp2 で(たぶん IE5 でも)動作します。
三項演算子のメリットというのは、あまり無いです。
(あえて言えば、var b を分離せずに記述している点)
で、IE の場合、標準か互換かの区別なく、document.body.scrollTop
を参照すれば値は取得できるので、
document.body.scrollTop が定義されていればそちらを、そうでなければ
document.documentElement を用いるように、
var b = (document.body.scrollTop == undefined ? document.documentElement : document.body);
でも良いかもしれません。
ただ、標準モードであることを意識する意味を込めるのであれば、
document.documentElement を参照するのも手かなということで、
先の条件にした次第です。
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
これだと、互換モードなので、IE 以外では不都合がある場合があると
思います。ただし、これも確認はしていません。
互換モードを利用するのであれば、それを意識したプログラムの方が
良いと思います。
> 「今回のケースではあまり意味を持ちません」というのは、
> どういう意味でしょう?今1つピンと来ません。
今回例示された2つのページについては、ウィンドウの高さ 100%
の中で div にスクロールバーを持たせているので、どちらの場合も
body 自体はスクロールしませんよね。
なので、scrollTop は変化せず、スクリプト自体は動いていても、
実際に left 部の移動は発生しないないので、スクリプトを
動かさなくても同じという意味です。
スタイルシートに未対応(対応の仕方が異なるとか)でスクリプト
には対応している場合は意味があると思いますが、結構ややこしい
話になるので、スクリプトは更に複雑になると思います。
(NN4.xに対応しようと思うと…私なら諦めるかも)
--
杉田
sugi-nws@bk.iij4u.or.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735