回答編集履歴

3

メソッドチェーン記法を間違えていたので修正、var宣言の仕方について言及

2019/12/13 04:35

投稿

miyabi_pudding
miyabi_pudding

スコア9528

test CHANGED
@@ -156,7 +156,7 @@
156
156
 
157
157
  // 一回取得で止める
158
158
 
159
- let $html = $( html );
159
+ const $html = $( html );
160
160
 
161
161
  // 変数に再代入はせず、メソッドの実行だけ行う。
162
162
 
@@ -184,9 +184,9 @@
184
184
 
185
185
  function update_outline_html( html, data ){
186
186
 
187
- // 一回取得止め
187
+ // メソッドチェーンなら
188
-
188
+
189
- const $html = $( html );
189
+ const $html = $( html )
190
190
 
191
191
  .find( '.ttl' ).text( data.ttl )
192
192
 
@@ -211,3 +211,15 @@
211
211
  }
212
212
 
213
213
  ```
214
+
215
+
216
+
217
+ それと、varだったとしても、同スコープ内で、同じ変数名で、varでの再宣言は止めましょう。
218
+
219
+ メンテナンス性最悪になる上、自他共に混乱しか生みません。
220
+
221
+ やるにしても、2回目以降は、varをつけずに、再代入に留めましょう。
222
+
223
+ (別スコープなら、varで宣言し直すのはあり。ただし、varよりletの方が絶対にいい)
224
+
225
+ ※let、constがなんなのか、は、本件から外れるので、ご自身でお調べください。

2

なぜ元々のメソッドが動作しないかを追記

2019/12/13 04:35

投稿

miyabi_pudding
miyabi_pudding

スコア9528

test CHANGED
@@ -106,8 +106,108 @@
106
106
 
107
107
 
108
108
 
109
+ # 追記:update_outline_htmlがなぜ動作しないのか
110
+
111
+
112
+
109
113
  というか、そもそも、元々の`keisoku_1`は動きません。
110
114
 
111
115
  なぜなら、`.find`を実行した時点で、返ってくる値は、`.find`で見つかった要素のjQueryオブジェクトだからです。
112
116
 
113
117
  (今回の場合は`p.ttl`が入る。その後にメソッドチェーンで`.find`しているので、当然、`p.num`は見つからず、`$html`には空のjQueryオブジェクトが入ってしまう)
118
+
119
+
120
+
121
+ 下記に何が起きているか段階的に説明します。
122
+
123
+ ```javascript
124
+
125
+ // 後からデータを入れる
126
+
127
+ function update_outline_html( html, data ){
128
+
129
+ // 最初の取得は、大枠のdiv>p.ttl+p.numという構造で取得できている
130
+
131
+ var $html = $( html )
132
+
133
+ // この時点で、p.ttlの取得になる。なので、textメソッドも動く
134
+
135
+ .find( '.ttl' ).text( data.ttl )
136
+
137
+ // この時点で、"p.ttlの中"の.numと探しにいく(find)ので、当然、.numは存在しないため、失敗する
138
+
139
+ .find( '.num' ).text( data.num );
140
+
141
+ // 2回目のfindにて、要素が見つからなかったので、$htmlには、空のjQueryオブジェクトが入る
142
+
143
+ return $html[0];
144
+
145
+ }
146
+
147
+ ```
148
+
149
+ なので、下記にする必要があります。
150
+
151
+ ```javascript
152
+
153
+ // 後からデータを入れる
154
+
155
+ function update_outline_html( html, data ){
156
+
157
+ // 一回取得で止める
158
+
159
+ let $html = $( html );
160
+
161
+ // 変数に再代入はせず、メソッドの実行だけ行う。
162
+
163
+ $html.find( '.ttl' ).text( data.ttl );
164
+
165
+ $html.find( '.num' ).text( data.num );
166
+
167
+ // $htmlには、div>p.ttl+p.numが入ったままなので、その後の処理も動作する
168
+
169
+ return $html[0];
170
+
171
+ }
172
+
173
+ ```
174
+
175
+
176
+
177
+ もしくは下記です。
178
+
179
+
180
+
181
+ ```javascript
182
+
183
+ // 後からデータを入れる
184
+
185
+ function update_outline_html( html, data ){
186
+
187
+ // 一回取得で止める
188
+
189
+ const $html = $( html );
190
+
191
+ .find( '.ttl' ).text( data.ttl )
192
+
193
+ // 一回親(div)に遡る
194
+
195
+ .parent()
196
+
197
+ // divから探してるので、.numは見つかる
198
+
199
+ .find( '.num' ).text( data.num )
200
+
201
+ // 最終的に親に遡って、親を返す
202
+
203
+ .parent();
204
+
205
+
206
+
207
+ // $htmlには、div>p.ttl+p.numが入ってるので、その後の処理も動作する
208
+
209
+ return $html[0];
210
+
211
+ }
212
+
213
+ ```

1

keisoku_1がそもそも動いていない旨を記載

2019/12/13 04:29

投稿

miyabi_pudding
miyabi_pudding

スコア9528

test CHANGED
@@ -1,4 +1,4 @@
1
- テキストコントロールのみのkeisoku2には劣りますが、
1
+ テキストコントロールのみのkeisoku_2には劣りますが、
2
2
 
3
3
  バニラJSを使った方が遥かに早くなりますよ。
4
4
 
@@ -100,6 +100,14 @@
100
100
 
101
101
 
102
102
 
103
- 計測結果は、12msを計測していました。
103
+ 計測結果は、12ms前後を計測していました。
104
104
 
105
105
  質問者さんのコードだと、70ms前後なので、だいぶ早くはなっているかと。
106
+
107
+
108
+
109
+ というか、そもそも、元々の`keisoku_1`は動きません。
110
+
111
+ なぜなら、`.find`を実行した時点で、返ってくる値は、`.find`で見つかった要素のjQueryオブジェクトだからです。
112
+
113
+ (今回の場合は`p.ttl`が入る。その後にメソッドチェーンで`.find`しているので、当然、`p.num`は見つからず、`$html`には空のjQueryオブジェクトが入ってしまう)