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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3129閲覧

iframe 内のコードが無視される 深刻な問題の原因は?

xmg

総合スコア20

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/15 04:36

症状
下記のコードを実行していただけますでしょうか。
iframe 内部のコードが実行されずに作動停止してしまいます。

目に見える症状
表示させたボタンを押しても、何も作動せず
.

コード実行後の console 上でのエラー表示内容
'
Uncaught ReferenceError: buttonD is not defined
onclick about:blank:1

注:
すなわち、browser は、新たに書き加えられた iframe 内の HTML構文を
file name = "blank" という扱いにしていることが分かります
.

iframe 内容を、親ページと異なる別の HTML file として読み込ませない理由

背景事情の説明が必要と思われます

下記のコードからお分かりいただけますよう、この事例では 
iframe 内容を script から書き出させています。

その理由として、

iframe 内のエレメントに親ページから読み書きをすることが
最近の cross domain 問題のおかげで阻害されるようになってしまいました。

代替策として、frame 内容を子供ページとして読み込ませる代わりに
親ページ内部から、append させる方法を知りました。

問題点
createElement + appendChild で iframe 内の子供ページを作ると
frame 内部に script を正常に実行できる環境が存在しないこと
.

問題が、質問者のコード作成内容の誤りによらないことの裏づけ

以下のコードで、
親ページから生成されたフレームページ内の
ボタン操作が実行できずエラーとなってしまいますが、

その同じフレーム内のコードを、単独の HTML ファイルとして表示させると、
問題なくボタン操作が実行されることから、
iframe を親ページから書き出す方法では、かなり制約が大きいことが裏付けられます。
.

質問内容とは

iframe 内部でボタン操作を実行させながら、親ページとの情報のやり取りを可能にさせることができるような、frame 内ファイルの作り方が全く分かりません。

問題のコード 事例

html

1<!DOCTYPE html> 2<html> 3<meta charset="UTF-8"> 4<head> 5<script src= "frameCreate002.js" ></script> 6</head> 7 8<body> 9 <button onclick="appendHTML()" >write</button> 10 11 <br><br> 12 13<iframe id="frame01" > 14</iframe> 15 16</body> 17</html>

javascript

1// file name: frameCreate002.js // 2 3function appendHTML() 4{ 5 var frameCode = document.getElementById( "frame01" ).contentDocument; 6 7 var container = frameCode.createElement( "div" ) ; 8 9container.innerHTML = 10'<!DOCTYPE html><html><body><script> function buttonD() { alert( "hello world" ); } </script> <button onClick= "buttonD()" >click me </button></body></html>' ; 11 12 frameCode.body.appendChild( container ); 13}

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

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

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

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

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

maisumakun

2020/09/15 04:39

それらのページのURLは「http://」(あるいはhttps://)になっていますか、それとも「file://」でしょうか?
xmg

2020/09/15 04:41

file:// です。 ローカルファイルをオフラインで動かしています。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

ローカルファイルをオフラインで動かしています。

今どきのブラウザは、別々のローカルファイルをすべて別オリジンとみなして動作するようになっています。

取るべき道は2つあります。

  • postMessageを使って、クロスオリジンでも動くように組む
  • 開発用のローカルサーバを立てるなどして、http://経由のアクセスにする

投稿2020/09/15 04:48

maisumakun

総合スコア145184

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問