回答編集履歴
3
メソッドチェーン記法を間違えていたので修正、var宣言の仕方について言及
answer
CHANGED
@@ -77,7 +77,7 @@
|
|
77
77
|
// 後からデータを入れる
|
78
78
|
function update_outline_html( html, data ){
|
79
79
|
// 一回取得で止める
|
80
|
-
|
80
|
+
const $html = $( html );
|
81
81
|
// 変数に再代入はせず、メソッドの実行だけ行う。
|
82
82
|
$html.find( '.ttl' ).text( data.ttl );
|
83
83
|
$html.find( '.num' ).text( data.num );
|
@@ -91,8 +91,8 @@
|
|
91
91
|
```javascript
|
92
92
|
// 後からデータを入れる
|
93
93
|
function update_outline_html( html, data ){
|
94
|
-
//
|
94
|
+
// メソッドチェーンでやるなら
|
95
|
-
const $html = $( html )
|
95
|
+
const $html = $( html )
|
96
96
|
.find( '.ttl' ).text( data.ttl )
|
97
97
|
// 一回親(div)に遡る
|
98
98
|
.parent()
|
@@ -104,4 +104,10 @@
|
|
104
104
|
// $htmlには、div>p.ttl+p.numが入ってるので、その後の処理も動作する
|
105
105
|
return $html[0];
|
106
106
|
}
|
107
|
-
```
|
107
|
+
```
|
108
|
+
|
109
|
+
それと、varだったとしても、同スコープ内で、同じ変数名で、varでの再宣言は止めましょう。
|
110
|
+
メンテナンス性最悪になる上、自他共に混乱しか生みません。
|
111
|
+
やるにしても、2回目以降は、varをつけずに、再代入に留めましょう。
|
112
|
+
(別スコープなら、varで宣言し直すのはあり。ただし、varよりletの方が絶対にいい)
|
113
|
+
※let、constがなんなのか、は、本件から外れるので、ご自身でお調べください。
|
2
なぜ元々のメソッドが動作しないかを追記
answer
CHANGED
@@ -52,6 +52,56 @@
|
|
52
52
|
計測結果は、12ms前後を計測していました。
|
53
53
|
質問者さんのコードだと、70ms前後なので、だいぶ早くはなっているかと。
|
54
54
|
|
55
|
+
# 追記:update_outline_htmlがなぜ動作しないのか
|
56
|
+
|
55
57
|
というか、そもそも、元々の`keisoku_1`は動きません。
|
56
58
|
なぜなら、`.find`を実行した時点で、返ってくる値は、`.find`で見つかった要素のjQueryオブジェクトだからです。
|
57
|
-
(今回の場合は`p.ttl`が入る。その後にメソッドチェーンで`.find`しているので、当然、`p.num`は見つからず、`$html`には空のjQueryオブジェクトが入ってしまう)
|
59
|
+
(今回の場合は`p.ttl`が入る。その後にメソッドチェーンで`.find`しているので、当然、`p.num`は見つからず、`$html`には空のjQueryオブジェクトが入ってしまう)
|
60
|
+
|
61
|
+
下記に何が起きているか段階的に説明します。
|
62
|
+
```javascript
|
63
|
+
// 後からデータを入れる
|
64
|
+
function update_outline_html( html, data ){
|
65
|
+
// 最初の取得は、大枠のdiv>p.ttl+p.numという構造で取得できている
|
66
|
+
var $html = $( html )
|
67
|
+
// この時点で、p.ttlの取得になる。なので、textメソッドも動く
|
68
|
+
.find( '.ttl' ).text( data.ttl )
|
69
|
+
// この時点で、"p.ttlの中"の.numと探しにいく(find)ので、当然、.numは存在しないため、失敗する
|
70
|
+
.find( '.num' ).text( data.num );
|
71
|
+
// 2回目のfindにて、要素が見つからなかったので、$htmlには、空のjQueryオブジェクトが入る
|
72
|
+
return $html[0];
|
73
|
+
}
|
74
|
+
```
|
75
|
+
なので、下記にする必要があります。
|
76
|
+
```javascript
|
77
|
+
// 後からデータを入れる
|
78
|
+
function update_outline_html( html, data ){
|
79
|
+
// 一回取得で止める
|
80
|
+
let $html = $( html );
|
81
|
+
// 変数に再代入はせず、メソッドの実行だけ行う。
|
82
|
+
$html.find( '.ttl' ).text( data.ttl );
|
83
|
+
$html.find( '.num' ).text( data.num );
|
84
|
+
// $htmlには、div>p.ttl+p.numが入ったままなので、その後の処理も動作する
|
85
|
+
return $html[0];
|
86
|
+
}
|
87
|
+
```
|
88
|
+
|
89
|
+
もしくは下記です。
|
90
|
+
|
91
|
+
```javascript
|
92
|
+
// 後からデータを入れる
|
93
|
+
function update_outline_html( html, data ){
|
94
|
+
// 一回取得で止める
|
95
|
+
const $html = $( html );
|
96
|
+
.find( '.ttl' ).text( data.ttl )
|
97
|
+
// 一回親(div)に遡る
|
98
|
+
.parent()
|
99
|
+
// divから探してるので、.numは見つかる
|
100
|
+
.find( '.num' ).text( data.num )
|
101
|
+
// 最終的に親に遡って、親を返す
|
102
|
+
.parent();
|
103
|
+
|
104
|
+
// $htmlには、div>p.ttl+p.numが入ってるので、その後の処理も動作する
|
105
|
+
return $html[0];
|
106
|
+
}
|
107
|
+
```
|
1
keisoku_1がそもそも動いていない旨を記載
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
テキストコントロールのみの
|
1
|
+
テキストコントロールのみのkeisoku_2には劣りますが、
|
2
2
|
バニラJSを使った方が遥かに早くなりますよ。
|
3
3
|
`createDocumentFragment`と、`createElement`を使っていく方法です。
|
4
4
|
|
@@ -49,5 +49,9 @@
|
|
49
49
|
}
|
50
50
|
```
|
51
51
|
|
52
|
-
計測結果は、12msを計測していました。
|
52
|
+
計測結果は、12ms前後を計測していました。
|
53
|
-
質問者さんのコードだと、70ms前後なので、だいぶ早くはなっているかと。
|
53
|
+
質問者さんのコードだと、70ms前後なので、だいぶ早くはなっているかと。
|
54
|
+
|
55
|
+
というか、そもそも、元々の`keisoku_1`は動きません。
|
56
|
+
なぜなら、`.find`を実行した時点で、返ってくる値は、`.find`で見つかった要素のjQueryオブジェクトだからです。
|
57
|
+
(今回の場合は`p.ttl`が入る。その後にメソッドチェーンで`.find`しているので、当然、`p.num`は見つからず、`$html`には空のjQueryオブジェクトが入ってしまう)
|