• 締切済み

SafariのIframeで高さが取得できません

<script language="JavaScript"> <!-- function frame_check(){ if(main.document.body){ if(navigator.userAgent.indexOf("Opera") != -1){ // 文字列に「Opera」が含まれている場合 var f = main.document.body.scrollHeight; } else if(navigator.userAgent.indexOf("MSIE") != -1){ // 文字列に「MSIE」が含まれている場合 var f = main.document.body.scrollHeight; } else if(navigator.userAgent.indexOf("Firefox") != -1){ // 文字列に「Firefox」が含まれている場合 var f = main.document.body.offsetHeight; } else if(navigator.userAgent.indexOf("Netscape") != -1){ // 文字列に「Netscape」が含まれている場合 var f = main.document.body.offsetHeight; } else if(navigator.userAgent.indexOf("Safari") != -1){ // 文字列に「Safari」が含まれている場合 var f = main.documentElement.offsetHeight; } if(f) document.getElementById("frame_set").height=f+20; setTimeout("frame_check()",100); }else{ setTimeout("frame_check()",100); } } setTimeout("frame_check()",10); --></script> <iframe name="main" id="frame_set" src="mainf.html" width="800" height="4000" frameborder="0" scrolling="no"></iframe> 上記のスクリプトを作成しましたが、IE7、 Firefoxではうまくいきますが、SafariではIframeに表示するページの高さが取得できません。 どこが問題なのかご教授お願いいたします。

みんなの回答

  • pick52
  • ベストアンサー率35% (166/466)
回答No.3

いろいろ、調べてみました。 http://d.hatena.ne.jp/onozaty/20060803/p1 http://dogmap.jp/2007/07/19/doctype-%E5%AE%A3%E8%A8%80%E3%81%AB%E3%82%88%E3%82%8B-property-%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/ 結局、どのような動作をさせたいのかが分かりませんがもしかすると フレームをフレーム内のサイズと同じにしてフレームと認識させない ようにしたいということでしょうか。 そうなると、セキュリティやマナー上の問題が発生します。 ただ、上記のようにしたい場合は以下のようにしたらいいみたいです。 (なんか調べた結果と異なってなぜか標準モードでも互換モードでも document.documentElement.clientHeightとdocument.body.clientHeightが ブラウザによって取得される値が異なるもののどちらも使用できたり しているみたいですが) function frame_check() { var elm = main.document; var f = elm.documentElement.scrollHeight || elm.body.scrollHeight; if(f) { document.getElementById('frame_set').height = f + 20; } } そして、 iframe に onload="frame_check();" をつけます。 あと、フレームのsrc属性が他のドメインだと正常に値が取得できない ようです。 もし、勘違いがあったらすみません。

web_shiro
質問者

補足

ご回答ありがとうございます。 セキュリティやマナー上の問題とは、どのような問題ですか?すいません素人ですので、教えていただけますか。 ご支持の通り、変更しましたが、結果変わらずでした。 セキュリティやマナー上の問題が大きければ1から出直そうかなと思います。 よろしくお願いいたします。

  • pick52
  • ベストアンサー率35% (166/466)
回答No.2

変数定義はブロックの外でした方がいいような気が...。 (JavaScriptってどこで宣言しても関数内は有効だったんだっけ?) ところで、ifの中で同じ記述を繰り返していますがこれだとifの意味が ないような気がします。 function frame_check(){ if(main.document.body) { var elm = main.document.getElementById('frame_set'); var f = elm.scrollHeight || elm.offsetHeight; if(f) { document.getElementById('frame_set').height = f + 20; } } setTimeout("frame_check()",100); } setTimeout("frame_check()",10); としたらどうでしょうか。 (試していないので動作するかどうかの保証はしません)

web_shiro
質問者

補足

ご回答ありがとうございます。 しかし結果は変わらずでした。

  • kero_mio
  • ベストアンサー率90% (94/104)
回答No.1

main.documentElement.offsetHeight の部分が取れないって おっしゃっているんですよね? main.documentElement.offsetHeightの箇所を単純に 「document.getElementById("frame_set").offsetHeight」 にしてあげれば、取得できます。 (Safariで検証しましたので自信はあります) どうぞ、宜しくお願いします。

web_shiro
質問者

補足

早速のご回答ありがとうございます。 ご指示のとおり else if(navigator.userAgent.indexOf("Safari") != -1){ // 文字列に「Safari」が含まれている場合 var f = main.documentElement.offsetHeight; } を else if(navigator.userAgent.indexOf("Safari") != -1){ // 文字列に「Safari」が含まれている場合 var f = document.getElementById("frame_set").offsetHeight; } に変更しましたが WindowsXPのsafari(3.12)では高さが取得できずスクロールバーが勝手に可変します。 どこが悪いのでしょうか?何度もすみません。よろしくお願いいたします。

関連するQ&A

  • iframe の高さをページごとに調節

    iframeを使用していますが、 読み込むページによって高さが異なるため見栄えが悪いです。 javascriptで指定できるそうですが、中々うまくいきません。 指定する方法を知っている方がいましたら教えてください。。 また、読み込むページがcgiの場合でも調節は可能でしょうか?? ========= ちなみに、下記方法で行った場合に失敗しています。 <iframe name="main"id="frame_set" src="http://www.***.com/***.cgi" width="100%" height="500" frameborder="0"> </iframe> <script language="JavaScript"> <!-- function frame_check(){ if(frame.document.body){ f=frame.document.body.scrollHeight; if(f) document.getElementById("frame_set").height=f+20; setTimeout("frame_check()",100); }else{ setTimeout("frame_check()",100); } } setTimeout("frame_check()",10); --></script> ====================== よろしくお願いします><

  • PHPにiframeでニュースを表示

    PHPを利用したショッピングカートのトップにニュースを掲載しようとしています。 ニュースはCGIで管理しています。 高さを自動調整するJavaScriptを組んでみたのですが、ページを開いた時1行分しか表示せず、リロードすると自動サイズではなく"iframeで設定したサイズ"になってしまいます。 <script language="JavaScript"> <!-- function GetHeight(Y,NAME) { var app = navigator.appName.charAt(0); if(navigator.userAgent.indexOf('Safari') != -1){ document.getElementById(Y).height = parent.frames[NAME].document.body.scrollHeight + 80; }else if (app == "N") { document.getElementById(Y).height = parent.frames[NAME].document.height +80; } else { document.getElementById(Y).height = parent.frames[NAME].document.body.scrollHeight + 80; } } // --> </script> <iframe src="./info.cgi?mode=contents2&cont=JP" onload="GetHeight(this.id,this.name)" id="Z" name="newZ" height="500"「←このサイズになる」 width="100%" frameborder="0" marginheight="0" marginwidth="0"> </iframe> これは何が悪いのでしょうか? もしかして、文字コードが関係していますか? PHPはEUC-JP、iframe先はShift_JISです。

    • 締切済み
    • PHP
  • userAgent

    userAgentでプラットフォーム別に表示するサイトを分岐する場合 <script type="text/javascript"> <!-- var is_iphone=navigator.userAgent.indexOf("iPhone", 0); var is_ipod=navigator.userAgent.indexOf("iPod", 0); var is_android=navigator.userAgent.indexOf("Android", 0); if((is_iphone & is_ipod) > -1){ window.location = "sp/"; }else{} if(is_android > -1){ window.location = "sp/"; }else{} // --> としたら、ガラケーやipodではないタブレットは、どれと認識されるのでしょうか? タブレットはAndroidになるのでしょうか?

  • 外部javascriptの読み込み方

    下記ソースのjavascriptにて外部javascript内容を読み込もうとしています ==呼び出すファイル(test.htm)========================== <head> <script type="text/javascript" src="common.js"> <!-- function init() { setBrowser(); alert(getBrowser()); } --> </script> </head> <body onload="init();"> てすと </body> </html> ================================================== ==呼び出されるファイル(common.js)=================== <!-- var strBrowser; function setBrowser() { if(navigator.userAgent.indexOf("MSIE") != -1){ // IE strBrowser = "IE"; } else if(navigator.userAgent.indexOf("Firefox") != -1){ // FireFox strBrowser = "Firefox"; } else if(navigator.userAgent.indexOf("Safari") != -1){ // Chrome & Safari strBrowser = "Safari"; } else{ strBrowser = ""; } } function getBrowser() { return strBrowser; } //--> ================================================= これで呼び出す事ができません。 何処が悪いのか、ご指摘頂ければ幸いです。

  • javascriptで別ページに・・・ 続編

    こんにちは。 前回質問させて頂いた事で、特定のユーザーエージェントからのアクセスを任意の別ページに飛ばす方法に成功しました。 下記がそのソースです。 このソースの例では、Internet ExplorerからのアクセスをヤフージャパンTOPページに飛ばす方法です。 ------------------- <script type="text/javascript"> <!-- document.write('<p>ブラウザの判別:'); if(navigator.userAgent.indexOf("Opera") != -1){ // 文字列に「Opera」が含まれている場合 document.write('あなたのブラウザは Opera ですね?'); } else if(navigator.userAgent.indexOf("MSIE") != -1){ // 文字列に「MSIE」が含まれている場合 location.href="http://www.yahoo.co.jp/"; } else if(navigator.userAgent.indexOf("Firefox") != -1){ // 文字列に「Firefox」が含まれている場合 document.write('あなたのブラウザは Firefox ですね?'); } else if(navigator.userAgent.indexOf("Netscape") != -1){ // 文字列に「Netscape」が含まれている場合 document.write('あなたのブラウザは Netscape ですね?'); } else if(navigator.userAgent.indexOf("Safari") != -1){ // 文字列に「Safari」が含まれている場合 document.write('あなたのブラウザは Safari ですね?'); } else{ document.write('判別できませんでした。'); } document.write('</p>'); // --> </script> ----------------------------------- これに対して追加質問させて頂きます。 (1)ユーザーエージェントの指定が上記のままではInternet Explorer利用者の全員が対象になってしまうので、さらにUAを絞り込んで、 例 Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.1; SV1) ↑この様に、より長く具体的に絞り込んでUAを指定する事は不可能でしょうな。 自己のアクセス解析で得られた情報を記述してテストしましたが、成功しませんでした。 半角や全角の違いか?それともスペースに問題があるのか分かりません。 (2)上記の例では、ユーザーエジェントで判定しておりますが、ホストで判定する事は不可能でしょうか。 自己の場合の「softbank***********.bbtec.net」でテストしましたが、やはり成功しませんでした。 お手数ですが宜しくお願いします。

  • 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">'); }

  • Safariを判別し別ページに飛ばすには

    javascriptでブラウザを判別して、ブラウザによって違うページに飛ばしています。 基本的にはIEとそれ以外なのですが、Safariだけが別ページに飛んでくれません。(index.htmlにいたままになる) 下記のようにしていますが、どうすれば飛ぶようになるでしょうか? よろしくお願いします。 <script type="text/javascript"> if(navigator.userAgent.indexOf("MSIE") != -1){ window.location.href = "index.html";}     : else if(navigator.userAgent.indexOf("safari") != -1){ window.location.href = "index2.html";} </script>

  • Safariで<iframe>のinnerHTMLを取得する方法

    MacのブラウザSafariで <iframe id="iframe1" src="test.txt" style="display:none" width="1" height="1"></iframe> で読み込んだtest.txtの内容が取得できなくて困っています。 ちなみにWindowsのIEとMacのFireFoxでは下記のようなかんじで取得できています。 IEの場合 var text = this.iframe1.document.body.innerHTML; FireFoxの場合 var text = document.getElementById("iframe1").contentDocument.body.innerHTML; MacのSafariでは上記どちらの方法でも取得できませんでした。 他にも色々調べて試してみたのですがやはり上手くいきません。 <iframe>タグ内のstyle指定をなくしてみたらiframeにテキストの内容は表示されているのであとは取得できればいいのですが。。 JavaScriptは初心者なので記述等不可思議かもしれません。 あわせてご教授いただけたらと思います。

  • 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"); } }

  • IEのバージョンが7以下の際。ポップアップ表示

    こんにちわ。 今回やりたいことは、JavaScriptを使って、ブラウザのバージョンを判別し、メッセージウィンドをポップアップさせたいと思っています。 いかんせん、やっと最近HTMLとCSSの使い方がわかってきた程度で、JavaScriptは初心者です。(プログラム自身はVBAなどでそこそこ作っているので、なんとなくやり方はわかるんですが、実装が全く分かりません) 以下のようなサイトを見つけました。 http://jisakupc-technical.info/programing/javasc … 【以下ページ内のプログラム】 // ブラウザのUAを小文字で取得 var userAgent = window.navigator.userAgent.toLowerCase(); // IEの判定 var isIE = (userAgent.indexOf('msie') >= 0 || userAgent.indexOf('trident') >= 0); // IEのバージョンを取得 if (isIE) { // 正規表現によりUA文字列を配列に分割 var arr = /(msie|rv:?)\s?([\d\.]+)/.exec(userAgent); version = (arr) ? arr[2] : ''; return 'ie'+version; } else { // IE以外のブラウザ判定 if (userAgent.indexOf('chrome') != -1) { /* Google Chrome. */ return 'chrome'; } else if (userAgent.indexOf('firefox') != -1) { /* FireFox. */ return 'firefox'; } else if (userAgent.indexOf('safari') != -1) { /* Safari. */ return 'safari'; } else if (userAgent.indexOf('opera') != -1) { /* Opera. */ return 'opera'; } else if (userAgent.indexOf('edge') != -1) { /* Edge. */ return 'edge'; } else if (userAgent.indexOf('gecko') != -1) { /* Gecko. */ return 'gecko'; } else { return false; } } 分からないのが、Returnで返り値を返していますが、「どこ」に返しているのでしょうか? HTML構文内? この辺の、JavaScriptとHTMLの関連性がよく理解できていません。 最終的にやりたいのは、ブラウザがIEでかつ7以下もしくはIE8以上だが互換表示モードだとポップアップをさせたいということです。 何か良いアドバイスを頂けると大変助かります。

専門家に質問してみよう