WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:JavaScriptでのブラウザ判別

0:[投稿] joo [2002/02/27 14:44 ][環境:MAC+IE わからない]

いろいろ調べたのですが、どうもうまいソースが
見つからないので、相談させてください。ほぼ初心者です・・

index.htmlにアクセスした時に、IEと、NN4.x、N6.Xで開く
ファイルを分けたいのですが、どうもうまくいきません。
下のソースをベースにやっているのですが、
どう変えたら3つ(4つか)に分けることができるでしょうか。

・以下index.htmlのbody部分

<body>
<script language="JavaScript">
<!--
if ( navigator.appName.charAt(0)=="M" ) {
location.href="エクスプローラ用の.html";
}
if ( navigator.appName.charAt(0)=="N" ) {
location.href="ネスケ用の.html";
}
else{
location.href="その他ブラウザ用の.html";
}
//-->
</script>
</body>

上記を、ネスケ4以降と、6以降に分けるものにしたいのですが・・・
IEは一つでいいのですが。
このソース自体がとんちんかんなのかもしれませんが、
IEとNN4.XとN6とその他ブラウザに分ける方法を
教えてください。


1:[回答] ばあど [MAIL] [URL] [2002/02/27 15:28 ]

他にNで始まるブラウザがあったら誤作動を起こす可能性がありますけど、
NN4はdocument.layers、
N6はdocument.getElementById
とか。
#MozillaとかMosaicとか大丈夫なんだろうか…


2:[回答] joo [2002/02/27 15:44 ]

回答ありがとうございます。
誤作動の可能性は"N"や"M" の部分を正式名称にしたら
解決するのでしょうか?

>NN4はdocument.layers、
N6はdocument.getElementById
とか。
・・・すみません、上はどこの箇所に入れると作動しますか?
わからなくて申し訳ないです。

この振り分けをしたい理由は、トップページのサイズを固定
したい為です。デザイン的にどうしても必要があって・・
表示サイズの誤差の補正は他にも方法があるみたいですが、
あまりによくわからなかったので、まずブラウザで振り分けて
そのブラウザ用に指定したサイズのページを開くようにしようと
思っているのですが・・意味分からなかったらすみません・・


3:[回答] ヨシミ [2002/02/27 15:55 ]

navigator.appName.charAt(0)=="M"
というのは頭文字が M を示すものだから MSIE だけでなく、Mozilla とか Mosaic も含んでしまう。

navigator.appName.charAt(0)=="N"
も同じ。 Necko とかも含んでしまう。

一方、document.layers や document.getElementById というのは、N4 や N6 それぞれしか持たない(と思われる)固有のプロパティであり、それを解するものか否かで判別する。

if(document.getElementById) {location.href="n6.html"; }
みたいな記述で構わない。

以上、僭越ながら ばあどさん の代弁をしてみました。代弁が期待通りでなかったらすいません。


4:[完了] joo [2002/02/27 16:00 ]

ヨシミさん、ありがとうございました。
それとばあどさんもありがとうございました。
理解できました。

やってみます。本当にありがとうございました。


5:[質問] joo [2002/02/27 16:28 ]

完了にしたのに再度すみません。
やってみました。
ソースは以下です。

<body>
<script language="JavaScript">
<!--
if ( navigator.appName=="Microsoft Internet Explorer" ) {
location.href="top_ie.html";
}
if ( document.layers ) {
location.href="top_n4.html";
}
if ( document.getElementByld ) {
location.href="top_n6.html";
}
else{
location.href="other.html";
}

//-->
</script>
</body>

で、N4とN6で開くと両方とも"other.html"にいってしまいました。
何度もすみませんが、どなたか間違いを指摘して頂きたいです。
どうぞよろしくお願いします・・・


6:[関連] ween [2002/02/27 16:51 ]

N4 で other.html に行ってしまうのは
 location.href="top_n4.html";
が評価されて top_n4.html を取りに行っている間に次の if 文が処理されて
 location.href="other.html";
が評価されてしまうからです。
 if(){ } else if(){ } else if(){ } else{ }
のようにした方がいいです。

N6 で other に行ってしまうのはスペルミス。
getElementById の末尾から2文字目の "I" は
紛らわしいですが L の小文字の l じゃなくて i の大文字の I です。

# document.getElementById は DOM1 で規定されたプロパティで
# N6/Mozilla だけでなく IE5 以降も Opera もサポートしています。


7:[回答] joo [2002/02/27 17:15 ]

weenさん、ありがとうございます!!
できました!
スペルミス...教えてくれた方々、申し訳ないです。

># document.getElementById は DOM1 で規定されたプロパティで
># N6/Mozilla だけでなく IE5 以降も Opera もサポートしています。

のところですが、IE5 以降や Operaでは"top_n6.html"に
いってしまうということでしょうか?
またしても質問でごめんなさい、教えてください。


8:[質問] joo [2002/02/27 17:21 ]

あやまってばかりでごめんなさい。
回答にしてしまいました。質問です。


9:[回答] ween [2002/02/27 17:40 ]

> IE5 以降や Operaでは"top_n6.html"に
> いってしまうということでしょうか?

少なくとも Win2K+IE6, Win2K+Opera6 ではそうなりました。

location.href を書き換えた時の挙動には厳密な規定がないので
どんな場合でも必ずそうなるとはいえません。


10:[回答] ばあど [MAIL] [URL] [2002/02/27 20:11 ]

IE,NN4,N6,Opera以外無視するなら、以下みたいのでいいんじゃないかな。
if ( navigator.appName=="Microsoft Internet Explorer" ) {
location.href="top_ie.html";
}else if (navigator.appName.charAt(0)=="N"){
 if( document.layers ) {
 location.href="top_n4.html";
 }else if( document.getElementByld ) {
 location.href="top_n6.html";
 }else{
 location.href="other.html";
 }
}else if(navigator.appName.charAt(0)=="O"){
location.href="top_opera.htm";
}else{
location.href="other.html";
}

>ヨシミ様
フォローありがとうございます。
足らない場所があったら、いくらでも遠慮なく足してください。


11:[関連] ma-to [2002/02/28 04:43 ]


document.getElementByIdというが、果たしてそのスクリプトでHTML***Elementのインスタンスが扱われるのであろうか。はたまたdocument.layersというのも同じ。これらは質問者が分岐の目的を明示することで回答者側も必要かどうか判断できる。

もしもクライアント側のスクリプトとは無関係に環境変数別にページを分けたいのであれば出す側で処理すべきで、クライアント側で遊ぶものではない。
環境変数に任せられないというのであればクライアント側のそれから引張って来ること自体ありえない。

そもそもブラウザでの分岐というのは今とは比較にならないほど牧歌的な頃 ( といっても3、4年前くらいまでかな ) にJavaScriptを知っているブラウザ殆ど全てを把握できたという状況で使われた極めて間接的な手段に過ぎないと考えられる。

もしどうしてもブラウザでの分岐が必要である場合があるとすれば、例えばn6の類でnavigator.productSubで分けざるをえないなどのいささかマニアックな話になってくるから現実的ではない、と思うんだがいかがなものか。

今の時代にブラウザで分岐というかなり間接的な発想についていこうとしてここでのような質問が生じたのだとすれば、間接的ということによる分かり難さが積み重なってしまって単純なif文での制御にさえ思考停止してしまっているという側面があるのかもしれないと想像されなくもない。
例えばDateを使いたいが、これは大丈夫か? と心配になったとする ( そんな場合はありえないが )。
if(window.Date)var date=new Date();
などとするんじゃないの、直感的に。一々現在ある大量のJavaScript対応ブラウザの実装状況を調べるのはナンセンス、そろそろ実質不可能になってきているでしょ。


ところで。

> # document.getElementById は DOM1 で規定されたプロパティで
> # N6/Mozilla だけでなく IE5 以降も Opera もサポートしています。

もちろんこれは平易になるような切り口で書いているんだろう。むしろ一般 ( 曖昧で高慢な言い方 ) にはそう信じられているということも鑑みて。
しかしちょっとかたい言い方をすれば、n6の類を除いて、サポートというより独自仕様に勧告通りの述語を当てはめているに過ぎない。まあそういうのも広い意味ではサポートというのかもしれないし、バッチみたいなJScriptでは問題無しなのだろうが。。。これはもしかしたら永久に解決されないだろうから、今後もサポートしていると言い切って勘違いにならないのはn6の類だけだろう。


12:[回答] perl_tyu(perl_syoが1rankUP) [2002/02/28 10:01 ]

var IE = 0;
var NN4 = 0;
var NS6 = 0;

if (parseInt(navigator.appVersion) >= 4) {
 NN4 = (navigator.appName.indexOf("Netscape") != -1) ? true : false;
}
 IE = (navigator.appName.indexOf("Microsoft") != -1) ? true : false;
 NN6 = (navigator.userAgent.match(/Gecko/i)!=null);

こんなのってどうなんでしょ。


13:[質問] joo [2002/02/28 10:35 ]

>10のばあど様
ありがとうございます!理解できました。
お手数おかけしました。感謝。

>11のma-to様
>もしもクライアント側のスクリプトとは無関係に環境変数別に
>ページを分けたいのであれば出す側で処理すべきで、クライアン>ト側で遊ぶものではない。
クライアントの環境を勝手に(しかも私が)想像して
振り分けるよりもそのほうが親切かもしれません・・・考えます。
私はほぼ初心者なので、ちゃんと理解できていないかもしれませんが、
貴重な御意見ありがとうございました。

>perl_tyu様
これはどのように使用するのでしょう?
またしても質問で申し訳ないのですが、よかったら教えてください。


14:[回答] perl_tyu(perl_syoが1rankUP) [2002/02/28 17:07 ]

NS6ってGeckoって書いてあるみたい。
それマッチさせてあるみたい。


15:[完了] joo [2002/03/01 10:25 ]

>perl_tyu様
ううむ、その回答が理解できるように勉強いたします。
答えていただいたのに勉強不足ですみません・・・

答えていただいた皆様、どうもありがとうございました。
とても参考になりました。
感謝です。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World