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

回答編集履歴

3

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

2019/12/13 04:35

投稿

miyabi_pudding
miyabi_pudding

スコア9559

answer CHANGED
@@ -77,7 +77,7 @@
77
77
  // 後からデータを入れる
78
78
  function update_outline_html( html, data ){
79
79
  // 一回取得で止める
80
- let $html = $( html );
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

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

2019/12/13 04:35

投稿

miyabi_pudding
miyabi_pudding

スコア9559

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がそもそも動いていない旨を記載

2019/12/13 04:29

投稿

miyabi_pudding
miyabi_pudding

スコア9559

answer CHANGED
@@ -1,4 +1,4 @@
1
- テキストコントロールのみのkeisoku2には劣りますが、
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オブジェクトが入ってしまう)