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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

3137閲覧

JavaScriptで、他ファイルから要素を読み込んで作動させるには?

ky_46

総合スコア92

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2016/06/27 07:37

JavaScriptで、別HTMLを取り込み、指定の位置に表示させることができています。

しかし、読み込んだ別ファイルのIDなどの要素に対し、スクリプトなどを作動させることはできずにいます。

例として、簡単なスクリプト組んでみました。

HTML

1<!doctype html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>JavaScriptテスト</title> 6<script type="text/javascript" src="js/main.js"></script> 7<link href="cs/main.css" rel="stylesheet" type="text/css"> 8</head> 9 10<body> 11<div id="cl1"><img src="img/number3_1.png" /></div> 12<div id="cl2"><img src="img/number3_22.png" /></div> 13<div id="cl3"><img src="img/number3_33.png" /></div> 14<div id="cl4"><img src="img/number3_44.png" /></div> 15<div id="ans"></div> 16 17 18</body> 19</html>

JavaScript

1window.onload = function(){ 2 document.getElementById('cl1').onclick = function(){ 3 4 var str = document.createTextNode("1が押された"); 5 document.getElementById('ans').appendChild(str); 6 7 }; 8 9 document.getElementById('cl2').onclick = function(){ 10 11 var str = document.createTextNode("2が押された"); 12 document.getElementById('ans').appendChild(str); 13 14 }; 15 16 document.getElementById('cl3').onclick = function(){ 17 18 var str = document.createTextNode("3が押された"); 19 document.getElementById('ans').appendChild(str); 20 21 }; 22 23 document.getElementById('cl4').onclick = function(){ 24 25 var str = document.createTextNode("4が押された"); 26 document.getElementById('ans').appendChild(str); 27 28 }; 29 30 31};

CSS

1div#cl1 { 2 width: 36px; 3 height: 36px; 4 float: left; 5} 6div#cl2 { 7 width: 36px; 8 height: 36px; 9 float: left; 10} 11div#cl3 { 12 width: 36px; 13 height: 36px; 14 float: left; 15} 16div#cl4 { 17 width: 36px; 18 height: 36px; 19 float: left; 20 21}

このコードを実行すると、1の画像があるところをクリックすると、1が押された とDIV ans にテキストが追加されます。

しかし、このHTMLをJavaScriptで他のHTMLに読み込ませると、うまく動作しなくなってしまいます。

HTML

1<!doctype html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>JavaScriptテスト</title> 6<script type="text/javascript" src="js/test.js"></script> 7<link href="cs/main.css" rel="stylesheet" type="text/css"> 8</head> 9 10<body> 11<div id="inst"></div> 12 13</body> 14</html> 15

HTML

1<div id="cl1"><img src="img/number3_1.png" /></div> 2<div id="cl2"><img src="img/number3_22.png" /></div> 3<div id="cl3"><img src="img/number3_33.png" /></div> 4<div id="cl4"><img src="img/number3_44.png" /></div> 5<div id="ans"></div> 6

JavaScript

1// JavaScript Document 2window.onload = function(){ 3 4 var httpObj1 = new XMLHttpRequest(); 5 httpObj1.open("GET", "test02l.html", true); 6 httpObj1.onreadystatechange = function() { 7 if (httpObj1.readyState == 4) { 8 var readObject01 = httpObj1.responseText; 9 document.getElementById("inst").innerHTML = readObject01; 10 } 11 } 12 httpObj1.send(''); 13 14 15 document.getElementById('cl1').onclick = function(){ 16 17 var str = document.createTextNode("1が押された"); 18 document.getElementById('ans').appendChild(str); 19 20 }; 21 22 document.getElementById('cl2').onclick = function(){ 23 24 var str = document.createTextNode("2が押された"); 25 document.getElementById('ans').appendChild(str); 26 27 }; 28 29 document.getElementById('cl3').onclick = function(){ 30 31 var str = document.createTextNode("3が押された"); 32 document.getElementById('ans').appendChild(str); 33 34 }; 35 36 document.getElementById('cl4').onclick = function(){ 37 38 var str = document.createTextNode("4が押された"); 39 document.getElementById('ans').appendChild(str); 40 41 }; 42 43 44};

CSS

1div#cl1 { 2 width: 36px; 3 height: 36px; 4 float: left; 5} 6div#cl2 { 7 width: 36px; 8 height: 36px; 9 float: left; 10} 11div#cl3 { 12 width: 36px; 13 height: 36px; 14 float: left; 15} 16div#cl4 { 17 width: 36px; 18 height: 36px; 19 float: left; 20 21}

最初のXMLHttpRequestによって、2つ目のHTMLの内容が、<div id="inst"></div>の間に挿入されるところまでは期待通りの動作です。
しかし、1,2,3,4が縦に並ぶところから、IDを区別しているCSSも効いておりません。
当然、数字ボタンを押しても、JavaScriptに指定した、テキストを追加する動作も発動しません。

このような形で、2つ目のhtmlに記載されたIDやclassで、CSSやJavaScriptを効かせる方法がありましたら、教えてください。

目的としては、2つ目のファイルのみを別作業者に作業させて、スクリプトやCSSを触らせる事なく、HTMLを修正したいという内容になります。

よろしくお願いいたします。

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

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

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

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

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

kei344

2016/06/27 09:17

まだ質問が「受付中」になっていますが、いったん「解決済」にされてはいかがでしょうか。
ky_46

2016/06/28 00:23

失礼しました。お礼を書き込んで、終了のつもりでいましたが、ベストアンサーを選ぶのを忘れていました。大変失礼しました。
guest

回答1

0

ベストアンサー

  • document.getElementById("inst").innerHTML = readObject01;
    の後ろにconsole.log("test1");と出力してみてください。
  • document.getElementById('cl1').onclick

の前にconsole.log("test2");と出力してみてください。

開発者ツールで見てみると、おそらく「test2」が先に出力されて「test1」が後に出力されるのがわかると思います。これは、httpObj1.onreadystatechangeが非同期で呼ばれるため、「コード的に前に書いてあっても、処理順序的に後ろになることがある」からです。
今の状況は、外部から取得したHTMLが実際に追記されるより「前」に、「cl1」等の「まだ存在しないエレメント」に対してイベントを登録しています。なので、追記した「後」にonclick等の登録処理を行えばよいでしょう。

jQueryを使えば「後から追加されたHTMLタグ」に対してもイベントを発火させることができますが、今回はjQueryを使われていないようですので、他の方法を提示させていただきます。

Javascript

1document.getElementById("inst").innerHTML = readObject01;

この後ろにonclickのイベント登録処理を移動してください。

投稿2016/06/27 07:52

編集2016/06/27 07:53
masaya_ohashi

総合スコア9206

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

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

ky_46

2016/06/27 08:29

ありがとうございます。 JavaScriptを window.onload = function(){ var httpObj1 = new XMLHttpRequest(); httpObj1.open("GET", "test02l.html", true); httpObj1.onreadystatechange = function() { if (httpObj1.readyState == 4) { var readObject01 = httpObj1.responseText; document.getElementById("inst").innerHTML = readObject01; document.getElementById('cl1').onclick = function(){ var str = document.createTextNode("1が押された"); document.getElementById('ans').appendChild(str); }; document.getElementById('cl2').onclick = function(){ var str = document.createTextNode("2が押された"); document.getElementById('ans').appendChild(str); }; document.getElementById('cl3').onclick = function(){ var str = document.createTextNode("3が押された"); document.getElementById('ans').appendChild(str); }; document.getElementById('cl4').onclick = function(){ var str = document.createTextNode("4が押された"); document.getElementById('ans').appendChild(str); }; } } httpObj1.send(''); }; に書き換えたところ、読み込んだHTMLの要素に対しても、CSSやScriptが作動しています。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問