アプリ版:「スタンプのみでお礼する」機能のリリースについて

よろしくお願いします。
JavaScriptの勉強をしているのですが、参考にしている書籍に以下の構文が出てきまして、それの意味が分からなくて悩んでいます。

//MacIE4,5バグ 回避
if(document.all && navigator.appVersion.indexOf('Mac')!=-1)return

//以降に記してあるとおり、OSがMacintoshだった場合に何らかの処置を行うプログラムなのは分かるのですが・・。
navigator.appVersion.indexOf('Mac')!=-1の部分は、「navigator.appVersion.indexOf('Mac')が1ではなかったら、Macユーザーであるということ、で、falseが返されるのでしょうか?
しかし、そもそもnavigatorオブジェクトはブラウザの種類のことではないのか?と混乱してしまっています。
また、document.allがどのような役割を果たしているのかも分かりません。なぜここでdocument.allが出てくるのでしょうか?

どなたか分かる方いらっしゃいましたら、ご教授宜しくお願いします。

A 回答 (2件)

「document.all」は昔はIEにだけ存在するオブジェクトだったのでIEであるかどうかの判定に使われました。



今ではOperaやNetscape等でもIEへの互換の為に存在するのでIEかどうかの判定に使われる事は減ってきています。
IEであるかどうかの判定ではなく、純粋にdocument.allが在る(使える)かという判定にはもちろん使用されますが。

「navigator.appVersion」は確かにブラウザの種類なんですが、実際にはOS名も含まれていたりすのでOSの判定にも使われたりします。

また、 != -1 というのは indexOf関数の結果が 0~なら文字列が見つかったという意味(真偽ではなく、見つかった位置を返す関数)になるのでこういう比較式を使用しています。
(1でなかったらMacユーザという解釈はちょっと違います。)

参考URL:http://www.openspc2.org/JavaScript/ref/
    • good
    • 0

一応コードの意図としては、「Mac 版 IE であれば、(後の処理を行わず)直ちに関数を抜けよ」なのでしょうけど、今だとこれはまずいですね。

navigator... の部分はいいのですが。

document.all は元々は IE の独自実装だったため、if (document.all) 、つまり「document.all が存在するか」で IE か否かを判定できたのですが、Opera が IE との互換性を取ると称して document.all を実装してしまったため、このコードだと Mac 版 Opera も抜けてしまいます。

なお、Mozilla, Firefox も確かに document.all を実装しましたが、従来のブラウザ判定用途がそのまま通用するように、if (document.all) には――存在するにも関わらず――偽(false)を返すという変則実装となっています。


navigator.appVersion については、#1さんの通りです。
    • good
    • 0
この回答へのお礼

お礼が遅れて申し訳ありません。
ご教授いただいた方ありがとうございました。
とても参考になりました。

お礼日時:2006/12/02 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!