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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

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

HTML

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

Q&A

解決済

2回答

3279閲覧

javascriptでhtmlのタグを作成したい。

michiaki

総合スコア29

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

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

HTML

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

0グッド

0クリップ

投稿2016/08/29 10:35

編集2016/08/30 10:39

###前提・実現したいこと
javascriptにてHTMLにて作成して、ブラウザで反映させたいです。

まず文字変換jsにて問題を作成、解説したいものをkeywordとして登録し、問題文にそのkeywordが含まれて
いる場合は、自動で変換し、HTMLに表示させる。
文字変換用jsにて keywordと問題文を作成。

HTMLに反映させるjsでinnerHTMLにてブラウザに表示。(innerHTMLを使えば反映されると考えてます。)

CSSで文字の色を変化させたいです。

別にこの形式にこだわりがなく、もっといい方法があればご教授願います。

###発生している問題・エラーメッセージ

うまく反映できないです。タグの部分は表示されています。

###該当のソースコード

javascript

1------------------------------------文字変換用js---------------------------------------------- 2 var str_q = new String(); 3 var str_exca_a = new String(); 4 var str_miss_a = new String(); 5 var i = 0; 6 var keystart = null; 7 var keyend = null; 8 key1start ="<span id=\"keyword1\">"; 9 key2start ="<span id=\"keyword2\">"; 10 keyend ="</span>"; 11 12var keyword = { 13 徐行:key1start + "徐行(すぐに停止できる速度:何kmとかはない)" + keyend, 14 車両横断禁止:"車両横断禁止(しゃりょうおうだんきんし)", 15 緊急自動車:"緊急自動車(きんきゅうじどうしゃ:パトカー、救急車、消防車)" 16}; 17 18function keyword_replace(i) { 19 var str_q = q[i]; 20 21 str_q = str_q.replace("徐行",keyword.徐行); 22 str_q = str_q.replace("車両横断禁止",keyword.車両横断禁止); 23 str_q = str_q.replace("緊急自動車",keyword.緊急自動車); 24 q[i] = str_q; 25 var str_exac_a = exac_a[i]; 26 str_exac_a = str_exac_a.replace("徐行",keyword.徐行); 27 str_exac_a = str_exac_a.replace("車両横断禁止",keyword.車両横断禁止); 28 str_exac_a = str_exac_a.replace("緊急自動車",keyword.緊急自動車); 29 exac_a[i] =str_exac_a ; 30 31 var str_miss_a = miss_a[i]; 32 str_miss_a = str_miss_a.replace("徐行",keyword.徐行); 33 str_miss_a = str_miss_a.replace("車両横断禁止",keyword.車両横断禁止); 34 str_miss_a = str_miss_a.replace("緊急自動車",keyword.緊急自動車); 35 miss_a[i] = str_miss_a; 36} 37------------------------------------------HTML反映部分のjavascript-------------------------- 38 document.getElementById('que').innerHTML = q[i]; //test_1.jsの配列をそのまま取り込む 39 //問題の配置をランダムにする。 40 rand = Math.floor(Math.random() * 9); 41 judge = rand % 2; 42 //console.log("rand:"+rand); 43 //console.log("judge:"+judge); 44 if (judge == 0) { 45 document.getElementById('choice1').nextSibling.nodeValue = exac_a[i]; //同上 46 document.getElementById('choice2').nextSibling.nodeValue = miss_a[i]; //同上 47 } else if (judge == 1) { 48 document.getElementById('choice1').nextSibling.nodeValue = miss_a[i]; //同上 49 document.getElementById('choice2').nextSibling.nodeValue = exac_a[i]; //同上 50 //document.querySelector('label[for="choice1"]').innerHTML="選択肢B"; 51 } 52---------------------------------------------問題文.js(追加)--------------------------------- 53var q = new Array(); 54var miss_a = new Array(); 55var exac_a = new Array(); 56 57q[0] = "1:交差点内を徐行しているとき、緊急自動車が近づいてきたので直ちに交差点内で徐行した。"; 58exac_a[0] = "○:緊急自動車が入ってきた場合の交差点内での停止は事故を起こす可能性が高まるので、交差点を避け、事故の起こりにくい道路の左側に寄って一時停止をする"; 59miss_a[0] = "×:交差点内を通行しているとき緊急自動車が近づいてきたので直ちに交差点内で徐行した"; 60 61q[1] = "2:原動機自転車においてブレーキをかける場合は、ハンドルを切っていない状態で車体が傾いていないときには前後輪のブレーキを同時にかけるのがよい。"; 62exac_a[1] = "○:前後輪のブレーキを同時にかけるのが基本であるので、転倒の危険が問題がない場合は、ブレーキは同時にかけるべきである。"; 63miss_a[1] = "×:ブレーキの前後輪の同時使用は、条件を満たした場合にかけるのが、基本であるが危険時だけであり、極力使用せず、基本的には後輪のみのほうがよい。"; 64 65q[2] = "3:車両横断禁止の標識があったが道路の左側にある自分の車庫に入るため左に横断した。"; 66exac_a[2] = "○:左折を伴う道路の横断は、道路交通法上認められています"; 67miss_a[2] = "×:車両横断禁止の標識がある場所では、横断が禁止である。"; 68 69q[3] = "4:黄色の杖を持っている歩行者がいるときは、必ず警音器を鳴らさなければならない"; 70exac_a[3] = "○:杖使用者は弱視又は全盲者が用いるため、急な対応が難しく警音器のみの警告ではなく、一時停止か徐行を行う。"; 71miss_a[3] = "×:黄色の杖を持つ歩行者には、最大限注意を促す必要があるため、警音器まで鳴らすべきである。"; 72 73q[4] = "5.上り坂の頂上付近徐行の標識がなくても徐行しなくてはならない。"; 74exac_a[4]= "○:標識がなくても元々見通しが悪いため、徐行しなければならない"; 75miss_a[4]= "×:標識がないので、必ずしも徐行する必要がない"; 76

HTML

1------------------------------------------文字表示のHTML部分---------------------------------- 2 <h1>問題集1</h1> 3 <p id="que">ここに問題が表示されます</p> 4 <form id="radiobuttom"> 5 <div> 6 <input id="choice1" type="radio" name="choice" >○○○<br> 7 <input id="choice2" type="radio" name="choice" >×××<br> 8 <input type="button" value="回答する" onclick="button_click();"> 9 <input type="button" value="終了" onclick="end_study(4);"> 10 <p id="answer"></p> 11 <p id="last"></p> 12 </div> 13 </form>

css

1.keyword1{ 2 color:#ff0000; 3}

###試したこと

ブラウザには<span id="keyword1">文字列</id>で表示されていますが、文字列で表示されています。

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

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

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

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

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

yamato_hikawa

2016/08/30 01:36

qという変数を何気なく使っているが定義が見当たらない。 差し支えなければ問題文のサンプル(テスト用でいいので)がほしいです。
michiaki

2016/08/30 10:40

qはC言語のExtern的に使用しており、問題文にて定義しておりました。 修正いたしました。
guest

回答2

0

ベストアンサー

ロード時に一度ランダム出題+キーワードをセットする所まで作りました。
何らかのイベント時(ボタンを押すなど)にthis.setQuestion()を再度実行すれば、別の問題を出題する形となります。
サンプルとして、ランダムに出題するボタンを追加しました。

html

1<h1>問題集1</h1> 2<p id="que"></p> 3<div id="keyword"></div> <!-- キーワード説明用領域を作っておく --> 4<form id="radiobuttom"> 5 <div> 6 <input id="choice1" type="radio" name="choice">○○○<br> 7 <input id="choice2" type="radio" name="choice">×××<br> 8 <input type="button" value="回答する" onclick="button_click();"> 9 <input type="button" value="終了" onclick="end_study(4);"> 10 <p id="answer"></p> 11 <p id="last"></p> 12 </div> 13</form> 14 15<button id="next" class="btn">次の問題</button>

css

1.keyword { 2 color: #ff0000; 3}

javascript

1var Question = function() { 2 this.init(); 3}; 4 5Question.prototype = { 6 KEYWORD: { 7 徐行: "徐行(すぐに停止できる速度:何kmとかはない)", 8 車両横断禁止: "車両横断禁止(しゃりょうおうだんきんし)", 9 緊急自動車: "緊急自動車(きんきゅうじどうしゃ:パトカー、救急車、消防車)" 10 }, 11 Q: [ 12 '徐行テスト', 13 '徐行、車両横断禁止', 14 '緊急自動車と徐行', 15 '徐行・緊急自動車・車両横断禁止' 16 ], 17 init: function() { 18 this.que = document.getElementById('que'); 19 this.keywordList = document.getElementById('keyword'); 20 this.btn = document.getElementById('next'); 21 22 // キーワードのキー部分を配列として取得 23 this.keys = Object.keys(this.KEYWORD); 24 this.setQuestion(); 25 this.bindEvent(); 26 }, 27 bindEvent: function() { 28 this.btn.addEventListener('click', this.setQuestion.bind(this), false); 29 }, 30 setQuestion: function() { 31 /* 出題+キーワード表示 */ 32 var question = this.getRandomQuestion(); 33 this.setText(question); 34 this.setKeyword(question); 35 }, 36 getRandomQuestion: function() { 37 var num = Math.floor(Math.random() * this.Q.length); 38 39 return this.Q[num]; 40 }, 41 setText: function(text) { 42 this.que.innerText = text; 43 }, 44 setKeyword: function(question) { 45 var keys = this.getKeywordList(question), 46 keywordTextList = this.createKeywordTextArr(keys, this.KEYWORD), 47 df = document.createDocumentFragment(); 48 49 /* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/ 50 keywordTextList.forEach(function(item, index) { 51 var el = document.createElement('span'); 52 el.id = "keyword" + index; 53 el.classList = "keyword"; 54 el.innerText = item; 55 df.appendChild(el); 56 }); 57 58 this.keywordList.innerHTML = ''; 59 this.keywordList.appendChild(df); 60 }, 61 getKeywordList: function(question) { 62 // 問題文に含まれるキーワードのみを抽出した配列を作成。 63 var matchArr = this.keys.map(function(item) { 64 var result = question.match(item) || [] 65 return result[0]; 66 }).filter(function(item) { 67 return item; 68 }); 69 70 return matchArr; 71 }, 72 createKeywordTextArr: function(arr, keyword) { 73 // 問題文に含まれるキーワードの配列を元に、キーワード全体から必要な説明文だけを抽出 74 return arr.map(function(item) { 75 return keyword[item]; 76 }); 77 } 78}; 79 80new Question();

要素の生成について

肝の部分は下記です。それ以外の部分は下記を実行する時に必要な配列(例でいうと、説明文1~3が格納されている配列)を用意するための下準備となります。

javascript

1var target = document.getElementById('keyword'); 2var df = document.createDocumentFragment(); 3 4/* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/ 5['説明文1', '説明文2', '説明文3'].forEach(function(item, index) { 6 var el = document.createElement('span'); 7 el.id = "keyword" + index; 8 el.classList = "keyword"; 9 el.innerText = item; 10 df.appendChild(el); 11}); 12 13console.log(df); 14/* 15#document-fragment 16<span id="keyword0" class="keyword">説明文1</span> 17<span id="keyword1" class="keyword">説明文2</span> 18<span id="keyword2" class="keyword">説明文3</span> 19*/ 20 21/* 上記生成した要素をtargetである<div id="keyword"></div>内に挿入 */ 22target.appendChild(df); 23

投稿2016/08/30 02:43

編集2016/08/30 17:13
yamato_hikawa

総合スコア2092

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

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

michiaki

2016/08/30 14:11

まだ勉強はじめてから時間が経っていないので、理解に時間がかかりそうです。
yamato_hikawa

2016/08/30 14:46 編集

this.queにはどんな値が入ってるのかな、と言ったことをconsole.logで確認していただければなと思います。 処理ごとに関数を分けているので、使えそうな部分だけ抜き出して試してみるのもいいです。
michiaki

2016/08/31 11:39

丁寧なご回答ありがとうございます。ここまで色々なテクニックや手法を教えて頂き誠にありがとうございます。少し時間がかかりそうなので、詳しくコード書いていただいたyamato_hikawa様をベストアンサーにさせて頂きます。
guest

0

この部分でテキストノードのnodeValueに対して代入しているので、HTMLが自動的にエスケープされて表示されてしまっています。

JavaScript

1if (judge == 0) { 2 document.getElementById('choice1').nextSibling.nodeValue = exac_a[i]; //同上 3 document.getElementById('choice2').nextSibling.nodeValue = miss_a[i]; //同上 4} else if (judge == 1) { 5 document.getElementById('choice1').nextSibling.nodeValue = miss_a[i]; //同上 6 document.getElementById('choice2').nextSibling.nodeValue = exac_a[i]; //同上 7 //document.querySelector('label[for="choice1"]').innerHTML="選択肢B"; 8}

しかしテキストノードはinnerHTMLプロパティを持ちません。なので、テキストノードを直接操作するのではなく、操作したい部分を<span>タグで囲っておくといいと思います。

つまり、HTMLを次のようにして、

HTML

1<h1>問題集1</h1> 2<p id="que">ここに問題が表示されます</p> 3<form id="radiobuttom"> 4 <div> 5 <input id="choice1" type="radio" name="choice" ><span id="text1">○○○</span><br> 6 <input id="choice2" type="radio" name="choice" ><span id="text2">×××</span><br> 7 <input type="button" value="回答する" onclick="button_click();"> 8 <input type="button" value="終了" onclick="end_study(4);"> 9 <p id="answer"></p> 10 <p id="last"></p> 11 </div> 12</form>

JavaScriptを次のようにするといいと思います。

JavaScript

1if (judge == 0) { 2 document.getElementById('text1').innerHTML = exac_a[i]; 3 document.getElementById('text2').innerHTML = miss_a[i]; 4} else if (judge == 1) { 5 document.getElementById('text1').innerHTML = miss_a[i]; 6 document.getElementById('text2').innerHTML = exac_a[i]; 7}

投稿2016/08/29 17:31

MakeNowJust

総合スコア545

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

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

michiaki

2016/08/30 10:42

この指摘は過去の質問でもたくさんの方に指摘いただいております。 やっぱりその方が自然なんですね。まだまだ勉強が足りません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問