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

回答編集履歴

2

追記した内容の意図が解りにくかったので説明を変更・コメントで指摘いただいた内容を反映

2015/08/18 07:05

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

answer CHANGED
@@ -31,14 +31,16 @@
31
31
  ---
32
32
 
33
33
  [追記]
34
+ > 逆にBodyタグ最後でJSファイルを読み込むことによるデメリットってあるんでしょうか?
34
35
  HTMLのレンダリングが完了する前に何かjsを動かしておきたいというような事があれば、bodyの閉じタグ前より先にスクリプトタグを書いておかなければ意図したとおり動作しないかと思います。
35
36
 
36
37
  下の例では`writeImage.js`のある位置にもともとあったかのようにimgタグが追加されます。
38
+ HTMLがレンダリングされてから画像1の前にjavascriptで画像を追加すると一瞬表示がガタッとなってしまうかもしれません。これが嫌だ!というような場合はHTMLのレンダリングをブロックさせてでもスクリプトを実行させるメリットは有るかもしれません。
37
39
  ```html
38
40
  <body>
39
41
  <script src="writeImage.js"></script>
40
42
  <div>
41
- <img src="http://dic.nicovideo.jp/oekaki/663056.png">
43
+ <img alt="画像1" src="http://dic.nicovideo.jp/oekaki/663056.png">
42
44
  </div>
43
45
  </body>
44
46
  ```
@@ -50,5 +52,14 @@
50
52
  img.src = url;
51
53
  d.getElementsByTagName('body').item(0).appendChild(img);
52
54
  ```
55
+ メリットとは別の先に書いていた`async`との違いも試してみるとこが出来ます。
53
- 逆に`<script src="writeImage.js" async></script>`としてみてください。
56
+ `<script src="writeImage.js" async></script>`としてみてください。
54
- 必ずしも追加される画像がの表示されるわけではなくなると思います。
57
+ `async`はHTMLのレンダリングをブロックしませんので、必ずしも追加される画像が画像1上に表示されるではなくなる事が確かめられると思います。
58
+
59
+
60
+ 最近のTwitterとかはてなとかの埋め込みscriptタグはasync付きのものが多いですが、
61
+ コメントでご指摘頂いております通り、`async`の方法は下記に注意する必要があります。
62
+ > “async”(非同期)はIE 8/9, Android 2.2/2.3.といった、いくつかの前の型のブラウザに対応していません。
63
+
64
+ [参考]
65
+ [JavaScriptの読み込みにおける非同期スクリプト注入の悪影響](http://postd.cc/script-injected-async-scripts-considered-harmful/)

1

サンプル追加

2015/08/18 07:05

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

answer CHANGED
@@ -26,4 +26,29 @@
26
26
  ですので、使用するjQueryなどのライブラリも1つのファイルにまとめる。もしくは、他のjavascriptファイルに依存しないファイルであれば`async`属性を使えばhead内に記述しても、レンダリングをブロックしてしまうということはありません。
27
27
 
28
28
  [参考]
29
- [async属性で簡単!非同期でjsを読み込みレンダリングを速くしよう](http://www.aiship.jp/knowhow/archives/20559)
29
+ [async属性で簡単!非同期でjsを読み込みレンダリングを速くしよう](http://www.aiship.jp/knowhow/archives/20559)
30
+
31
+ ---
32
+
33
+ [追記]
34
+ HTMLのレンダリングが完了する前に何かjsを動かしておきたいというような事があれば、bodyの閉じタグ前より先にスクリプトタグを書いておかなければ意図したとおり動作しないかと思います。
35
+
36
+ 下の例では`writeImage.js`のある位置にもともとあったかのようにimgタグが追加されます。
37
+ ```html
38
+ <body>
39
+ <script src="writeImage.js"></script>
40
+ <div>
41
+ <img src="http://dic.nicovideo.jp/oekaki/663056.png">
42
+ </div>
43
+ </body>
44
+ ```
45
+ ```javascript
46
+ // writeImage.js
47
+ var d = document;
48
+ var url = 'http://cdn-ak.b.st-hatena.com/entryimage/236933222-origin-1419307828.jpg';
49
+ var img = d.createElement('img');
50
+ img.src = url;
51
+ d.getElementsByTagName('body').item(0).appendChild(img);
52
+ ```
53
+ 逆に`<script src="writeImage.js" async></script>`としてみてください。
54
+ 必ずしも追加される画像が先の表示されるわけではなくなるとお思います。