回答編集履歴
3
メソッドチェーン記法を間違えていたので修正、var宣言の仕方について言及
test
CHANGED
@@ -156,7 +156,7 @@
|
|
156
156
|
|
157
157
|
// 一回取得で止める
|
158
158
|
|
159
|
-
|
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
なぜ元々のメソッドが動作しないかを追記
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がそもそも動いていない旨を記載
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オブジェクトが入ってしまう)
|