Path: ccsf.homeunix.org!ccsf.homeunix.org!news1.wakwak.com!nf1.xephion.ne.jp!onion.ish.org!news.daionet.gr.jp!news.yamada.gr.jp!newsfeed.media.kyoto-u.ac.jp!np0.iij.ad.jp!news.iij.ad.jp!news00.iij4u.or.jp!not-for-mail From: "T. Sugita" Newsgroups: fj.comp.lang.javascript Subject: =?iso-2022-jp?B?UmU6IBskQiFOSnM5cCEhIzIhPyMyIU8lVSVsITwlYEhzQlAbKEI=?= =?iso-2022-jp?B?GyRCMX4kTiVWJWklJiU2JEg1PDt3JVUlbCE8JWBGMDpuGyhC?= Date: Thu, 25 Mar 2004 23:44:28 +0900 Organization: Internet Initiative Japan Inc., Tokyo, JAPAN Lines: 109 Message-ID: References: <20040323122851.636779.-1504458496@uranus.interq.or.jp> <20040324011030.7461819.-617993800@uranus.interq.or.jp> <20040325001829.5300007.1062544894@uranus.interq.or.jp> NNTP-Posting-Host: h067.p470.iij4u.or.jp Mime-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Trace: news00.iij4u.or.jp 1080225974 356 210.149.214.67 (25 Mar 2004 14:46:14 GMT) X-Complaints-To: news@iij.ad.jp NNTP-Posting-Date: Thu, 25 Mar 2004 14:46:14 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4922.1500 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4925.2800 Xref: ccsf.homeunix.org fj.comp.lang.javascript:165 すぎたです。 In message news:20040325001829.5300007.1062544894@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 を参照するのも手かなということで、 先の条件にした次第です。 > これだと、互換モードなので、IE 以外では不都合がある場合があると 思います。ただし、これも確認はしていません。 互換モードを利用するのであれば、それを意識したプログラムの方が 良いと思います。 > 「今回のケースではあまり意味を持ちません」というのは、 > どういう意味でしょう?今1つピンと来ません。 今回例示された2つのページについては、ウィンドウの高さ 100% の中で div にスクロールバーを持たせているので、どちらの場合も body 自体はスクロールしませんよね。 なので、scrollTop は変化せず、スクリプト自体は動いていても、 実際に left 部の移動は発生しないないので、スクリプトを 動かさなくても同じという意味です。 スタイルシートに未対応(対応の仕方が異なるとか)でスクリプト には対応している場合は意味があると思いますが、結構ややこしい 話になるので、スクリプトは更に複雑になると思います。 (NN4.xに対応しようと思うと…私なら諦めるかも) -- 杉田 sugi-nws@bk.iij4u.or.jp