javascriptの動的読み込みについて教えてください
いつもお世話になります。
jqueryを勉強中のものです。
少しややこしいのですが、
以下のmenu.htmlとmain.htmlを持ったframe.htmlで、メニューの試験ボタンを押してmain.htmlの<div id="target_id">にload.htmlを動的に読み込んだ時、loadされたhelloボタンが作動しません。
menu.htmlのtest()中のalert(data);でload.htmlの<script>が読み込まれていることは確認できるのですが・・何が原因でどこが悪いのでしょうか?
よろしくご指導お願いします。
frame.html
-----------------------------------------------------------
<html>
<head>
<title>Dynamic Load Test</title>
</head>
<frameset name="frame" cols="180,*">
<frame name="menu" src="menu.html">
<frame name="MainPanel" src="main.html">
</frameset>
</html>
-----------------------------------------------------------
menu.html
-----------------------------------------------------------
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript"><!--
function test(){
jQuery.get("./load.html",function(data){
alert(data);
$("#target_id",window.parent.MainPanel.document).html(data);
});
}
// --></script>
</head>
<body>
<button onClick="test();">試験</button>
</body>
</html>
-----------------------------------------------------------
main.html
-----------------------------------------------------------
<html>
<head>
</head>
<body>
<h1>main.html</h1>
</body>
<div id="target_id"></div>
</html>
-----------------------------------------------------------
load.html
-----------------------------------------------------------
<h1>load.html</h1>
<script type="text/javascript"><!--
function hello(){
alert("こんにちわ");
}
// --></script>
<button onClick="hello();">hello</button>
-----------------------------------------------------------
No.3ベストアンサー
- 回答日時:
>で<div id="target"></div>の部分だけにload.htmlを読み込めないかと考えたからです
DOMの仕様と言うべきか、ブラウザの仕様と言うべきか、hellow()は記憶域にロードされていないからです。つまり、グローバル変数になっていません。例えば、
<button onClick="alert('aaaa'); hello();">hello</button>
とすれば、アラートは実行されますが、hello()は記憶域にないため、不明なオブジェクトの実行となりエラーになっています。ステータスバーにエラーのアイコンが出ているかと思います。
HTMLオブジェクト(DOM)でもgetElementById()で取得できない状態となっています。
No1, 2の回答者のような操作が正しい解答かと思います。
もし行いたいのであれば、サーバーサイドスクリプトで行うようなaspxファイルにて達成できます。
No2の補足であるようなやり方は、結局、No2の回答者のやり方と一緒です。フレームのTOPからのロードなのでスクリプトの変数が最初からロードされています。最初からmain.htmlに関数として宣言するやり方と一緒です。
逆に言えば、
<button onClick="ここにJavaScriptを全て書き込む">hello</button>
とすれば、実行可能ですが、そのオブジェクト単位の動作となります。
詳しい解説を有難うございます。
大変勉強になり、理解が深まりました。
このようなことは本質的に無理で、Javascriptのオブジェクトは最初から配置しておくべきことがよくわかりました。
No.2
- 回答日時:
ご質問の趣旨とはズレた回答をしてしまったようで申し訳ないです。
ご参考になるかは分かりませんが、
私は親ファイルにスクリプトを記述し、
parent.xxx();
で呼び出しちゃいますね。
動的にロードしたい理由にもよりますが、
適切に引数を与えれば挙動は変えられますので。
この回答への補足
ご返事有難うございます。
> 動的にロードしたい理由にもよりますが、......
このようなことを思いついた理由は、普通はmenu.htmlに
<a href="load.html" target="MainPanel">load.html</a>
と書いてjavascriptも含んだhtmlファイル全体をmainにloadしますが、これだとmain全体が置き換わりますのでajaxで<div id="target"></div>の部分だけにload.htmlを読み込めないかと考えたからです。
少し姑息な方法ですが、menu.htmlを以下のようにするとhelloボタンが作動することが判りました。
menu.html
-----------------------------------------------------------
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript"><!--
function test(){
var html ="<iframe frameborder=\"0\" width=\"100%\" src =\"load.html\"></iframe>";
//alert(html);
$("#target_id",window.parent.MainPanel.document).html(html);
}
// --></script>
</head>
<body>
<button onclick="test();return false;">試験</button>
</body>
</html>
-----------------------------------------------------------
それにしても、jQuery.getでmianにhello()を読み込んでいるのにこの関数にアクセスできない理由が今一理解できません。
webに詳しい方の解説を頂ければ幸いです。
No.1
- 回答日時:
load.htmlの
<script type="text/javascript"><!--
function hello(){
alert("こんにちわ");
}
// --></script>
を<head>と</head>の間に記述されては如何でしょうか。
この回答への補足
ありがとうございます。
早速試しましたがだめでした。
frameにせずに以下のような単一htmlでは同じload.htmlでうまくいくことを確認しています
よろしくお願いします。
---------------------------------------------------------------------
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript"><!--
function test(){
jQuery.get("./load.html",function(data){
alert(data);
$("#target_id").html(data);
});
}
// --></script>
</head>
<body>
<h1>main.html</h1>
</body>
<button onClick="test();">試験</button>
<div id="target_id"></div>
</html>
---------------------------------------------------------------------
お礼というより補足の補足ですが、ご回答の意味がload.htmlの<script>タグをmain.htmlの<head>に移すということであれば勿論うまくいきますが、これは<script>の静的ロードですので、今回の質問の趣旨はmenuよりmainに<script>を動的にロードしたいと言う意味です。
何かよい工夫はないでしょうか?
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
location.replaceでの移動
-
jQuery toggle() 戻るで開いた...
-
パソコンで動くjavascriptがス...
-
readyStateが4にならない原因
-
struts selectbox optionsColle...
-
FullCalendar の複数月表示につ...
-
jquery.csv2table.jsに検索窓
-
jQueryのblockUIをformのボタン...
-
ある条件の画像のみ表示を切り...
-
jqueryのgetでJSPを呼び出したい
-
階層別の組織図の自動作成について
-
JavaScriptでtabindexの変更っ...
-
SQLのmaxで求めた値を変数に代...
-
Javascriptを使ってQRコード読...
-
jQueryで、複数条件の絞り込み機能
-
JavascriptからPHPへのAjax通信...
-
Selenium4でボタンをクリックで...
-
同一ページ移動時ハンバーガー...
-
カンマ区切りのデータを配列に...
-
迷路探索プログラムを作るには...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インラインフレームを自動更新...
-
一定時間ごとに表示内容を切り...
-
jQueryで追加した要素がマウス...
-
日付が変わると自動更新
-
リンク元のファイル名を表示し...
-
クリックテキストを次ページに表示
-
JQueryで動的生成のスライダが...
-
Folder.selectDialog()について
-
location.replaceでの移動
-
jQueryでloadした部分に.jsが効...
-
jQuery toggle() 戻るで開いた...
-
EUC-JPに対応しているjQueryを...
-
親フレームの存在確認
-
google翻訳ツール設置
-
$.postとPerlのデータ受け渡し...
-
毎日午前0時にhtmlを切り替えた...
-
javascriptの動的読み込みにつ...
-
javascriptのタイピングゲーム...
-
javaの変数又はデータの共有
-
AjaxでSJISファイル読み込みす...
おすすめ情報