質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Highcharts

HighchartはHTML、SVG、VMLを使ったJavascriptの描写用ライブラリです。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

480閲覧

Highchartsのscriptをheadに書く理由

cometbeet

総合スコア21

Highcharts

HighchartはHTML、SVG、VMLを使ったJavascriptの描写用ライブラリです。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/12/12 07:17

編集2018/12/13 00:17

本文

初歩的なことですが質問させていただきます。
最近ブラウザでグラフを表示しようと調べてHighchartsというのを見つけました。
あるサイトで出てくるプログラムだとjQuery.jsやHighcharts.jsをheadタグ内で読んでいました。
グラフを描画するjsはbodyタグ内で読んでいるのですがどうしてこのように分けているのでしょうか。
描画を早くするためにJavascriptはbody内の一番下に書くというのを見たのですがこれは例外なのでしょうか。
よろしくお願いします。

サイトのURL

https://yubais.net/doc/highcharts/introduction.html#id2

プログラム

<!DOCTYPE html> <html> <head> <meta charset=utf-8> <script type="text/javascript" src='http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js'></script> <script type="text/javascript" src="js/highcharts.js"></script> </head> <body> <div id='container'></div> <script type="text/javascript"> var chart; function draw() { // グラフオプションを指定 var options = { // 出力先を指定 chart :{renderTo : "container"}, // データ系列を作成 series: [{name: "pi", data: [3,1,4,1,5]}] } // グラフを作成 chart = new Highcharts.Chart(options); } // ページがロードされた後に、グラフを出力する document.body.onload = draw(); </script> </body> </html>

追記内容

サイトに表示されていたコード、サイトのURL、タグを追記、本文を修正しました。
あと現在HighChartsを使う際にjQueryは必要ないそうです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/12/12 07:59

具体的なコード例をご提示ください。
m.ts10806

2018/12/12 08:02

それか、プラグインの公式のURLでも可です。ただ、記述場所をかえてみたり順番をかえてみたりで色々とご自身でも検証してみてください
m.ts10806

2018/12/12 08:03

また「初心者アイコン」をご活用ください。「初心者」自体は質問要件ではありませんのでタイトルや本文に含まない方が回答する側としてはありがたいです
m.ts10806

2018/12/12 12:42

回答はしたのですが、質問は編集できるので適宜追記してください。 コード例とURLと初心者アイコンとタグですね。
guest

回答1

0

ベストアンサー

名前そのままで出てきたものを前提で話を進めます。
最新バージョン7.0.0ですかね。

デモのプログラムだとjQuery.jsやHighcharts.jsをheadタグ内で読んでいました。

ダウンロードしたセット内のDemoをいくつか見ましたが、<head></head>内に双方を読んでいるものはなかったですね。
もしかしたらこの質問のような例を見られたんでしょうか。

さて、本題ですが、
すごく簡単なコードを例示します。

html

1<head> 2<script> 3function test1(){ 4 alert("1"); 5} 6</script> 7</head> 8<body> 9<script> 10test1(); 11test2(); 12</script> 13 14<script> 15function test2(){ 16 alert("2"); 17} 18</script> 19 20</body>

このコード実行するとアラートで「1」と表示されて終わります。
ブラウザ開発ツールのコンソールを見ているとエラーが出ていると思います。
「test2は未定義である」という旨の。

これがなぜか分かりますでしょうか?

プログラムは基本的に上から順に実行されていきます。
JavaScriptも例に漏れず。
function(以降「関数」)はその上から順に通ったときに「定義された」とプログラム上は認識されます。

つまり、上記コードのtest2()が書いてある箇所を通る時点では関数test2()は定義されていません。
そのためのエラーとなります。

プラグインでも同じことが言えます。
定義されたと認識されていない関数は実行できないわけです。
試しに、プラグインの読み込み記述とプラグインの実行記述をhtml上で逆に書いてみてください。
実行記述のところで同じように未定義である旨のエラーが出るはずです。

ということで、すごく乱暴に言えば、下記のような順番になっていればどこに書いても実行はされるということになります。

jQuery ↓ プラグイン本体js ↓ 実行記述

※この順番はjQueryプラグインを利用する場合、例に漏れずです

headにjQuery,プラグイン本体jsの読み込み記述を書き、
実行記述をbodyの中に書くのはおそらく「変更がないもの」と「変更が起きるもの、ユーザーが自分で書くもの」を分けたいからではないでしょうか(あくまで想像)

描画を早くするためにJavascriptはbody内の一番下に書くというのを見たのですが

「body内の一番下」というより「</body>の直前」と覚えたほうが間違えないように済むと思いますが、そこはきちんと記事を読み込んだほうがいいかもしれません。

ここで先に述べた「プログラムは基本的に上から順に実行されていきます」が生きてくるわけですね。
ブラウザにとってはhtmlをレンダリングする(解釈して画面上に表示する)というのが最も時間がかかる(パワーを使う)処理となります。
その途中でJavaScriptの定義や処理が書いてあると、中断することにもなりますので、画面描画に時間がかかる・・・ということになります。
もしJavaScriptでhtmlに変更を及ぼすような処理が書いてあった場合、読み込みが終わってなければ存在しない要素へのアプローチとなり、正しく動きません(もちろんJavaScript側で「ロード後に処理する」と書いてあれば問題にはなりません)

ということで、諸々含めると下記の順番で</body>の直前に書けば効率的に間違いなく動作する、ということです。

jQuery ↓ プラグイン本体js ↓ 実行記述

タイトルは「HighChatsの」とありますが、JavaScriptを利用する場合は必ずこの順番を守る必要があります。関数でも変数でも定義が先です。

蛇足:
teratailにはHighCharts用のタグがあるようです。
今後使っていくのであれば大いに参考にしていってください(あと願わくばこの質問からでもタグ付けておいてください)

投稿2018/12/12 12:42

編集2018/12/12 12:47
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cometbeet

2018/12/13 00:28

詳しい回答、そして参考サイトのリンクまでつけてくださりありがとうございます。 なるほど先に定義して使用するためにhead に書かれていたんですね。 ということはコードがわかりづらくなるかもしれませんがbody内で先に読まれるようにしておけば実行される内容は同じということでいいんでしょうか?
m.ts10806

2018/12/13 00:32

いえ。 そうなると下記に引っ掛かる可能性が出てきます。 > JavaScriptでhtmlに変更を及ぼすような処理が書いてあった場合 ほとんどのプラグインはhtmlに後から何かしらの変更を加えるものですので、もちろんDocument.readyで囲って実行記述を書くのも良いですが、確実に実行させるには</body>の直前にまとめるのが分かりやすくなるという話ですね。
cometbeet

2018/12/14 01:18

確かに要所要所で出てくるよりまとまっていたほうがわかりやすいですね。 返答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問