teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

要素の生成について追記

2016/08/30 17:13

投稿

yamato_hikawa
yamato_hikawa

スコア2092

answer CHANGED
@@ -107,4 +107,33 @@
107
107
  };
108
108
 
109
109
  new Question();
110
- ```
110
+ ```
111
+
112
+ # 要素の生成について
113
+ 肝の部分は下記です。それ以外の部分は下記を実行する時に必要な配列(例でいうと、説明文1~3が格納されている配列)を用意するための下準備となります。
114
+
115
+ ```javascript
116
+ var target = document.getElementById('keyword');
117
+ var df = document.createDocumentFragment();
118
+
119
+ /* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/
120
+ ['説明文1', '説明文2', '説明文3'].forEach(function(item, index) {
121
+ var el = document.createElement('span');
122
+ el.id = "keyword" + index;
123
+ el.classList = "keyword";
124
+ el.innerText = item;
125
+ df.appendChild(el);
126
+ });
127
+
128
+ console.log(df);
129
+ /*
130
+ #document-fragment
131
+ <span id="keyword0" class="keyword">説明文1</span>
132
+ <span id="keyword1" class="keyword">説明文2</span>
133
+ <span id="keyword2" class="keyword">説明文3</span>
134
+ */
135
+
136
+ /* 上記生成した要素をtargetである<div id="keyword"></div>内に挿入 */
137
+ target.appendChild(df);
138
+
139
+ ```

2

微修正

2016/08/30 17:13

投稿

yamato_hikawa
yamato_hikawa

スコア2092

answer CHANGED
@@ -75,7 +75,8 @@
75
75
  keywordTextList = this.createKeywordTextArr(keys, this.KEYWORD),
76
76
  df = document.createDocumentFragment();
77
77
 
78
- /* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/ keywordTextList.forEach(function(item, index) {
78
+ /* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/
79
+ keywordTextList.forEach(function(item, index) {
79
80
  var el = document.createElement('span');
80
81
  el.id = "keyword" + index;
81
82
  el.classList = "keyword";

1

ロジック修正。ボタン追加。

2016/08/30 04:43

投稿

yamato_hikawa
yamato_hikawa

スコア2092

answer CHANGED
@@ -1,5 +1,6 @@
1
1
  ロード時に一度ランダム出題+キーワードをセットする所まで作りました。
2
2
  何らかのイベント時(ボタンを押すなど)に`this.setQuestion()`を再度実行すれば、別の問題を出題する形となります。
3
+ サンプルとして、ランダムに出題するボタンを追加しました。
3
4
 
4
5
  ```html
5
6
  <h1>問題集1</h1>
@@ -15,6 +16,8 @@
15
16
  <p id="last"></p>
16
17
  </div>
17
18
  </form>
19
+
20
+ <button id="next" class="btn">次の問題</button>
18
21
  ```
19
22
 
20
23
  ```css
@@ -43,29 +46,36 @@
43
46
  init: function() {
44
47
  this.que = document.getElementById('que');
45
48
  this.keywordList = document.getElementById('keyword');
49
+ this.btn = document.getElementById('next');
46
50
 
47
51
  // キーワードのキー部分を配列として取得
48
52
  this.keys = Object.keys(this.KEYWORD);
49
53
  this.setQuestion();
54
+ this.bindEvent();
50
55
  },
56
+ bindEvent: function() {
57
+ this.btn.addEventListener('click', this.setQuestion.bind(this), false);
58
+ },
51
59
  setQuestion: function() {
52
60
  /* 出題+キーワード表示 */
61
+ var question = this.getRandomQuestion();
53
- this.setRandomQuestion();
62
+ this.setText(question);
54
- this.setKeyword();
63
+ this.setKeyword(question);
55
64
  },
56
- setRandomQuestion: function() {
65
+ getRandomQuestion: function() {
57
66
  var num = Math.floor(Math.random() * this.Q.length);
58
67
 
59
- this.que.innerText = this.Q[num];
68
+ return this.Q[num];
60
69
  },
70
+ setText: function(text) {
71
+ this.que.innerText = text;
72
+ },
61
- setKeyword: function() {
73
+ setKeyword: function(question) {
62
- var keys = this.getKeywordList(),
74
+ var keys = this.getKeywordList(question),
63
- keywordTextList = this.createKeywordTextArr(keys, this.KEYWORD);
75
+ keywordTextList = this.createKeywordTextArr(keys, this.KEYWORD),
76
+ df = document.createDocumentFragment();
64
77
 
65
- var df = document.createDocumentFragment();
66
-
67
- /* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/
78
+ /* <span id="keyword1" class="keyword">テキスト</span> の形でセットする*/ keywordTextList.forEach(function(item, index) {
68
- keywordTextList.forEach(function(item, index) {
69
79
  var el = document.createElement('span');
70
80
  el.id = "keyword" + index;
71
81
  el.classList = "keyword";
@@ -73,17 +83,17 @@
73
83
  df.appendChild(el);
74
84
  });
75
85
 
86
+ this.keywordList.innerHTML = '';
76
87
  this.keywordList.appendChild(df);
77
88
  },
78
- getKeywordList: function() {
89
+ getKeywordList: function(question) {
79
90
  // 問題文に含まれるキーワードのみを抽出した配列を作成。
80
- var text = this.que.innerText,
81
- matchArr = this.keys.map(function(item) {
91
+ var matchArr = this.keys.map(function(item) {
82
- var result = text.match(item) || []
92
+ var result = question.match(item) || []
83
- return result[0];
93
+ return result[0];
84
- }).filter(function(item) {
94
+ }).filter(function(item) {
85
- return item;
95
+ return item;
86
- });
96
+ });
87
97
 
88
98
  return matchArr;
89
99
  },