HTML5で追加されたAPI(HTML)
HTML5で追加されたJavaScriptのAPIについて
虫食いで勉強していたものの、
差分だけでは追いつかない…
アレもコレも知らない…!(焦)
というのが実情だったので、まとめ。
(1)Web Storage
これについては、まとめていました↓
(2)File API
JavaScriptで、ユーザのローカル環境保存ファイルを
直接参照、編集できる。
ただし、HTML上の「FileReader」イベントで
操作対象ファイルがあらかじめ読み取られる(選択されている)
ことが前提。セキュリティ的な意味で。
実際はこんな感じ。
(下記は拝借したもので、詳細は出典を参照。)
(HTML)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>FileReader</title>
</head>
<body>
<p>選択できるファイルはJPEG画像ファイルです。<br>
<input type="file" id="file"></p>
<div id="mod-log">
</div>
<script>
(function() {
var inputFile = document.getElementById('file');
var reader = new FileReader();
function fileChange(ev) {
var target = ev.target;
var file = target.files[0];
var type = file.type;
var size = file.size;
if ( type !== 'image/jpeg' ) {
alert('選択できるファイルはJPEG画像だけです。');
inputFile.value = '';
return;
}
reader.readAsDataURL(file);
}
function fileLoad() {
console.log(reader.result);
}
inputFile.addEventListener('change', fileChange, false);
reader.addEventListener('load', fileLoad, false);
}());
</script>
</body>
</html>
(JavaScript)
var inputFile = document.getElementById('file');
var reader = new FileReader();
function fileChange(ev) {
var target = ev.target;
var file = target.files[0];
var type = file.type;
var size = file.size;
if ( type !== 'image/jpeg' ) {
alert('選択できるファイルはJPEG画像だけです。');
inputFile.value = '';
return;
}
reader.readAsDataURL(file);
}
function fileLoad() {
console.log(reader.result);
}
inputFile.addEventListener('change', fileChange, false);
reader.addEventListener('load', fileLoad, false);
この例で言うと、選択して読み込んだjpegファイルに対して
ファイル編集ができる…という感じだろうか。
(3)Geolocation API
それまで各キャリア別の独自コードで書いていた
位置情報に関するコードが、W3Cによって統一された。
「あなたの位置情報を求めています。許可しますか。」
みたいな通知を出して、ユーザから許可を得てから使える。
(例)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8>
<script>
//ユーザーの現在の位置情報を取得
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);
/***** ユーザーの現在の位置情報を取得 *****/
function successCallback(position) {
var gl_text = "緯度:" + position.coords.latitude + "<br>";
gl_text += "経度:" + position.coords.longitude + "<br>";
gl_text += "高度:" + position.coords.altitude + "<br>";
gl_text += "緯度・経度の誤差:" + position.coords.accuracy + "<br>";
gl_text += "高度の誤差:" + position.coords.altitudeAccuracy + "<br>";
gl_text += "方角:" + position.coords.heading + "<br>";
gl_text += "速度:" + position.coords.speed + "<br>";
document.getElementById("show_result").innerHTML = gl_text;
}
/***** 位置情報が取得できない場合 *****/
function errorCallback(error) {
var err_msg = "";
switch(error.code)
{
case 1:
err_msg = "位置情報の利用が許可されていません";
break;
case 2:
err_msg = "デバイスの位置が判定できません";
break;
case 3:
err_msg = "タイムアウトしました";
break;
}
document.getElementById("show_result").innerHTML = err_msg;
//デバッグ用→ document.getElementById("show_result").innerHTML = error.message;
}
</script>
<title>Geolocation API サンプル</title>
</head>
<body>
<p>あなたの現在位置</p>
<div id="show_result"></div>
</body>
</html>
(4)Web Workers
メインページと並行して、JavaScriptプログラムを
バックグラウンドで動作させることができる。
(「マルチスレッド化」的なことが可能)
バックグラウンドで動くJavaScriptファイル
=「Worker」
重たい処理を実行しても「スクリプトの応答がありません」
などのダイアログ表示がない。
これを利用して、重たい処理をWorkerにやらせる
手法もとれる。
【アクセスできるオブジェクト】
・navigator
・location
・XHR
【アクセスできないオブジェクト】
・window
・document
・DOM操作全般
実際はこんな感じ。
(下記は拝借したもので、詳細は出典を参照。)
(HTML+JavaScript)
割り算元の数値:<input type="text" id="inputtotalnum" /><br/>
割る数値 :<input type="text" id="num" />
<input type="button" value="送信" onClick="send()">
<br />
<div id="disp" ></div>
<script type="text/javascript">
// (1)ワーカーの実装チェック
if (window.Worker) {
// Web Workersに関する処理を記述
document.getElementById("button").addEventListener("click", send, false);
var worker = new Worker("multiple.js");
} else {
window.alert("このブラウザではWeb Workersは利用できません");
}
function send() {
var total =document.getElementById("inputtotalnum").value;
var num = document.getElementById("num").value;
// (2)ワーカーに入力値を送る
worker.postMessage({ "total": total, "num": num });
}
// (3)ワーカーからのメッセージ取得時の処理
worker.onmessage = function (event) {
document.getElementById("disp").innerHTML = event.data;
}
</script>
(Workerの動作ファイル「multiple.js」)
onmessage = function (event) {
var i = 0
var n = 0;
var ret = event.data;
// 倍数計算
for (i = 1; i < ret.total; i++) {
if (i % ret.num == 0) n++;
}
// UIスレッド側にメッセージを送付する
postMessage(ret.total + "における" + ret.num + "の倍数は" + n + "個です");
}
(5)Drag and Drop API
HTML側では、ドラッグする要素にdraggable属性を指定して、
ドロップ先の要素にdropzone属性を指定する。
…が、dropzone属性をサポートしているブラウザが今は怪しい様子。
加えて、dropzone属性を使用しなくても一部のブラウザでは
ドラッグ&ドロップ機能を実現可能とのこと。
JavaScript側では、DataTransferオブジェクトで
ドラッグデータをドロップ先へ受け渡す。
(例)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset=utf-8>
<title>ドラッグ&ドロップ サンプル</title>
<style>
#fruits {
/*単なるスタイリング*/
width:500px; height:100px; margin:20px; background-color:#FF9966; border:1px solid #cc3333;
}
#dropbox {
/*単なるスタイリング*/
width:500px; height:100px; margin:20px; background-color:#CCFF66; border:1px solid #00cc00;
/*以下はwebkit系ブラウザでドラッグ&ドロップを動かすための指定(ブラウザのサポートが進めば、必要なくなると思われます)*/
-khtml-user-drag: element;
}
</style>
<script>
/***** ドラッグ開始時の処理 *****/
function f_dragstart(event){
//ドラッグするデータのid名をDataTransferオブジェクトにセット
event.dataTransfer.setData("text", event.target.id);
}
/***** ドラッグ要素がドロップ要素に重なっている間の処理 *****/
function f_dragover(event){
//dragoverイベントをキャンセルして、ドロップ先の要素がドロップを受け付けるようにする
event.preventDefault();
}
/***** ドロップ時の処理 *****/
function f_drop(event){
//ドラッグされたデータのid名をDataTransferオブジェクトから取得
var id_name = event.dataTransfer.getData("text");
//id名からドラッグされた要素を取得
var drag_elm =document.getElementById(id_name);
//ドロップ先にドラッグされた要素を追加
event.currentTarget.appendChild(drag_elm);
//エラー回避のため、ドロップ処理の最後にdropイベントをキャンセルしておく
event.preventDefault();
}
</script>
</head>
<body>
<p>好きな果物は何ですか?</p>
<div id="fruits" ondragover="f_dragover(event)" ondrop="f_drop(event)">
<img src="images/apple.gif" id="apple" alt="りんご" draggable="true" ondragstart="f_dragstart(event)">
<img src="images/orange.gif" id="orange" alt="みかん" draggable="true" ondragstart="f_dragstart(event)">
<img src="images/grape.gif" id="grape" alt="ぶどう" draggable="true" ondragstart="f_dragstart(event)">
</div>
<p>下のボックスに入れてください。</p>
<div id="dropbox" ondragover="f_dragover(event)" ondrop="f_drop(event)">
</div>
</body>
</html>
(6)Canvas API
JavaScriptで2Dグラフィックをかける。
この技術を使ったプロトを作ったことがあるけれど
JavaScriptのリハビリにはそこそこ大変だった…。
(7)History API
ブラウザ閲覧履歴などをJavaScriptから操作できる。
ブラウザバック + ブラウザフォワード + α という感じ。
この「α」部分がHTML5から追加になった。
(例)
//前のページへ
window.history.back();
//次のページへ
window.history.forward();
//指定ページに移動
window.history.go(1)
//履歴情報の追加
window.history.pushState({name : 'xxxxxxxxxx'}, null, '/name')
//履歴情報の監視
//ブラウザの「戻る」「進む」or 同様の操作が行われると呼ばれるイベント
window.addEventListener('popstate', function(event) {
// 任意の処理
var state = event.state;
alert(state.name):
});
//現履歴情報の取得
window.history.state
【出典】
http://www.hp-stylelink.com/news/2013/08/20130802.php