• ベストアンサー

if(document.all && navigator.appVersion.indexOf('Mac')!=-1)returnの意味

よろしくお願いします。 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が出てくるのでしょうか? どなたか分かる方いらっしゃいましたら、ご教授宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

「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/

その他の回答 (1)

  • tabide
  • ベストアンサー率44% (148/331)
回答No.2

一応コードの意図としては、「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さんの通りです。

miraikako
質問者

お礼

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

関連するQ&A

  • WinとMacのFirefox以外は違うindexに飛ばすスクリプトについて

    Javascript初心者です。 iframeを使用したHP作成後、ブラウザCheckしたところ(細かいバージョン指定まではしていません) Windows版のブラウザはほぼ全般○ですが、MacはFirefox以外×でした。 なのでindex.htmlに下記判別をさせたいのです。↓ 「OSがwinの場合とOSがMacでブラウザがFirefox(Gecko)の場合はそのまま、 それ以外はindex2.htmlに飛ばす。」 スクリプトを自分なりに書いてみたのですが、これであっているのかが、自信がありません。 どなたか上記方法をご存知の方、または下記スクリプトの間違いがわかる方。 お願いします、教えてください。 if(navigator.appVersion.indexOf("win") != -1){ document.write(); else if(navigator.appVersion.indexOf("Mac") != -1){ if{(navigator.userAgent.indexOf('Gecko/')!=-1) document.write(); } else{ location.replace("index2.html"); } }

  • 動画上での右クリック禁止について

    右クリックを禁止するJavaScriptを外部ファイルに 書いて、動画のプロパティなどが見づらいように したいと思っているのですが、うまくいきません。 oncontextmenuを無効にする形で、 HTMLや画像の上では、右クリックを無効にできたのですが、埋め込んだWindowsMediaplayerの動画の上で 右クリックをすると、普通にcontextmenuが出てきて しまいます。 どのようにしたら、動画ファイル上での右クリックを禁止にすることができるでしょうか? どなたか教えてください。よろしくお願いします。 外部JSファイルに書いた内容は、下記のとおりです。 function DisableOnContextMenu(ev) { return false; } function DisableContextMenu(ev) { if (ev) { if (ev.button && ev.button == 2) { // W3C DOM2 return false; } else if (!ev.button && ev.which == 3) { // N4 return false; } else if (navigator.platform.indexOf("Mac")!=-1 && navigator.appName == "Netscape") { return false; } } else { if (event && event.button && event.button == 2) { // IE return false; } } } if (navigator.appName == "Netscape" && !(navigator.platform.indexOf("Mac")!=-1)) { document.captureEvents(Event.MOUSEDOWN); } document.onmousedown=DisableContextMenu; document.oncontextmenu=DisableOnContextMenu;

  • document.write が作動してくれません!

    /* ブラウザが 「IE Version 5 以上」 または 「Netscape Navigator Version 4 以上」 のときに文字列を出力するつもりで、以下のscriptを書きましたが、IE Version 6 のパソコンで文字列が出力されません。 (エラーにはなりません。インターネット・セキュリティは既定レベルの「中」です。) 何が間違いなのかお教えくださいませ。 <script type="text/javascript"> <!-- if ( ( (navigator.appName.indexOf("Microsoft") >=0)&&(navigator.appVersion.charAt(0) >4) ) || ( (navigator.appName.indexOf("Netscape") >=0)&&(navigator.appVersion.charAt(0) >3) ) ) { document.open(); document.write("「パソコン申し込み」 では、入力していただいた貴下の個人情報を送信する際に、情報の暗号化をおこないます。"); document.close(); } //--> </script> */

  • JavaSciptを外部ファイルとして複数htmlファイルで利用したい

    JavaScriptでos、ブラウザ毎にフォントを一定化するスタイルシートをつくりました。このJavaSciptを外部ファイルにして複数のページから読み込ませるようにしたいのですが、XXX.jsファイルを読み込ませるための方法が分かりません。jsファイルの外部リンクの方法、またそれをhtmlページ内で適応させるためのタグも教えてください。 ちなみに今までは全ページに <script language="JavaScript"> <!-- mac=(navigator.appVersion.indexOf('Mac')!=-1)?true:false; ie=(navigator.appName.charAt(0)=="M")?true:false; document.write("<STYLE TYPE='text/css'><!--") if(mac){ //FOR MACINTOSH IE NS document.write(".e9{font-size:9px}") document.write(".e10{font-size:10px}") document.write(".e12{font-size:12px}") document.write(".j9{font-size:9px}") document.write(".j10{font-size:10px}") document.write(".j12{font-size:12px}") (中略) //--> </script> を記載し、それぞれ<div class="e12">~</div>で挟んでいました。

  • Macfirefox3とMacfirefox2以下でCSSを切り替えたい

    MacのFirefox3は、Firefox2までとはデフォルトフォントサイズが 違うので、Firefox3とそれ以外のFirefoxで分けたいです。 今まで、CSSを以下のスクリプトでブラウザ別に分岐していました。 MacのFirefox3の分岐を増やしてみたのですが、それ以外のFirefoxのCSSに 分岐されてしまいます。 あまりJavascriptに明るくないので、 どうしてわかれてくれないものか困っています。 どうぞお知恵をお貸し下さい! ↓以下、かいてみたソースです。 var Win=(navigator.userAgent.indexOf("Win")!=-1); var Mac=(navigator.userAgent.indexOf("Mac")!=-1); var Explorer=(navigator.appName.indexOf("Explorer")!=-1); var Firefox=(navigator.userAgent.indexOf("Firefox") !=-1); var Netscape=(navigator.appName.indexOf("Netscape")!=-1); var opera=(navigator.userAgent.indexOf("Opera")!=-1); var safari=(navigator.userAgent.indexOf("Safari")!=-1); var Version=navigator.appVersion.charAt(0); if(safari){ document.write('<LINK rel="stylesheet" href="/css/mac_safari.css" type="text/css">'); } else if(Win && Explorer && Version=="6"){ document.write('<LINK rel="stylesheet" href="/css/win_ie.css" type="text/css">'); } else if(Win && Firefox){ document.write('<LINK rel="stylesheet" href="/css/win_ie.css" type="text/css">'); } else if(Win && opera){ document.write('<LINK rel="stylesheet" href="/css/win_ie.css" type="text/css">'); } /*増やしたところ*/ else if(Mac && Firefox && Version=="3"){ document.write('<LINK rel="stylesheet" href="/css/mac_safari.css" type="text/css">'); }/*増やしたところ終わり*/ else if(Mac && Firefox){ document.write('<LINK rel="stylesheet" href="/css/mac.css" type="text/css">'); } else if(Mac && opera){ document.write('<LINK rel="stylesheet" href="/css/mac_safari.css" type="text/css">'); } else if(Win && Netscape && Version=="4"){ document.write('<LINK rel="stylesheet" href="/css/win_nn.css" type="text/css">'); } else if(Mac && Explorer && Version=="5"){ document.write('<LINK rel="stylesheet" href="/css/mac_safari.css" type="text/css">'); } else if(Mac && Netscape && Version=="7"){ document.write('<LINK rel="stylesheet" href="/css/mac.css" type="text/css">'); } else if(Mac && Netscape && Version=="4"){ document.write('<LINK rel="stylesheet" href="/css/mac.css" type="text/css">'); } else{ document.write('<LINK rel="stylesheet" href="/css/font.css" type="text/css">'); }

  • ブラウザ判別スクリプト

    ブラウザ別にcssを読み込みたいのですが、 firefox2.0に反映されません。 どうしてでしょうか? <!--ブラウザ判別 function getOSType() { var uAgent = navigator.userAgent.toUpperCase(); if (uAgent.indexOf("MAC") >= 0) return "MacOS"; if (uAgent.indexOf("WIN") >= 0) return "Windows"; if (uAgent.indexOf("X11") >= 0) return "UNIX"; return ""; } // Netscape Navigator -> Netscape // Internet Explorer -> Explorer // Safari -> Safari // Opera -> Opera function getBrowserName() { var aName = navigator.appName.toUpperCase(); var uName = navigator.userAgent.toUpperCase(); if (uName.indexOf("SAFARI") >= 0) return "Safari"; if (aName.indexOf("MICROSOFT") >= 0) return "Explorer"; if (uName.indexOf("FIREFOX") >= 0) return "Firefox"; return ""; } function getBrowserVersion() { var browser = getBrowserName(); var version = 0; var s = 0; var e = 0; var appVer = navigator.appVersion; var uName = navigator.userAgent.toUpperCase(); if (browser == "Safari") { version = eval(appVer.substring(0,3)) - 4; } if (browser == "Explorer") { appVer = navigator.userAgent; s = appVer.indexOf("MSIE ",0) + 5; e = appVer.indexOf(";",s); version = eval(appVer.substring(s,e)); } if (browser == "Firefox") { s = uName.indexOf("FIREFOX/",0); version = parseFloat(uName.substring(s+8,s+8+3)); } return version; } //--> <!--top.js os = getOSType(); browser = getBrowserName(); version = getBrowserVersion(); if (os == "MacOS") dirName = "css/mac/"; if (os == "Windows") dirName = "css/win/"; if (os == "UNIX") dirName = "css/unix/"; if (browser == "Explorer") dirName += "ie"; if (browser == "Safari") dirName += "saf"; if (browser == "Firefox") dirName += "ff"; if ((version >= 1) && (version < 2)) dirName += "top.css"; if ((version >= 2) && (version < 3)) dirName += "top.css"; if ((version >= 3) && (version < 4)) dirName += "top.css"; if ((version >= 4) && (version < 5)) dirName += "top.css"; if ((version >= 5) && (version < 5.5)) dirName += "top.css"; if ((version >= 5.5) && (version < 6)) dirName += "top.css"; if ((version >= 6) && (version < 7)) dirName += "top.css"; if ((version >= 7) && (version < 8)) dirName += "top.css"; document.write("<link rel='stylesheet' href='"+dirName+"' type='text/css'>"); //-->

  • 目的地の座標がうまく取得されません

    お世話になります。 前の投稿後、なんとかプログラムを組んでみました。 しかし、ターゲットとなる <A id=abc name=abc>abc</a> が<table>タグの中にあると、うまく座標が取得されません。 <table>タグの外にあればうまく行きます。 解決策はあるのでしょうか? WindowsのIE6で動く様にしたいと思っております。 よろしくお願い致します。 ――――――――――――――――――――――――――――――――― <script> nowTop=0; function toScroll(AnchorID){ objAgent = navigator.userAgent.toUpperCase(); bro=(objAgent.indexOf("WIN") >= 0) ? true : false ; bro=(objAgent.indexOf("IE")>=0 && objAgent.indexOf("OPERA")<0) ? true : false ; if(bro){ nowTop=document.body.scrollTop; if(AnchorID){ pageScroll(document.all(AnchorID).offsetTop); }else{ pageScroll(0); } } } pageScrollTimer=""; beforTop=0; function pageScroll(DestinationTop){ nowTop+=Math.floor((DestinationTop-document.body.scrollTop)/10); window.scrollTo(0,nowTop); if((DestinationTop==document.body.scrollTop) || (beforTop==document.body.scrollTop)) { clearTimeout(pageScrollTimer); }else{ beforTop=document.body.scrollTop; pageScrollTimer = setTimeout("pageScroll("+DestinationTop+")",20); } } </script> <A onclick="toScroll('abc');return false;" href="#abc">abcへ</A> <table><tr><td> <A id=abc name=abc>abc</a> </table> ―――――――――――――――――――――――――――――――――

  • JavaScriptを外部ファイルにするとロールオーバーが機能しない

    ホームページビルダー11を使っているのですが、 JavaScriptを外部ファイルにして読み込ませると、ロールオーバー部分の画像のみ切り替わりません。 ////////////////////////////////////////////////// ■外部ファイルの記述内容■ <SCRIPT language="JavaScript"> <!--HPB_SCRIPT_ROV_50 function HpbImgPreload() { var appVer=parseInt(navigator.appVersion); var isNC=false,isN6=false,isIE=false; if (document.all && appVer >= 4) isIE=true; else if (document.getElementById && appVer > 4) isN6=true; else if (document.layers && appVer >= 4) isNC=true; if (isNC||isN6||isIE) { if (document.images) { var imgName = HpbImgPreload.arguments[0]; var cnt; swImg[imgName] = new Array; for (cnt = 1; cnt < HpbImgPreload.arguments.length; cnt++) { swImg[imgName][HpbImgPreload.arguments[cnt]] = new Image(); swImg[imgName][HpbImgPreload.arguments[cnt]].src = HpbImgPreload.arguments[cnt]; } } } } function HpbImgFind(doc, imgName) { for (var i=0; i < doc.layers.length; i++) { var img = doc.layers[i].document.images[imgName]; if (!img) img = HpbImgFind(doc.layers[i], imgName); if (img) return img; } return null; } function HpbImgSwap(imgName, imgSrc) { var appVer=parseInt(navigator.appVersion); var isNC=false,isN6=false,isIE=false; if (document.all && appVer >= 4) isIE=true; else if (document.getElementById && appVer > 4) isN6=true; else if (document.layers && appVer >= 4) isNC=true; if (isNC||isN6||isIE) { if (document.images) { var img = document.images[imgName]; if (!img) img = HpbImgFind(document, imgName); if (img) img.src = imgSrc; } } } HpbImgPreload('_HPB_ROLLOVER1', 'images/request.gif', 'images/request2.gif'); //--> </SCRIPT> ////////////////////////////////////////////////////// 外部ファイル読み込み時のhtmlタグ <SCRIPT type="text/javascript" scr="images/ファイル名"></SCRIPT> 恐らく、ホームページビルダーの独自性の問題だと思うのですが、 どうすればロールオーバーを機能させることができるでしょうか? 宜しくお願いいたします。

  • JavaScriptの記述が長い

    ホームページビルダー11でJavaScriptものの記述がとても長くなっています。HPBが、ホームページビルダーの略だとは思われますが、 この中で削除しても影響のない記述はありますでしょうか? 多少でもサイトの読み込み速度を早くしたいと考えています。 宜しくお願いいたします。 /////////////////////////////////////////////////////////// <SCRIPT language="JavaScript"> <!--HPB_SCRIPT_ROV_50 function HpbImgPreload() { var appVer=parseInt(navigator.appVersion); var isNC=false,isN6=false,isIE=false; if (document.all && appVer >= 4) isIE=true; else if (document.getElementById && appVer > 4) isN6=true; else if (document.layers && appVer >= 4) isNC=true; if (isNC||isN6||isIE) { if (document.images) { var imgName = HpbImgPreload.arguments[0]; var cnt; swImg[imgName] = new Array; for (cnt = 1; cnt < HpbImgPreload.arguments.length; cnt++) { swImg[imgName][HpbImgPreload.arguments[cnt]] = new Image(); swImg[imgName][HpbImgPreload.arguments[cnt]].src = HpbImgPreload.arguments[cnt]; } } } } function HpbImgFind(doc, imgName) { for (var i=0; i < doc.layers.length; i++) { var img = doc.layers[i].document.images[imgName]; if (!img) img = HpbImgFind(doc.layers[i], imgName); if (img) return img; } return null; } function HpbImgSwap(imgName, imgSrc) { var appVer=parseInt(navigator.appVersion); var isNC=false,isN6=false,isIE=false; if (document.all && appVer >= 4) isIE=true; else if (document.getElementById && appVer > 4) isN6=true; else if (document.layers && appVer >= 4) isNC=true; if (isNC||isN6||isIE) { if (document.images) { var img = document.images[imgName]; if (!img) img = HpbImgFind(document, imgName); if (img) img.src = imgSrc; } } } var swImg; swImg=new Array; ここにはロールオーバー類記載 HpbImgPreload('_HPB_ROLLOVER2', 'banner/618-115.jpg', 'banner/618-115.jpg'); //--> </SCRIPT>

  • リンクにふれると文字表示!(クロスブラウザで)

    リンクにふれると文字表示をさせたいのですが、NNでは 指定した色(黄色)と位置(中心)に表示できないので困っています。 タグは以下の通りです。 <HTML> <HEAD><META HTTP-EQUIV="Content-Type"CONTENT="text/html;CHARSET=x-sjis"> <style type="text/css"><!-- body,tr,td {font-weight:bold; color:yellow}---></style> <TITLE></TITLE> <SCRIPT Language="JavaScript"> <!-- isIE4 = (navigator.appVersion.charAt(0)>=4 && (navigator.appVersion).indexOf("MSIE") != -1) isNN4 = (navigator.appVersion.charAt(0)>=4 && (navigator.appName).indexOf("Netscape")!=-1); function link_info(m) { if(m==null) m = ""; if(isIE4) { el = document.all("LINKMSG1"); el.innerHTML = m; } else if(isNN4) { lay = document.layers["PARENT_LINKMSG"].document.layers["LINKMSG1"]; lay.document.open(); lay.document.write("<font style='font-size:12pt'>"+m+"</font>"); lay.document.close(); } } //--> </SCRIPT> </HEAD> <BODY bgcolor="red" BORDER="0" topmargin="7" link="white" alink="yellow" vlink="yellow"> <center> <ilayer name="PARENT_LINKMSG" width="100%" height="16"> <layer name="LINKMSG1"></layer> <span id="LINKMSG1"></span> </ilayer> </center> <br> <center><font style="font-size: 10pt"> <a href="top.html" target="main" onMouseover="link_info('■■TOP■■')" onMouseout="link_info()">  TOP</a> | <a href="rink.html" target="main" onMouseover="link_info('■■リンク集です。■■')" onMouseout="link_info()">  リンク集</a> </font> </center> </BODY> </HTML>

専門家に質問してみよう