質問: ### 前提・実現したいこと 前提:chromeを利用。 http://testserver78.html.xdomain.jp/main.htm のexecute(iframe)ボタンを押したときに iframe内にHandsontable(ライブラリ)で作ったスプレッドを表示したい。 ・iframeの中にスクリプトを持ちたくない(main.htmが制御してiframeは表示するだけにしたい) ・事情がありiframeを使わないという選択肢はとれない execute(self)はうまく動作するので、別のグローバル空間の部品に Handsontableが対応してないのが原因? ### 発生している問題・エラーメッセージ http://testserver78.html.xdomain.jp/main.htm でexecute(iframe)を押したとき、 Uncaught TypeError: Cannot read property 'display' of undefined が発生。 ライブラリの中でdocumentを参照しているが、 main.htmがnew Handsontable(grid, {data: data}); したとき、グローバル空間はmain.htmのものであるので、 documentと言えばmain.htmのdocumentを指しているのが原因と思われる ### 該当のソースコード http://testserver78.html.xdomain.jp/main.htm を参照ください。 全体像 ・main.htm (起動画面) └handsontable.full.js (ライブラリ) ・blank.htm (iframe) ■main.htm ``` Handsontable execute(self) execute(iframe) ``` ■blank.htm(iframeがsrcしてる) ``` Handsontable ChildIframe ``` ### 試したこと ・callによるthisの書き換えでwindowを変更する →windowは変わらない ・Handsontableにコンテキストを指定する方法があるか →なさそう? ・Handsontableを軽く改造してみる →単純にコンストラクタにdocument参照を渡せるようにして、 それを他のdocumentと書いてるところで使うような感じに直してみようとしたが単純にはいかず挫折
回答: ``をiframe内に挿入してはいかがでしょう。(最初から書いても親から挿入してもどちらでも出来ると思います) **追記:** 受け手側のスクリプトを挿入して、それに引数を与えて実行とか。 【iframeでJavaScriptを動的に実行する - メモ帳】 > > > ``` > var script = document.createElement("script"); > script.type = "text/javascript"; > script.innerHTML = 'console.log("Hello World!")'; > doc.body.appendChild(script); > ``` > > 【iframe内のJavascript関数を実行する | CloudAdvisor】 > > > ``` > //IFRAME側 > callme = function(){ > alert('hello'); > } > > //本体HTML側 > iframe = document.getElementById(id); > iframe.contentWindow.callme(); > ``` > >