第8回の内容
• クライアントサイド処理
• JavaScriptの基礎
クライアントサイド / サーバサイド
サーバサイド
クライアントサイド
動的なWebページ
Webブラウザ
Webサーバ
リソース生成 リソース生成 リソース生成 描画 描画 描画Webブラウザ
Webサーバ
描画 再描画 再描画 再描画動的なWebページとページ遷移
Webブラウザ
Webサーバ
リソース生成 リソース生成 リソース生成 描画 描画 描画新しいURIに遷移
サーバサイドで実現
動的なWebページとページ遷移
Webブラウザ
Webサーバ
描画 再描画 再描画 再描画URIは変わらない
クライアントサイドで実現
以前のオンライン地図
𝑥
𝑦
0 1 2 3 4
0
1
2
3
4
以前のオンライン地図
𝑥
𝑦
/map?x=2&y=20 1
2
3 4
0
1
2
3
4
以前のオンライン地図
𝑥
𝑦
0
1
2 3 4
0
1
2
3
4
/map?x=1&y=2 /map?x=2&y=2以前のオンライン地図
𝑥
𝑦
/map?x=2&y=20
1
2 3 4
0
1
2
3
4
/map?x=1&y=1以前のオンライン地図
𝑥
𝑦
/map?x=2&y=20 1 2 3 4
0
1
2
3
4
/map?x=1&y=1 /map?x=1&y=2 /map?x=1&y=3 /map?x=2&y=1 /map?x=2&y=3 /map?x=3&y=1 /map?x=3&y=2 /map?x=3&y=3以前のオンライン地図
𝑥
𝑦
/map?x=2&y=20 1 2 3 4
0
1
2
3
4
/map?x=3&y=2以前のオンライン地図
𝑥
𝑦
/map?x=3&y=20 1 2 3 4
0
1
2
3
4
/map?x=2&y=1 /map?x=2&y=2 /map?x=2&y=3 /map?x=3&y=1 /map?x=3&y=3 /map?x=4&y=1 /map?x=4&y=2 /map?x=4&y=3近年のオンライン地図
ページ遷移を伴わないWebシステム
• デスクトップアプリケーションのような操作性
• ブックマークが難しい
プラグイン
• Webブラウザの機能を拡張
Flash
Javaアプレット
PDF文書
映像・音声
Flash Player
• Flash
画像、音声、映像を組み合わせたアニメーション
マウスやキーボードでのコンテンツ制御
Flash Playerの呼び出し
<object
data
="
./sample.swf
"
type
="
application/x-shockwave-flash
"
width
="
400
"
height
="
300
">
</object>
Flashを使ったビデオ再生の例
Webサーバ
ストリーミング
サーバ
第8回 クライアントサイドの技術 放送大学 Flashで作られた ビデオプレイヤー Flash Playerの領域ヘルパーアプリケーション
• Webブラウザが対応していないスキームやメディア
タイプを扱う独立したアプリケーション
mailtoスキーム
電子メールソフト
ヘルパーアプリケーション
• Webブラウザが対応していないスキームやメディア
タイプを扱う独立したアプリケーション
mailtoスキーム
電子メールソフト
telスキーム
電話アプリケーション
audio/mp4
メディアプレイヤー
application/rtf ワープロソフト
JavaScript
• Webブラウザ上で動作するプログラムを記述
• Webブラウザが直接実行
サーバサイドとクライアントサイド
時刻
メッセージ
6~10時
おはようございます
11~16時 こんにちは
それ以外
こんばんは
Webページを表示した時刻に
よってメッセージを変える
サーバサイドで実現
Webブラウザ
Webサーバ
<html>
⋮
<p>こんにちは</p>
⋮
</html>
描画 計算・HTML生成 こんにちは ⋮ ⋮クライアントサイドで実現
Webブラウザ
Webサーバ
<html> ⋮ <script src="./greeting.js"> </script> ⋮ </html> HTML文書 window.addEventListener( "load", function() { ⋮ h = new Date().getHours(); ⋮ e.textContent = "こんにちは"; ⋮ JavaScript 計算・ 描画 こんにちは ⋮ ⋮クライアントサイドの技術
• 高度な機能
• 高度なユーザインタフェース
• Webブラウザに依存
要素型
script
<html> <head> ⋮ </head> <body> ⋮ <script>var h = new Date().getHours(); if (h >= 6 && h <= 10) alert("おはようございます"); else if (h >= 11 && h <= 16) alert("こんにちは"); else alert("こんばんは"); </script> ⋮ </body> </html>
要素型
script
<html> <head> ⋮ </head> <body> ⋮ <script>var h = new Date().getHours(); if (h >= 6 && h <= 10) alert("おはようございます"); else if (h >= 11 && h <= 16) alert("こんにちは"); else alert("こんばんは"); </script> ⋮ </body> </html> var h = new Date().getHours();
if (h >= 6 && h <= 10) alert("おはようございます"); else if (h >= 11 && h <= 16) alert("こんにちは"); else alert("こんばんは"); ./greeting.js
要素型
script
<html> <head> ⋮ </head> <body> ⋮ <script src="./greeting.js"></script> ⋮ </body> </html> var h = new Date().getHours();if (h >= 6 && h <= 10) alert("おはようございます"); else if (h >= 11 && h <= 16) alert("こんにちは"); else alert("こんばんは"); ./greeting.js
HTML文書の読み込み時の動作
• HTMLを先頭から解釈
•
script要素にたどり着くと、HTMLの解釈を一時中断して、
JavaScriptを実行
JavaScriptの実行タイミングの確認
⋮
<p><code>script</code>要素の前の段落</p>
<script>
var h = new Date().getHours(); if (h >= 6 && h <= 10) alert("おはようございます"); else if (h >= 11 && h <= 16) alert("こんにちは"); else alert("こんばんは"); </script>
<p><code>script</code>要素の後ろの段落</p> ⋮
動作例
⋮<p><code>script</code>要素の前の段落</p>
<script>
var h = new Date().getHours(); if (h >= 6 && h <= 10) alert("おはようございます"); else if (h >= 11 && h <= 16) alert("こんにちは"); else alert("こんばんは"); </script>
<p><code>script</code>要素の後ろの段落</p> ⋮
解釈済み
実行中
イベントドリブン
• ユーザーの操作や状態の変化に応じて処理を呼び出す
• 処理を呼び出す契機となるもの
⋯
イベント
• イベントに応じて呼び出される処理
⋯
イベントリスナー・イベントハンドラ
•
イベントドリブン(イベント駆動)方式
イベントリスナーの登録
① 何に対して、
② どのイベントが発生すると、
イベントリスナーの登録
window.addEventListener("load", function() {
alert("文書を読み込みました");
イベントリスナーの登録
window
.addEventListener("load", function() {
alert("文書を読み込みました");
}, false);
イベントリスナーの登録
window
.addEventListener("
load
", function() {
alert("文書を読み込みました");
}, false);
イベントの種類
対象
イベントリスナーの登録
イベントリスナー
window
.addEventListener("
load
",
function() {
alert("文書を読み込みました");
}
, false);
イベントの種類
対象
イベントリスナーの登録
① 何に対して、
② どのイベントが発生すると、
③ どのイベントリスナーを呼び出すか
① Webブラウザのウィンドウ(
window)
② 文書の読み込みが完了した(
load)
③ 「文書を読み込みました」というメッセージを表示する関数
イベントリスナーの登録
イベントリスナー
window
.addEventListener("
load
",
function() {
alert("文書を読み込みました");
}
, false);
イベントの種類
対象
HTML文書の読み込み時の動作
• HTMLを先頭から解釈
•
script要素にたどり着くと、HTMLの解釈を一時中断して、
JavaScriptを実行
• JavaScriptの実行が終わると、HTMLの解釈を再開
【第一段階】
読み込み時の処理
【第二段階】
イベントの待機
イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯ var e2 = ⋯ e1.addEventListener("click", function() { // 処理 ⋯ }, false); e2.addEventListener("mouseover", function() { // 処理 ⋯ }, false); }, false);イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯ var e2 = ⋯ e1.addEventListener("click", function() { // 処理 ⋯ }, false); e2.addEventListener("mouseover", function() { // 処理 ⋯ }, false); }, false);
イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯ var e2 = ⋯ e1.addEventListener("click", function() { // 処理 ⋯ }, false); e2.addEventListener("mouseover", function() { // 処理 ⋯ }, false); }, false);
イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯ var e2 = ⋯ e1.addEventListener("click", function() { // 処理 ⋯ }, false); e2.addEventListener("mouseover", function() { // 処理 ⋯ }, false); }, false);
イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯
var e2 = ⋯
e1.addEventListener("click", function() { // 処理 ⋯ }, false); e2.addEventListener("mouseover", function() { // 処理 ⋯ }, false); }, false); ある要素がクリックされたときの イベントリスナーを登録
イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯ var e2 = ⋯ e1.addEventListener("click", function() { // 処理 ⋯ }, false);e2.addEventListener("mouseover", function() { // 処理 ⋯
}, false);
}, false);
ある要素の上にマウスが移動した ときのイベントリスナーを登録
イベントリスナーの登録
window.addEventListener("load", function() { var e1 = ⋯ var e2 = ⋯ e1.addEventListener("click", function() { // 処理 ⋯ }, false); e2.addEventListener("mouseover", function() { // 処理 ⋯ }, false); }, false);HTML文書の読み込み時の動作
• HTMLを先頭から解釈
•
script要素にたどり着くと、HTMLの解釈を一時中断して、
JavaScriptを実行
• JavaScriptの実行が終わると、HTMLの解釈を再開
【第一段階】
読み込み時の処理
【第二段階】
イベントの待機
文書の操作
• 要素の属性の取得・変更
• 要素の内容の取得・変更
要素の選択
JavaScriptのコード
意味
document.getElementById("i1")
id属性値が「i1」の
要素
document.getElementsByName("n1")
name属性値が「n1」
の要素すべて
document.getElementsByTagName("img")
HTML文書内の
要素すべて
img
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button> HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a>
<button type="button" id="b1">アンカーの変更</button>
HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a>
<button type="button" id="b1">アンカーの変更</button> HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<button type="button" id="b1">アンカーの変更</button>
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a>
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button> HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML
window.addEventListener("load", function() {
document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML
window.addEventListener("load", function() {
document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
「アンカーの変更」ボタンを取得
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML
window.addEventListener("load", function() {
document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
クリック
「アンカーの変更」ボタンを取得
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML
window.addEventListener("load", function() {
document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
クリック
「アンカーの変更」ボタンを取得
イベントリスナー
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a>
<button type="button" id="b1">アンカーの変更</button>
HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a>
<button type="button" id="b1">アンカーの変更</button>
HTML
window.addEventListener("load", function() {
document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1");
a.setAttribute("href", "http://www.ouj.ac.jp/");
a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false);
}, false);
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a> <button type="button" id="b1">アンカーの変更</button>
HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript
文書の操作
<a href="http://www.mext.go.jp/" id="a1">文部科学省</a>
<button type="button" id="b1">アンカーの変更</button>
HTML window.addEventListener("load", function() { document.getElementById("b1").addEventListener("click", function() { var a = document.getElementById("a1"); a.setAttribute("href", "http://www.ouj.ac.jp/"); a.innerHTML = "放送大学"; a.style.fontSize = "200%"; }, false); }, false); JavaScript