Javascriptでブラウザ判別、iframe内の子要素にscrollingの指定をする方法

このQ&Aのポイント
  • Javascript初心者のため、Javascriptでブラウザ判別し、iframe内の子要素にscrollingの指定をする方法を教えてください。
  • 質問者はindex.htmlにiframeを使用し、その子要素にカスタマイズスクロールバー(flexcroll)を適用したいと考えています。
  • 質問者はブラウザ判別のためにJavascriptを使用し、適切なスクリプトを読み込んで適用する方法を知りたいとしています。
回答を見る
  • ベストアンサー

Javascriptでブラウザ判別、iframe内の子要素にscrollingの指定をするには?

Javascript初心者です。いろいろ探したのですが解決方法がわかりません。 index.htmlにiframe(name=""main)があり、それぞれの子要素にtarget="main"で指定しているHPを作成したのですが、子の要素にカスタマイズスクロールバー(flexcroll http://youmos.com/news/flexcroll_js )を取り入れています。 ※ちなみに上記iframeはindex.html内でサイズやリンク先などを指定しているのですが、そこでscrolling="no"にしています(子のflexscrollと重複するので)。 MacIEとSafariではスクロールバーが表示されません。(Winはfirefox、IE6、Opera9、Netscape7.1、Macではfirefoxはflexcroll表示確認済みです。) その不具合の対処にindexのhead内に<script type="text/javascript" src="../js/distinction.js"></script>にブラウザ判別をさせて、 MacIEとSafariには別のjsファイルを適用させ、flexcrollを無効にし、デフォルトのスクロールバーが出るように指定したいのですが、 上記※にあるとおり、index内でiframeのscrollingをnoにしているため、どうしたらいいのかわからなくて困っています。 下記がdistinction.js内のスクリプトです(調べながら作成したので自信がありません)。 // JavaScript Document if(navigator.userAgent.indexOf('Gecko/')!=-1) { document.write('<script language="javascript" src="js/flexcroll.js"></scr'+'ipt>\n'); } else if (document.window.clipboardData) { document.write('<script language="javascript" src="js/flexcroll.js"></scr'+'ipt>\n'); } else { document.write('<script language="javascript" src="js/macIE.js"></scr'+'ipt>\n'); } } else if (window.opera) { document.write('<script language="javascript" src="js/flexcroll.js"></scr'+'ipt>\n'); } else if(navigator.userAgent.indexOf('AppleWebKit')!=-1) { document.write('<script language="javascript" src="js/macsafari.js"></scr'+'ipt>\n'); } else { document.write('<script language="javascript" src="js/other.js"></scr'+'ipt>\n'); } // --> また、flexcroll.jsを適用しないもののjsファイルの中身もなんと記述したらいいのかわかりません。そもそも、この対処法であっているのでしょうか? 間違いや解決方を教えてください。

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

  • ベストアンサー
  • MAN_MA_RUI
  • ベストアンサー率41% (426/1024)
回答No.1

scrolling="no"は元々スクロールさせないための設定ですからスクロールバーが表示されなくても仕方ないです。ただ、scrolling="no"を外せとも言いがたい状況なのでなんとも難しいところですよね。 UA判定は偽装を見抜けませんからそこに注意したほうがいいです。 http://okwave.jp/qa2639629.html MacIEを個別判定したい場合はnavigator.systemLanguageオブジェクトの判定に加えてnavigator.platformの判定を行うと多分いけるんじゃないかな?

matryoshca
質問者

お礼

MAN_MA_RUIさん、アドバイスありがとうございます!! 参考サイト確認させていただきました。 MAN_MA_RUIさんの回答と参考サイトから、確認なんですが・・・。 そちらのスクリプト4行目のところに if(navigator.systemLanguage) { document.write('(IE4以上への対応)') } else if (navigator.platform) { document.write('<script language="javascript" src="js/macIE.js"></scr'+'ipt>\n'); } と足したらいいということでしょうか? 本当に申し訳ありません。素人なもので、それっぽいものを見つけて、解らないことは 調べてはいるんですが・・・。その関わり方などがよく解っていないんです。 よかったら、教えていただけませんか?

matryoshca
質問者

補足

すいません!初めて教えてgooを使って慣れてなくて、 質問だったのに、お礼の方に書いてしまいました。。。

その他の回答 (3)

回答No.4

追記です。 「flexcroll-uncompressed.js」の31行目でブラウザ判別の処理をしているのですが、ここでMacIEと判別するような状態で処理させたところ、 「flexcroll」のJavascript処理が行われずにoverflowのデフォルトのスクロールバーが表示されました。 なので、overflowが正常に動作するのであれば、先ほどの回答で書いた、 ブラウザ判別でMacIE、safariの場合は<script>~</script>を読み込まないようにする。 というのは必要ないかもしれません。 ただ、MacIEでのテストではないので実機で確認してみてください。

matryoshca
質問者

お礼

本当にありがとうございます。 flexcroll-uncompressed.js確認しました。 Javascriptとか全然の初心者で、デザイン上スクロールバーのカスタマイズをしたいと検索し、flexcrollに辿り着きました。 私が使ったファイルはfleXcroll_SampleStyles\variations-howto's\fixedsize-transparentなんですが、 Javascriptリファレンスを見ながら、中身を見てもよく解らなくて、ファイル自体を一日中いじって、 なんとか中身とサイズなどを変更して使えるようになったという状態で、 その中にflexcroll-uncompressed.jsが入っていなかったので、全然目を通していませんでした。 よくわからないのでjsファイル自体、中身を触るのも怖かったんですが、今思うと、 このファイルをちゃんと解読しようと試みていたら、こんなに時間がかからなかったのかな?と思いました。 せっかくの機会なので、このファイルの解読にチャレンジしてみて少しでもJavascriptの理解をはかりたいと思いました。 いろいろ試してくださって、教えてくださって、本当にありがとうございました。

回答No.3

MacIE、safariではoverflowにバグがある云々というのを見たことがあったので、overflow自体がちゃんと動くのかが疑問でした。 Googleで「overflow mac ie」「overflow safari」で検索すると対処方法が見つかりそうです。 flexcroll.jsをはずした状態でこれらの対応をして、overflowによるスクロールバーが表示されるのであれば、overflowは動作すると言えます。 あとは、子ファイルでブラウザ判別を行います。 このときの記述は、 if (MacIE、safariではない場合) { document.write('<script language="javascript" src="js/flexcroll.js"></scr'+'ipt>\n'); } のように、MacIE、safariではない場合だけ<script>~</script>を書き出して、MacIE、safariの場合は何も書き出さないようにします。 また、MacIE、safariの判別については、「flexcroll-uncompressed.js」の31行目にある記述が参考になりそうです。 先ほどの回答で、scrollingをscrollだのscrollbarだのと記述していました。すみません。。

matryoshca
質問者

お礼

再回答本当にありがとうございます。 先に先程のお礼のところで、caitsith_gooさんのこと呼び捨てになってました。 何回か書き直したから、間違えて消しちゃったんだと思います。すいません。 確かに、一番最初の状態(それぞれの子ファイルにflexcroll.jsを読みに行かせてる)では、 SafariとIEはスクロールも、ドラッグして下がることも出来ず、ページを下まで見ることが 出来ない、最悪な状態でした。 これから「flexcroll-uncompressed.js」の31行目にある記述も確認し、さらに改善できないか 調べてみたいと思います。 本当に、ご丁寧にありがとうございました。

回答No.2

いまこの質問を見て興味をもったので、fleXcrollをダウンロードしてみました。 「flexcroll-uncompressed.js」をざっと見ただけなので違う可能性もありますが、 「flexcroll」のJavascript処理は、MacIE、safariには対応していないようです。 matryoshcaさんが作成されたHPは、 ・「index.html」に「iframe」のサイズ指定の枠を作って、その中に子ファイルを表示する。 ・子ファイルは、「index.html」の「iframe」で指定したサイズに納まるボックス(サンプルではid="mycustomscroll"となっている)を作成し、その中に表示するコンテンツを入れていて、このボックスにoverflowのスクロールバーが表示される。 ・そのため、「index.html」の「iframe」内にスクロールバーが表示される。 ということでよろしいですか。 でしたら以下の方法で対応可能と思います。 MacIE、safariでの「overflow」の挙動について確認していないので、回答が分岐します。 ▽overflowが動作する場合。 ・「index.html」内では判別処理をする必要はありません。  (「iframe」の「scrollbar=no」もそのまま。) ・子ファイル内で判別をして、MacIE、safariの場合に「flexcroll.js」を読み込まないようにする。  (document.writeで<script>~</script>を書き出す必要はありません。) ・子ファイルのボックスに、MacIE、safariでも「overflow」が動作するようにCSSを設定する。  (「overflow」のデフォルトのスクロールバーが表示されます) ▽overflowが動作しない場合。 ・子ファイルのボックスに設定したサイズが有効になってしまうのであれば、判別して縦サイズを指定しないCSSの設定を行う。  (document.writeでボックスのidを違うidに書き換えて、そのidに対しては縦サイズ指定をしない。) ・index.htmlでも判別を行い、「iframe」の「scroll=no」を「scroll=yes」に書き換える。 これらの処理を行えば、現状の構成のままで対応できるのではないかと思います。 確認していないこともあり回答としては不十分で申し訳ないのですが、エラー回避の参考になればと思います。

matryoshca
質問者

お礼

ありがとうございました!! caitsith_gooの回答を参考の通りにいろいろ調べてやってみたら、 MacSafari、MacIEでデフォルトのスクロールバーが表示されました。 どうやら難しく考えすぎていたみたいですね。解決してすごく嬉しいです。 思い切って質問してみてよかったです。 本当にご丁寧にありがとうございました!

matryoshca
質問者

補足

caitsith_gooさん、ありがとうございます! overflowの挙動についてですが、HPの構成?はそうなっています。 index.html内にiframeをつくり、中に表示するhtmlが8枚あります。 そのhtmlの中でスクロールが必要なページはcaitsith_gooさんのおっしゃる通りの作りで、 <html style="overflow-x:hidden;"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="description" content="テキストテキスト" /> <title>news</title> <link href="../css/△△.css" rel="stylesheet" type="text/css" /> <link href="../css/flexcrollstyles.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="../js/flexcroll.js"></script> </head> <body> <div id="mycustomscroll" class="flexcroll"> <div class="□□">・・・・・ という風な始まりで、中のコンテンツになってます。 overflowはiframeの中に表示するhtml内で、横スクロールは隠すにしています。 この場合、"overflowが動作する場合"というのに当てはまるということでしょうか? 質問ばかりで申し訳ありませんが、その場合について少しご質問させてください。 >・子ファイル内で判別をして、MacIE、safariの場合に「flexcroll.js」を読み込まないようにする。  (document.writeで<script>~</script>を書き出す必要はありません。) →これは、最初に記載したブラウザ判別のJavascriptは必要ないということでしょうか? >・子ファイルのボックスに、MacIE、safariでも「overflow」が動作するようにCSSを設定する。  (「overflow」のデフォルトのスクロールバーが表示されます) →このCSSの設定についてですが、どのように書いたらいいのかなどが解らないので 調べたいと思うのですが、どのようなワードで検索したらよいか、または参考サイトなどが あれば、教えていただけませんか?

関連するQ&A

  • "<scr"+"iptこれって何?

    とあるページのソースにこんな記述がありました。 document.write("<scr" + "ipt type=\"text/javascript\" src=\"http://xxx.js\" ><\/scr" + "ipt>"); どうして<scriptと一気つづりにせずに、「"<scr" + "ipt」などとやっているのでしょうか?

  • '<SCR' + 'IPT>' なぜ分割?

    JavaScript が使われているページのソースを見ると たまに document.write('<SCR' + 'IPT LANGUAGE="JavaScript… という感じに SCR と IPT をわざわざ結合しているページが見受けられます。 なぜ <SCRIPT … と書かずにこのようなことをするのでしょうか? どのような効果があるのでしょうか?

  • JSによるリンク先の値の取得

    はじめまして。 どうしてもできないため、どなたかご教授お願い致します。 私がやろうとしているのは、広告タグで配信されるFLASHorGIF画像をJSで判定し、もしFLASHまたはGIF画像が配信されていれば何もせず、配信されていなければAページへリンクというものを作成しております。 ただ、JSについては初心者のため(FLASHは多少やっております)先に進めず困っております。。 下記が私なりに作成したソースです。 <script language="JavaScript" type="text/javascript"> <!-- var gazo = document.write('<scr' + 'ipt type="text/javascr' + 'ipt" src="配信先URL"></scr' + 'ipt>'); alert(gazo); if(gazo != "document.write('');"){ alert('広告あり'); }else{ alert('広告なし'); } var objBody = document.getElementsById("welcome_pr").item(0); objBody.appendChild(gazo); //--> </script> 配信先URLは仕事のため、記載していません><申し訳ございません。 alert(gazo);で何かしら値が取得できるかなと思ったのですが undefindとしか出ません。 先が見えない状況で、非常に困っています。 どなたかお教え頂けないでしょうか。 宜しくお願い致します。

  • JavaScript 配列とiframe

    カテゴリを誤って投稿してしまいました。 インラインフレームを二つ(iframe1,iframe2)用意し、jQueryにてクリック出来るようにしたdiv要素のクリックで、それぞれのリンク先をJavaScriptの配列に収めた連番通り、1,2,3,4…htmlと表示させたいのですが、二つの配列を使用すると連番通りに表示されなくなります。(一つの配列使用では連番通りに表示されます。) 1クリックで、iframe1にはiframe1link1.htmlの表示、iframe2にはiframe2link1.htmlの表示。クリックごとにlink2,link3と順番どおりに表示する、これを可能にするお知恵を拝借したいと思い投稿させて頂きます。よろしくお願いいたします。 ================ (JavaScript(1)iframe1.js) var URLs=new Array(); var cnt=0; URLs[1]="iframe1link1.html"; ******* URLs[10]="iframe1link10.html"; function Jump1(){ cnt++; if(cnt==11) {cnt=0;} iframe1.location.href=URLs[cnt]; } ================= (JavaScript(2)iframe2.js) var URLs=new Array(); var cnt=0; URLs[1]="iframe2link1.html"; ******* URLs[10]="iframe2link10.html"; function Jump2(){ cnt++; if(cnt==11) {cnt=0;} iframe2.location.href=URLs[cnt]; } ================ (HTML) <!doctype html> <link rel="stylesheet" href="./css/style.css" type="text/css"> <script src="iframe1.js"></script> <script src="iframe2.js"></script> <title>sample</title> <div id="container" class="div" onclick="Jump1();Jump2()"> <div id="main"> <iframe src="./iframe1link0.html" id="iframe1"></iframe> <iframe src="./iframe2link0.html" id="iframe2"></iframe> </div> </div> これでは連番通りにいかない。 ====================

  • 外部ファイルにした時の引数

    今、外部ファイルとして作っていて、疑問になったことがあります。 HTMLファイルから何か引数(番号など)を渡して、それによって動作を変えられないかというものです。perlみたいに・・・ ↓こんな感じで実現できたら、とても便利なんですが、何か良い方法はないでしょうか? ★HTMLファイルでも呼び方 <script language="JavaScript" src="menu.js?menuno=4"></script> ★Javascriptファイル内での判定 if(document.menuno.value=="4"){ document.write("<a href='next/index.html'></a>"); } else { document.write("<a href='other/index.html'></a>"); }

  • 外部JavaScriptの書き方

    外部JavaScriptの書き方 <script language="JavaScript" src="data.js"></script> 上記data.jsから、他サーバーの外部javascriptを読み出すには 以下のよな書き方で正しいでしょうか? document.open(); document.write('<script language="JavaScript" src="http://hoge.com/data.js"></script>'); document.close();

  • 実行するスクリプトを時間で切替えたいが・・

    以下のようにHTML内に埋め込んで、時間で実行するスクリプトを切替えたいと思っていますが、何故か上手くいきません。 詳しい方がいましたら、ご教授下さいませ。 m(__)m <script language="JavaScript"> <!-- TimeH = (new Date()).getHours(); if (TimeH>=18) { <script language="Text/JavaScript" type="Text/JavaScript" src="./JS/xxx.js" charset="shift-jis"></script> } else if (TimeH<4) { <script language="Text/JavaScript" type="Text/JavaScript" src="./JS/yyy.js" charset="shift-jis"></script> } else { <script language="Text/JavaScript" type="Text/JavaScript" src="./JS/zzz.js" charset="shift-jis"></script> } // --> </script>

  • phpからjsへ

    はじめまして。 jQueryの$.ajax関数のGETを使って phpからjavascriptに echo 'document.write("<script type='text/javascript'>var like_arr=new Array(1,1,1,1,1,1,1,1,1,1,1,1,1)</scr"+"ipt>");' と値を返してarrayを作成しようと思っています。 しかしこの返し方だと ブラウザに表示した時 document.write(" とhtml上に表示されてしまいarrayが作成されません。 しかしjsに直接 document.write("<script type='text/javascript'>var like_arr=new Array(1,1,1,1,1,1,1,1,1,1,1,1,1)</scr"+"ipt>"); と書き込んでみるとarrayが存在しています。 どうしたらphpからの値でdocument.writeをする事が出来ますか? 分かる方いらっしゃいませんか? よろしくお願いします。

    • 締切済み
    • PHP
  • ページは表示されたけれど、エラーが出ます。

    過去の質問を調べたのですが、見つけられなかったので、質問させてください。 自社サイトのページを開くと、ステータスバーに 「ページが表示されましたが、エラーがあります。」と表示されました。 エラーの詳細は下記のとおりです。 ライン:18 文字:51 エラー:')'がありません コード:0 ソースに問題があるのかと思ったのですが、 下記がそのソースです。 <SCRIPT language="javascript" type="text/javascript" src="../js/common_lib.js"></SCRIPT> <SCRIPT type="text/javascript" src="../js/css_junction2.js"></SCRIPT> <SCRIPT language="JavaScript"> <!-- document.write("<img src='http://700700.jp/acc/acclog.cgi?"); document.write("referrer="+document.referrer+"&"); document.write("width="+screen.width+"&"); document.write("height="+screen.height+"&"); document.write("color="+screen.colorDepth+"' alt="">"); // --> </SCRIPT> どこをどう直せばよいのかよくわからないので、 もしお分かりの方がいらっしゃいましたら、 お教えいただけますでしょうか? よろしくお願いいたします。

  • javascript iframeについて

    iframeにてアンケート的な物を作成しています。 ページは13ページくらいです ボタンを押すと次のページに移動し、さらに親のテキストエリアに選択したボタンの文言が上から保存されていくようにしたいのですが ↓は子のiframe内ですが、どのようにしていいかわからなくて、、 <html> <head> <link href="./if.css" rel="stylesheet" type="text/css"> </head> しつもん1<br><br> <form name="test"> <input type="button" name="001" value="戸館"onClick="kakunin(1)";onClick="setChars('AAAA')")><br><br> <input type="button" name="002" value="集合住宅" onClick="kakunin(2)"> </form> <form name="myFORM"> <textarea name="myTEXT"rows="10"></textarea><br> <!-- ↓ ここから先はJavaScript!!! --!> <script type="Text/Javascript"> function setChars(text) { if (document.myFORM.myTEXT.value || "") { document.myFORM.myTEXT.value = document.myFORM.myTEXT.value + "\n" } document.myFORM.myTEXT.value = document.myFORM.myTEXT.value + text } function kakunin(btnNo){ if (btnNo == 1){ link = "戸館"; href = "EN002.html"; }else{ link = "集合住宅"; href = "EN002m.html"; } ret = confirm(link + "でよろしいですか?"); if (ret == true){ location.href = href; } } </script> </html> よろしくお願いいします。