HTML5 レベル2 過去問まとめ(WebブラウザにおけるJavaScript API)
イベント
イベントハンドラ / イベントリスナ
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Onload Event Handler Example</title>
</head>
<body>
<h1>Onload Event Handler Example</h1>
<script>
window.onload = function() {
console.log('Page fully loaded');
};
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Onload Event Listener Example</title>
</head>
<body>
<h1>Onload Event Listener Example</h1>
<script>
window.addEventListener('load', function() {
console.log('Page fully loaded - listener 1');
});
window.addEventListener('load', function() {
console.log('Page fully loaded - listener 2');
});
</script>
</body>
</html>
例) ボタンクリック時にfoo()関数を呼び出すイベントリスナ
button.addEventListener('click', foo, true);
イベントハンドラ/イベントリスナの関数の設定の書き方
イベントハンドラ - 関数名を記載
<button id="myButton">Click me</button>
<script>
var button = document.getElementById('myButton');
function handleClick() {
console.log('Button clicked!');
}
// 関数名をイベントハンドラに設定
button.onclick = handleClick;
</script>
イベントハンドラ - 関数の呼び出しを記載
<button id="myButton">Click me</button>
<script>
var button = document.getElementById('myButton');
function handleClick() {
console.log('Button clicked!');
}
// 関数の呼び出しをイベントハンドラに設定(意図しない動作)
button.onclick = handleClick(); // handleClickが即座に実行され、その戻り値がonclickに設定される
</script>
イベントリスナ - 関数名を記載
<button id="myButton">Click me</button>
<script>
var button = document.getElementById('myButton');
function handleClick() {
console.log('Button clicked!');
}
// 関数名をイベントリスナーに設定
button.addEventListener('click', handleClick);
</script>
イベントリスナ - 関数の呼び出しを記載
<button id="myButton">Click me</button>
<script>
var button = document.getElementById('myButton');
function handleClick() {
console.log('Button clicked!');
}
// 関数の呼び出しをイベントリスナーに設定(意図しない動作)
button.addEventListener('click', handleClick()); // handleClickが即座に実行され、その戻り値がイベントリスナーに設定される
</script>
onloadイベント
フォームに関するイベント
document.addEventListener('DOMContentLoaded', function() {
var form = document.getElementById('myForm');
var nameInput = document.getElementById('name');
var ageInput = document.getElementById('age');
var commentsTextarea = document.getElementById('comments');
nameInput.addEventListener('blur', function() {
console.log('Name input lost focus');
});
ageInput.addEventListener('change', function() {
console.log('Age input value changed');
});
form.addEventListener('contextmenu', function(event) {
event.preventDefault();
console.log('Context menu opened on form');
});
nameInput.addEventListener('focus', function() {
console.log('Name input gained focus');
});
commentsTextarea.addEventListener('input', function() {
console.log('Comments textarea input event');
});
nameInput.addEventListener('invalid', function() {
console.log('Name input is invalid');
});
commentsTextarea.addEventListener('select', function() {
console.log('Text selected in comments textarea');
});
form.addEventListener('submit', function(event) {
event.preventDefault();
console.log('Form submitted');
});
form.addEventListener('formchange', function() {
console.log('Form change event');
});
form.addEventListener('forminput', function() {
console.log('Form input event');
});
});
キーボードのイベント
マウス操作のイベント
タッチスクリーンのイベント
入れ子構造になっている要素にイベントを追加した場合
イベントのバブリング(またはバブルアップ)
例1) バブリングフェーズ
以下が表示される
INNER is clicked
OUTER is clicked
<!DOCTYPE html>
<html>
<body>
<div id="outer">
OUTER
<p id="inner">INNER</p>
</div>
<script type="text/javascript">
const outer = document.getElementById("outer");
const inner = document.getElementById("inner");
outer.onclick = function() {
console.log("OUTER is clicked");
}
inner.onclick = function() {
console.log("INNER is clicked");
}
</script>
</body>
</html>
例2) キャプチャリングフェーズ
下記はイベントリスナの第3引数にtrueをしているので、キャプチャリングフェーズとなる。
親要素からイベント実行する
以下が表示される
A is clicked
B is clicked
<!DOCTYPE html>
<html>
<body>
<div id="a">
<p>A</p>
<p id="b">B</p>
</div>
<script type="text/javascript">
const a = document.getElementById("a");
const b = document.getElementById("b");
a.addEventListener('click', function() {
console.log("A is clicked");
}, true);
b.addEventListener('click', function() {
console.log("B is clicked");
}, true);
</script>
</body>
</html>
カスタムイベント
例1)
<!DOCTYPE html>
<html>
<body>
<input type="button" value="現在日時取得" id="btn">
<span id="time"></span>
<script type="text/javascript">
const button = document.getElementById("btn");
button.addEventListener('click', displayTime);
var event = new Event("click");
window.setInterval(function() {
button.dispatchEvent(event);
}, 10000);
function displayTime() {
var now = new Date();
document.getElementById("time").textContent = now.toLocaleString();
}
</script>
</body>
</html>
例2) Eventインタフェースのプロパティを使う
Eventインタフェースの主なプロパティ/メソッド
<!DOCTYPE html>
<html>
<body>
<form method="post" action="/hoge">
<label for="foo">Text:</label>
<input type="text" id="foo">
<button>OK</button>
</form>
<script type="text/javascript">
document.getElementById("foo").addEventListener('blur', function(e) {
if(e.target.value === "") {
alert("no input");
}
}, false);
</script>
</body>
</html>
フォーム送信に関するメソッド
キーボードイベントの入力情報の取得
keyboardEventオブジェクトの主なプロパティ
HTML文書を読み込み際に発生するイベント順
下記の読み込む順は、
DOMContent, image, pageとなる
<img id="img" src="text.jpg">
<script type="text/javascript">
var img = document.getElementById('img');
img.onload = function() {
alert('image');
};
document.addEventListener('DOMContentLoaded', function() {
alert('DOMContent');
});
window.onload = function() {
alert('page');
};
</script>
DOM
fomr要素の取得
document.formsプロパティを使う
<form action="foo" method="GET" name="inputForm">
<input type="text" name="input" value="bar">
<input type="submit" value="Submit">
</form>
<script type="text/javascript">
console.log(document.forms[0]); // <form action="foo" method="GET" name="inputForm"></form>
console.log(document.forms.inputForm); // <form action="foo" method="GET" name="inputForm"></form>
console.log(document.forms["inputForm"]);// <form action="foo" method="GET" name="inputForm"></form>
</script>
formのinputを取得する
<form action="foo" method="GET" name="inputForm">
<input type="text" name="bar" value="foge">
</form>
console.log(document.forms.inputForm.bar);
console.log(document.forms[0][0]);
console.log(document.forms["inputForm"]["bar"]);
innerHTMLでHTML要素を追加する例
<ul id="list"></ul>
var list = document.getElementById('list');
list.innerHTMl += "<li>Item 1</li>";
list.innerHTMl += "<li>Item 2</li>";
list.innerHTMl += "<li>Item 3</li>";
document.createElementでHTML要素を生成、操作
document.addEventListener('DOMContentLoaded', function() {
// 要素を取得
var container = document.getElementById('container');
var myInput = document.getElementById('myInput');
var myParagraph = document.getElementById('myParagraph');
// children: 子要素の取得
console.log(container.children); // 出力: HTMLCollection(2) [input#myInput, p#myParagraph]
// innerHTML: HTMLコンテンツの設定
myParagraph.innerHTML = 'Updated <strong>paragraph</strong> content.';
console.log(myParagraph.innerHTML); // 出力: "Updated <strong>paragraph</strong> content."
// parentElement: 親要素の取得
console.log(myInput.parentElement); // 出力: <div id="container">
// style: インラインスタイルの設定
myParagraph.style.color = 'blue';
myParagraph.style.fontSize = '20px';
console.log(myParagraph.style.cssText); // 出力: "color: blue; font-size: 20px;"
// textContent: テキストコンテンツの設定
myParagraph.textContent = 'Updated text content only.';
console.log(myParagraph.textContent); // 出力: "Updated text content only."
// value: 入力値の取得と設定
console.log(myInput.value); // 出力: "Hello"
myInput.value = 'Updated value';
console.log(myInput.value); // 出力: "Updated value"
// appendChild(): 子要素の追加
var newElement = document.createElement('div');
newElement.textContent = 'I am a new element';
container.appendChild(newElement);
console.log(container.children); // 出力: HTMLCollection(3) [input#myInput, p#myParagraph, div]
// hasAttribute(): 属性の存在確認
console.log(myInput.hasAttribute('value')); // 出力: true
console.log(myInput.hasAttribute('placeholder')); // 出力: false
// insertBefore(): 要素の挿入
var anotherElement = document.createElement('span');
anotherElement.textContent = 'Inserted before input';
container.insertBefore(anotherElement, myInput);
console.log(container.children); // 出力: HTMLCollection(4) [span, input#myInput, p#myParagraph, div]
// remove(): 要素の削除
newElement.remove();
console.log(container.children); // 出力: HTMLCollection(3) [span, input#myInput, p#myParagraph]
// removeAttribute(): 属性の削除
myInput.removeAttribute('value');
console.log(myInput.hasAttribute('value')); // 出力: false
// setAttribute(): 属性の設定
myInput.setAttribute('placeholder', 'Enter text here');
console.log(myInput.getAttribute('placeholder')); // 出力: "Enter text here"
// setAttributeNode(): Attrノードの設定
var newAttr = document.createAttribute('data-custom');
newAttr.value = 'customValue';
myInput.setAttributeNode(newAttr);
console.log(myInput.getAttribute('data-custom')); // 出力: "customValue"
});
例1) createElement, insertBeforeで要素の前に配置する
<!DOCTYPE html>
<html>
<body>
<div id="container">
<span id="target">FLM</span>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const spanElement = document.createElement('span');
spanElement.textContent = 'SE';
const divElement = document.getElementById('container');
const targetElement = document.getElementById('target');
divElement.insertBefore(spanElement, targetElement);
});
</script>
</body>
</html>
例2) createElement, appendChild で要素の前に配置する
<!DOCTYPE html>
<html>
<body>
<div id="container">
<span id="target">FLM</span>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const spanElement = document.createElement('span');
spanElement.textContent = 'SE';
const divElement = document.getElementById('container');
divElement.appendChild(spanElement);
});
</script>
</body>
</html>
Elementオブジェクトのvalueでinput要素の入力値を取得
document.getEkementById("input1").addEventListener("submit", function(e){
for(var ele of e.target.children) {
if(ele.value === "") {
alert("Please fill out all fields");
e.preventDefault();
}
}
});
HTML要素の非表示の設定
document.getElementById('item').setAttribute("class", "hidden");
document.getElementById('item').style = "display: none";
WIndowオブジェクト
windowオブジェクトのプロパティ
例)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Window Object Properties Example</title>
</head>
<body>
<button id="reloadButton">Reload Page</button>
<div id="storageExample">Storage Example</div>
<div id="locationExample">Location Example</div>
<div id="navigatorExample">Navigator Example</div>
<script src="script.js"></script>
</body>
</html>
document.addEventListener('DOMContentLoaded', function() {
// console
console.log('This is a message logged to the console');
// document
const storageDiv = document.getElementById('storageExample');
storageDiv.textContent = 'LocalStorage and SessionStorage example';
// indexedDB
if ('indexedDB' in window) {
let request = indexedDB.open('myDatabase', 1);
request.onupgradeneeded = function(event) {
let db = event.target.result;
db.createObjectStore('myObjectStore', { keyPath: 'id' });
};
request.onsuccess = function(event) {
console.log('IndexedDB opened successfully');
};
request.onerror = function(event) {
console.error('IndexedDB error:', event.target.errorCode);
};
} else {
console.error('IndexedDB is not supported in this browser');
}
// location
const locationDiv = document.getElementById('locationExample');
locationDiv.textContent = `Current URL: ${window.location.href}`;
document.getElementById('reloadButton').addEventListener('click', function() {
window.location.reload();
});
// localStorage
localStorage.setItem('myKey', 'myValue');
console.log('LocalStorage item:', localStorage.getItem('myKey'));
// sessionStorage
sessionStorage.setItem('sessionKey', 'sessionValue');
console.log('SessionStorage item:', sessionStorage.getItem('sessionKey'));
// navigator
const navigatorDiv = document.getElementById('navigatorExample');
navigatorDiv.textContent = `User Agent: ${navigator.userAgent}`;
// worker
if (window.Worker) {
const worker = new Worker('worker.js');
worker.onmessage = function(event) {
console.log('Message from worker:', event.data);
};
worker.postMessage('Hello, worker!');
} else {
console.error('Web Workers are not supported in this browser');
}
});
self.onmessage = function(event) {
console.log('Message received in worker:', event.data);
self.postMessage('Hello from the worker!');
};
Windowオブジェクトのメソッド
window.alert("アラート");
window.confirm("確認ダイアログ");
window.prompt("この質問はどうする?入力値を返す");
window.open("next.html", "next");
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Window Object Methods Example</title>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
const alertButton = document.getElementById('alertButton');
const confirmButton = document.getElementById('confirmButton');
const promptButton = document.getElementById('promptButton');
const openButton = document.getElementById('openButton');
// alert(): 警告ダイアログを表示する
alertButton.addEventListener('click', function() {
window.alert("アラート");
});
// confirm(): OK, Cancelボタンを持つ確認ダイアログを表示する
confirmButton.addEventListener('click', function() {
window.confirm("確認ダイアログ");
});
// prompt(): 入力ダイアログを表示する
promptButton.addEventListener('click', function() {
window.prompt("この質問はどうする?入力値を返す");
});
// open(): 新しいウィンドウを開く
openButton.addEventListener('click', function() {
window.open("next.html", "next");
});
});
</script>
</head>
<body>
<button id="alertButton">Show Alert</button>
<button id="confirmButton">Show Confirm</button>
<button id="promptButton">Show Prompt</button>
<button id="openButton">Open Window</button>
</body>
</html>
postMessageを使った例
var nextPage = window.open("next.html", "next");
nextPage.postMessage("message", "http://localhost:8080");
MessageEventオブジェクトのプロパティ
Windowオブジェクトの主なイベント
ブラウザの座標情報のプロパティ/メソッド
windowオブジェクトのブラウザ操作
setInterval(), setTimeout, clearTimeout(), clearTimeInterval()
document.querySelector()
間違った例)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Window Object Methods Example</title>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function() {
var element = document.querySelector(".input");
console.log(element.value);
});
</script>
</head>
<body>
<input type="text" class="input">
<input type="button" class="input" value="click">
</body>
</html>
document.querySelectorAll
要素の指定のやり方
正しい例
<input type="text" name="secret" id="secret">
document.querySelectorAll("#secret")[0]
document.querySelector("#secret")
document.querySelector("[name='secret']")
document.getElementById('secret')
間違いの例
<input type="text" name="secret" id="secret">
document.getElementById('#secret')
Historyオブジェクト
Historyオブジェクトのプロパティ、メソッド
pushStateの例
第3引数でパス名を指定することでURLが決まる
URL: http://localhost/index
window.onload = function() {
history.pushState({data: "foo"}, "foo", "foo");
history.pushState({data: "bar"}, "bar", "bar");
history.pushState({data: "foge"}, "foge", "foge");
};
window.onload = function() {
// URLを `http://localhost/index/foo` に変更し、履歴エントリを追加
history.pushState({data: "foo"}, "foo", "index/foo");
// URLを `http://localhost/index/foo/bar` に変更し、履歴エントリを追加
history.pushState({data: "bar"}, "bar", "index/foo/bar");
// URLを `http://localhost/index/foo/bar/foge` に変更し、履歴エントリを追加
history.pushState({data: "foge"}, "foge", "index/foo/bar/foge");
};
URL: http://localhost/index
window.onload = function() {
history.pushState({data: "foo"}, "foo", "foo");
history.pushState({data: "bar"}, "bar", "bar");
history.pushState({data: "foge"}, "foge", "foge");
history.pushState({data: "foo"}, "foo", "piyo");
history.go(2);
};
window.onload = function() {
history.pushState({data: "foo"}, "foo", "foo");
history.pushState({data: "bar"}, "bar", "bar");
};
window.onpopstate = function() {
console.log(history.state);
};
Locationオブジェクト
Locationオブジェクトのプロパティ、メソッド
location.assign() と location.replace() の違い
page1.htm lの URL は http://localhost/index1.html とする
location.assign("page2.html");
history.pushState(null, "", page3.html);
history.pushState(null, "", page4.html);
location.replace("page5.html");
history.back(); // page3.html に戻る
// この時点での履歴は page1.html -> page2.html -> page3.html となっている