質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

Q&A

解決済

2回答

3896閲覧

【Monaca】iframe内から親フレームのInAppBrowser起動に失敗する

jmp1001

総合スコア13

iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

プラグイン

プラグイン(plug-in)は、ソフトウェアアプリケーションの機能拡張の為に開発された、一組のソフトウェアコンポーネントのことを指します。

Monaca

「Monaca」はiOS、Android、Windows向けのアプリ開発に対応した、Cordovaベースのモバイルアプリ開発プラットフォームです。HTML5、JavaScriptといったWeb標準技術を用いてモバイルアプリ開発を行うことができます。

2グッド

2クリップ

投稿2018/10/01 13:30

編集2018/10/01 13:32

Monacaでハイブリッドアプリを作成しています。
その際、iframeで別サイト(自分のサイト)を参照し、フレーム内でページ遷移するようにしています。
iframe(子フレーム)内で外部リンクを開くときには「InAppBrowser」プラグインを利用して親フレーム経由でアプリ内ブラウザ(または外部ブラウザ)で開きたいのですが、うまくいきません。

iFrame内のサイトに下記のようなscriptを置いて、リンクをクリックした際にはクリック親フレーム内のInAppBrowserを使うように設定しています。

<a href="#" onclick="clickURLopen('https://google.co.jp');return false;">リンク</a>

<script> function clickURLopen(url) { if(typeof inAppOpen == 'function') { inAppOpen(url); } else{ window.open(url, '_system', 'location=yes'); return false; } } </script>

親フレーム(Monaca上にて作成)のscriptは下記の通りです。

function inAppOpen(Ext){
window.open = cordova.InAppBrowser.open;
window.open(url,'_system','location=yes');
}
var innerWindow = document.getElementById('iframe1').contentWindow;
innerWindow.inAppOpen= inAppOpen;

iframe内の子フレームから別ページに遷移した先(これも自サイト)でリンクを開こうとすると、
1)一度目は「typeof inAppOpen」がUndefinedになっているようでブラウザを立ち上げず画面いっぱいにリンクが開いてしまう。
2)前の画面に戻りもう一度トライすると今度はInAppBrowserが起動する。

という現象が起こっています。

理由や対処法などお分かりの方がいらっしゃいましたらご教示頂ければ幸いです。
宜しくお願い致します。

KNaito, tkk44👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

基本的に、Monaca/Cordovaではiframeを使ったアプリケーションはあまりおすすめ出来ないと思います。(特に、ブラウザの進む・戻るの処理に問題があると思います)

ですが、この質問については、自分の環境で次のコードで試したところ、特に問題なく動作しているようでした。

html

1 <script> 2 document.addEventListener('deviceready', onDeviceReady, false); 3 function onDeviceReady() { 4 var iframe = document.createElement("iframe"); 5 iframe.setAttribute("src", "http://path/to/my/website"); 6 document.body.appendChild(iframe); 7 8 function inAppOpen(url){ 9 window.open = cordova.InAppBrowser.open; 10 window.open(url,'_system','location=yes'); 11 } 12 iframe.onload = function() { 13 var innerWindow = iframe.contentWindow; 14 innerWindow.inAppOpen= inAppOpen; 15 }; 16 } 17 </script>

iOSとAndroidのMonacaデバッガーでそれぞれ動作確認しました。

注意点としては

  1. iframeタグをbodyタグの中に記述してしまうと、iosで問題が発生するため、devicereadyイベント後にjavascriptでiframeタグを動的に挿入している

  2. iframeのcontentWindowにinAppOpenオブジェクトを組み込むのは、iframeを読み終わってから行う。

です。2.が本当に必要かどうかはちょっとよく分からないのですが、Webページの読み込みに時間がかかるとinAppOpenオブジェクトの組み込みが早すぎてしまうのではないかと思い、このようにしてみました。

投稿2018/10/09 09:31

編集2018/10/09 09:33
KNaito

総合スコア376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jmp1001

2018/10/09 13:34

有難うございます。無事に解決できました。 iframeの読込のタイミングではないかと思っていましたが、ご教示頂いてスッキリ解決しました。 有難うございました。
KNaito

2018/10/09 23:15

解決したようで良かったです!
guest

0

InAppBrowserはcordova apiにアクセス出来ない別ブラウザでurlを開きます。

なぜ質問の動きになるかは分かりませんが、InAppBrowserの想定する使い方とは違うからと思います。

overlayで既存のwebview上に重ね合わせるInAppBrowserがあるのか探してみてはいかがですか?

投稿2018/10/03 15:00

編集2018/10/04 11:45
oikashinoa

総合スコア2826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jmp1001

2018/10/05 05:29

ありがとうございます。 一度失敗した後は、二度目以降はちゃんと開くので何か方法があるような気がしています。 ご教示頂いたものは探しているのですが今のところ見つかっていません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問