JavaScript初心者で、ソースは本に載っていたものをそのまま使っているのですが、その本だと、MAC、WIN-IE、WIN-NSの3つの外部スタイルシートを読み込ませるスクリプトしか載っていないので、困っています。
MACでも、IE、NS両方とも振り分けたいんです。
今使っているソースは以下です。
このファイル自体は、フレームセットファイルでフレームを切った中のファイルなのですが、フレームセットファイルにも<script language="JavaScript">以降の記述は必要なのでしょうか?
必要な場合は、どのようにして記述したら良いか教えて下さい。
よろしくお願いします。

<HTML>
<HEAD>
<!--?-->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=EUC-JP">
<TITLE></TITLE>
<script language="JavaScript">
<!--
mac=(navigator.appVersion.indexOf("Mac")!=-1)?true:false;
ie=(navigator.appName.charAt(0) == "M")?true:false;
ns=(navigator.appName.charAt(0) == "N")?true:false;
if (mac) {
fName = "mac.css";
}
else {
if (ie) {
fName = "win_ie.css";
}
else if (ns) {
fName = "win_ns.css";
}
}
if (fName != null) {
document.write("<LINK REL=STYLESHEET HREF='"+fName+"' TYPE='text/css'");
}

//-->
</script>
</HEAD>

このQ&Aに関連する最新のQ&A

A 回答 (2件)

var agt=navigator.userAgent.toLowerCase();


var nav=navigator.appName.charAt(0);
var fName;
if (agt.indexOf("mac")!=-1)
{
// mac
if(nav=="M") fName = "mac_ie.css";
if(nav=="N") fName = "mac_ns.css";
} else
if (agt.indexOf("win")!=-1)
{
// win
if(nav=="M") fName = "win_ie.css";
if(nav=="N") fName = "win_ns.css";
} else
{
// ?? 他のOS
}

if (fName != null) {
document.write("<LINK REL=STYLESHEET HREF='"+fName+"' TYPE='text/css'");
}

この回答への補足

kokucho81さん、ありがとうございます。助かりました。
さっそく試したところ、無事振り分けることができました。

でも、一つ問題があるのです。
このスクリプトを記述したファイル自体をMACのNS4.7で表示させると
ちゃんとスタイルシートは読み込まれるのですが、
フレームセットファイルの一フレームとして読み込むと、
スタイルシートを読み込んだり読み込まなかったりします。
読み込まない場合の方が多いです。
フレームセットファイルには、特別なことは記述していません。

対応策をご存じでしたら是非教えていただけると嬉しいです。
よろしくお願いします。

補足日時:2001/04/24 21:10
    • good
    • 0

フレーム使用時の読みこみのタイミング等については、NS4系はバグっています。


読みこみだけではなく、フレームのピクセル指定などもNS4はバグっていまして、
はっきりいうと、あまりまともに相手にするのは止めた方が良いと言うように思います。

あと、CSSを分けて、それをJSで読みこむと言うよりは、CSS.JSというファイルをひとつ用意して、そのJSの中で、ユーザーエイジェント(ブラウザ+OS)に沿ったCSSを吐いた方が、安定した動作が期待できるように思います。
(このときも、document.writeを連発すると、またまた、NSでバグるので、できるだけ、var s="" s+=~; s+=~; とどんどん文字列を連結して、最後に一度だけ、document.writeするのが常套手段です。とにかくNS4は無茶苦茶なのですぐバグるのです。)

まぁ、全体のアクセスの中で、何%ほどMACのMS4系ユーザーがいそうか、一度お調べになって、1日1人とかであれば、それを相手にするよりはコンテンツを充実させた方が総合的には良いでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございました。
これで諦めがつきました。
MACのNS4系のユーザー対応にやっきになるのはやめようと思います。
もっと勉強してCSSのこと、JavaScriptのことを理解できるようになってから
また悩もうと思います。

お礼日時:2001/04/25 11:42

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

このQ&Aと関連する良く見られている質問

Q

数十の<a>タグがあるHTMLファイルの中で、
<div id="blank">で囲まれた<a>タグ群のみをすべてtarget="_blank"にしたいと考えています。
該当する<a>タグすべてにtarget="_blank"を書くと、HTMLファイルの容量が大きくなるので、CSSのIDとJavaScriptを組み合わせて、実現できないものでしょうか。

Aベストアンサー

<base target="_blank">
<div id="blank">
 <!-- -->
</div>
<base target="_self">

Q

▼次のようにページ内のdivタグのidの名前によって、formタグ内の要素をdisableにすることはJava scriptによって可能でしょうか?

<div id="AA">のとき、別の場所にある<form id="BB">内のselect要素などすべての要素をdisableにする。

また同時に、id="BB"に指定したスタイルシートの記述を書き換えることは可能でしょうか?

何かよい方法をご存知でしたら教えてください。よろしくお願いいたします。

Aベストアンサー

>なぜか時々エラーが出ます。
ウチでちょっと試した程度ではエラーが発生しませんでした。
できましたら、発生したときのメッセージや場所また、ブラウザの種類なども教えてください。

以下は、予防的な意味での注意点についてちょっと書きます。
>return false;

は、必要ないです。
書かない方がいいと思います。
==nullの場合の処理が必要ないなら
!=nullにすればよいです。
もしくは
return false;でなくて
;
のように空文でもよいです。
あと、idに使っている名前と同じ名前を変数名として使わない方が良いです。
つまり、
id="soldout"の時に
var soldout;という風にはしない方が良いです。
同じでなければ、cartFormでもなんでもかまいません。
あと、scriptは、
<!--
(スクリプトの中身)
//-->
のように
<!--
//-->
で囲むようにします。

getElementById
は、ブラウザやのブラウザのバージョンによっては使えないことがあります。
その場合は、使えるかどうかを調べる必要があります。

<script type="text/javascript">
<!--
function stockStatus (num){
var f=document.getElementById("soldout");

if(f!=null){
for (var i =0; i<=f.length -1 ;i++){
f.elements[i].disabled=num;
}
}
}
//-->
</script>

>なぜか時々エラーが出ます。
ウチでちょっと試した程度ではエラーが発生しませんでした。
できましたら、発生したときのメッセージや場所また、ブラウザの種類なども教えてください。

以下は、予防的な意味での注意点についてちょっと書きます。
>return false;

は、必要ないです。
書かない方がいいと思います。
==nullの場合の処理が必要ないなら
!=nullにすればよいです。
もしくは
return false;でなくて
;
のように空文でもよいです。
あと、idに使っている名前と同じ名前を変数名として...続きを読む

Q
勘でいれたら・・・

はじめまして。JavaScript初めてです。
わからないことがあるので、教えてください。

画面を左右にフレームで分割して、左フレームのリストボックスから要素を選択すると、その要素に該当した表が右フレームに表示される、というものを作成しました。
左フレーム:name = index
右フレーム:name = main
こんな感じ(左フレーム)↓
<HTML>
<HEAD>
<SCRIPT language="JavaScript">
<!--
function disp(obj){
右フレームの表のHTML作成をしている

parent.main.document.open();
parent.main.document.write
(desc.innerHtml = 上で作成したHTML);
parent.main.document.close();
}
-->
</SCRIPT>
</HEAD>
<BODY onload="disp(form)">
※<DIV id="desc"></DIV>
<FORM name="form">
<SELECT name="MListBox" onchange="disp(form)">
<xsl: apply-templates select="~"/>
</SELECT>
</FORM>
*<DIV id="desc"></DIV>
</BODY>
</HTML>
  ・
  ・ <xsl文章>
  ・

初めは、※←のところがなく、右と左のフレーム両方に表が出力されてしまっていました。でも※←のところに<DIV id="desc"></DIV>を勘で入れたとたん、右フレームだけに表が出力されるようになりました。(期待の結果)
自分の予想では、*←のところのみで期待の結果が得られる予定で、(disp()でHTMLの出力を右フレームに指定しているから)何故※のところを追加したことで期待通りの動きをしたのかが謎です。

わかりづらい説明で申し訳ないですが、教えてくださる方がいらっしゃいましたら、どうぞお願いします。

はじめまして。JavaScript初めてです。
わからないことがあるので、教えてください。

画面を左右にフレームで分割して、左フレームのリストボックスから要素を選択すると、その要素に該当した表が右フレームに表示される、というものを作成しました。
左フレーム:name = index
右フレーム:name = main
こんな感じ(左フレーム)↓
<HTML>
<HEAD>
<SCRIPT language="JavaScript">
<!--
function disp(obj){
右フレームの表のHTML作成をしている

parent.main.document.open();
parent....続きを読む

Aベストアンサー

質問文にあるソースで目指しているものがいまいち掴み切れていないかも知れないので、見当違いなことを書くかもしれませんが…

<DIV id="desc"></DIV>

を複数記述する事で意図した結果になったということですが、それはおそらく記述エラーが元でそうなっているのだと思います。
id名は、各HTML文書内で固有の名前を与える属性として扱われます。 平たく言えば、一つのHTMLファイル内で、一つの要素に与えたid名はその一回しか使えません。 ですので、特定の要素で既に使われているid名を、それとは別の要素に対して与える事が許されていません。
ご質問文のソースの場合、一つのHTML文書内で同じid名が複数の要素に与えられる事になり、一つの特定の要素を絞り込むことができなくなっています。 おそらくは、JavaScriptが特定のid名を持つ一つの要素を取り出そうとし、同じid名を持つ要素が複数あるために特定の要素を識別するのに失敗したせいで、左のフレームに表示されるはずのスクリプトで生成したHTMLソースが、表示先を見失って表示されなくなっているだけだと思われます。(なぜエラーメッセージが出ないのかについては、IEの動作上の問題と言う事になるのではないでしょうか)
試しに、※の部分の<DIV id="desc"></DIV>を残して、*の部分の<DIV id="desc"></DIV>を消し、動作させてみてください。 それで元のように右フレームにだけ表示させたかったHTMLが左フレームにも表示されるようでしたら、一見期待通りの動きになった原因は、上記のように同じid名を複数の要素に与えたという記述ミスと、それから生じたスクリプトの動作不良と言う事になると思います。

ソース的にスマートに目的の動作を確保するのであれば、<DIV id="desc"></DIV>を複数記述するのではなく、スクリプト内の

parent.main.document.open();
parent.main.document.write(desc.innerHtml = 上で作成したHTML);
parent.main.document.close();

この部分の記述を

parent.main.document.open();
parent.main.document.write(上で作成したHTML);
parent.main.document.close();

に直すのが良いと思います。
フレームmainにだけ、スクリプトで生成したHTMLを表示するということが狙いだったのであれば、それまで意図通りの動作をしなかったのは、parent.main.document.write()の中で、「desc.innerHTML =」という記述をしているために、「上で生成したHTML」を、右フレーム内に書き出すのと同時に、descというidを持つ要素(*の<DIV id="desc"></DIV>)の中のHTMLソースとして再定義していたためと思われます。
スクリプトを上のように修正すれば、HTMLソースの書式違反による動作不良ではなく、スクリプトの正常な動作で、右フレームにだけスクリプトで生成したHTMLソースを表示させるという結果を得られると思います。

参考になれば。 見当違いでしたら、ごめんなさい。

質問文にあるソースで目指しているものがいまいち掴み切れていないかも知れないので、見当違いなことを書くかもしれませんが…

<DIV id="desc"></DIV>

を複数記述する事で意図した結果になったということですが、それはおそらく記述エラーが元でそうなっているのだと思います。
id名は、各HTML文書内で固有の名前を与える属性として扱われます。 平たく言えば、一つのHTMLファイル内で、一つの要素に与えたid名はその一回しか使えません。 ですので、特定の要素で既に使われているid名を、それとは別の要素...続きを読む

Q