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

回答編集履歴

2

追記)

2020/07/30 08:30

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
File without changes

1

追記)

2020/07/30 08:30

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  ``HTML`` の ``HEAD`` に書く ``document.querySelectorAll(`.table1`)`` は **null** になるはずです。
2
2
 
3
- ```javascript
3
+ ```HTML
4
4
  <script lang="javascript" type="text/javascript">
5
5
  var tables = document.querySelectorAll('.table1');
6
6
  console.log( tables ); // null
@@ -9,4 +9,30 @@
9
9
  ```
10
10
  次のいずれかを試してください。
11
11
  1. ``DOMContentLoaded`` 以降で実行するように書き換える。
12
- 2. ``script``を ``body.lastChild`` に置く。
12
+ 2. ``script``を ``body.lastChild`` に置く。
13
+
14
+ 追記)
15
+
16
+ **1. DOMContentLoaded を使う**
17
+ ```HTML
18
+ <script lang="javascript" type="text/javascript">
19
+ window.addEventListener("DOMContentLoaded", function(){
20
+ Stickyfill.add( document.querySelectorAll('.table1') );
21
+ });
22
+ </script>
23
+ ```
24
+ JavaScriptは ``<script>`` が読まれた直後に実行しますが、一部のAPIはすぐに使えません。
25
+ 1. DOM操作用の機能: HTML全体が読み込みを終了してから利用可能になる(``DOMContentLoaded``)
26
+ 2. HTML5APIの機能: 表示するページ用に初期化が終わて利用可能になる(``load``)
27
+
28
+ ※噛み砕いた説明ですので、**DOM操作用の機能**や**HTML5APIの機能**は正式な分類名ではありません。
29
+
30
+ **2. BODYの最後に置く**
31
+
32
+ ```HTML
33
+ <script lang="javascript" type="text/javascript">
34
+ Stickyfill.add( document.querySelectorAll('.table1') );
35
+ </script>
36
+ </body>
37
+ ```
38
+ HTML文書は、それぞれのタグが、親子、兄弟のように表現されますが、それぞれの誕生順でJavaScriptから操作できるようになります。この特徴を活かして``<script>``要素を後から書くようにすると、DOM操作(``document.querySelectorAll()``もそのひとつ) を使って、要素に対する操作ができるようになります。