8 ブラウザオブジェクト
8.1 ウィンドウ(Window)
8.1.1 ウィンドウ情報
8.1.2 ウィンドウ制御
8.1.3 ダイアログ表示
8.1.4 タイマー
8.1.5 イベント
8.1.6 メッセージ
8.1.7 エンコードとデコード
8.2 ナビゲーター(Navigator)
8.3 ヒストリ(History)
8.3.1 ヒストリ情報
8.3.2 移動
8.3.3 変更
8.4 ロケーション(Location)
8.4.1 ロケーション情報
8.4.2 移動
8.4.3 再読み込み
8.5 ノード(Node)
8.5.1 ノード情報
8.5.2 ノードの追加・削除
8.5.3 ノードのチェック
8.5.4 ノードのコピー
8.6 ドキュメント(Document)
8.6.1 ドキュメント情報
8.6.2 ドキュメント出力
8.6.3 ドキュメント要素
8.6.4 フォーカス
8.6.5 イベント
8.7 エレメント(Element)
8.7.1 エレメント情報
8.7.2 エレメントの要素
8.7.3 エレメントの属性
8.7.4 エレメントの操作
8.7.5 イベント
8.8 スタイルシート(Stylesheet)
8.8.1 スタイルシート(CSSStyleSheet)
8.8.2 ルール (CSSStyleRule)
8.8.3 スタイル属性 (CSSStyleDeclaration)
8.9 フォーム(HTMLFormElement)
8.9.1 フォーム要素
8.9.2 フォーム部品(共通)
8.9.3 フォーム部品(テキスト)
8.9.4 フォーム部品(チェックボックス、ラジオボタン)
8.9.5 フォーム部品(セレクト)
8.10 イメージ(HTMLImageElement)
8.10.1 イメージ要素
8.10.2 Image オブジェクト
8.11 アンカー
8.11.1 アンカー(HTMLAnchorElement)
8.11.2 エリア(HTMLAreaElement)
8.12 メディア(HTMLMediaElement)
8.12.1 メディア要素
8.12.2 メディア操作
8.13 イベント(Event)
ブラウザに表示されるドキュメントや画像、フォームなどブラウザを構成する各部品をブラウザオブジェクトといいます。
ブラウザオブジェクトは標準の規格があるわけではなく、個々のブラウザごとに独自に実装されています。(その中の Document オブジェクトは、ドキュメントオブジェクトモデル:DOM としてほぼ標準化されています。)そのため以前はブラウザごとの仕様の違いによりクロスブラウザ問題がありましたが、現在では主要なブラウザではそれなりに互換性を持っています。
8.1 ウィンドウ(Window)
ドキュメントを表示するウィンドウに対応するのが Window オブジェクトです。
Window オブジェクトには、document プロパティや location プロパティなどがあり、document プロパティは、対応するウィンドウに関連付けられた Document オブジェクトを参照し、location プロパティは、対応するウィンドウに関連付けられた Location オブジェクトを参照します。また、自身を参照する window プロパティもあります。
Window オブジェクトの主なプロパティとメソッドについて説明します。<script>~</script> の間では Window. を省略することができ、Window.window.~ ではなく window.~ というように参照することができます。
8.1.1 ウィンドウ情報
(1)ウィンドウ情報
ウィンドウに関する主な情報です。
プロパティ 値
nameR/O ウィンドウの名前 ○ ○ ○ ○ ○ ○ ○ ○
opener 自身を window.open したウィンドウのオブジェクト ○ ○ ○ ○ ○ ○ ○ ○
parentR/O 親ウィンドウ(iframe 内から見た iframe タグを含むウィンドウ)のオブジェクト ○ ○ ○ ○ ○ ○ ○ ○
selfR/O 自身のウィンドウオブジェクト ○ ○ ○ ○ ○ ○ ○ ○
記述例
parent
<span id = "element" > PARENT</span>
child
<span id = "element" > CHILD</span>
<div id = "d1" > </div>
<script>
document.getElementById("d1" ).textContent = window.name;
document.getElementById("d2" ).textContent = window.self.name;
if (window.opener != undefined ) {
document.getElementById("d3" ).textContent = window.opener.name;
document.getElementById("d4" ).textContent = window.opener.document.getElementById("element" ).textContent;
}
document.getElementById("d5" ).textContent = window.parent.name;
document.getElementById("d6" ).textContent = window.parent.document.getElementById("element" ).textContent;
</script>
下の実行例では iframe で表示している(グレイの枠内)ため、親子関係があり parent の情報が表示されています。また、ウィンドウを開いていないため、ウィンドウの名前も opener も設定されていません。
しかし、「別ウィンドウで開く」ボタンをクリックした場合は、ウィンドウに名前が付けられていて、opener も(「別ウィンドウで開く」ボタンのある)このウィンドウが設定されています。また parent はありませんので、開かれた child ウィンドウ自身が設定されます。
(2)位置、サイズ
ウィンドウの位置やサイズに関する主な情報です。
プロパティ 値
innerWidth ウィンドウ内側の幅(iframe の場合は iframe の width) ○ ○ ○ ○ ○ ○ ○ ○
innerHeight ウィンドウ内側の高さ(iframe の場合は iframe の height) ○ ○ ○ ○ ○ ○ ○ ○
outerWidthR/O ウィンドウ外側の幅 ○ ○ ○ ○ ○ ○ ○ ○
outerHeightR/O ウィンドウ外側の高さ ○ ○ ○ ○ ○ ○ ○ ○
pageXOffsetR/O 水平スクロールされているピクセル数 ○ ○ ○ ○ ○ ○ ○ ○
pageYOffsetR/O 垂直スクロールされているピクセル数 ○ ○ ○ ○ ○ ○ ○ ○
screenXR/O (メイン)画面の左端からブラウザの左端までの水平方向の距離 ○ ○ ○ ○ ○ ○ ○ ○
screenYR/O (メイン)画面の上端からブラウザの上端までの垂直方向の距離 ○ ○ ○ ○ ○ ○ ○ ○
screen.width × screen.height R/O (注) ディスプレイの幅 × 高さ ○ ○ ○ ○ ○ ○ ○ ○
screen.availWidth × screen.availHeight R/O (注) ディスプレイの有効領域(タスク・バーなどがある場合それらを省いた領域)の幅 × 高さ ○ ○ ○ ○ ○ ○ ○ ○
注)マルチディスプレイの場合、ブラウザによってどのディスプレイかが変わります。
ブラウザ width × height availWidth × availHeight
メイン・ディスプレイ メイン・ディスプレイ
ウィンドウの中央があるディスプレイ メイン・ディスプレイ
ウィンドウの中央があるディスプレイ ウィンドウの中央があるディスプレイ
また、screenX や screenY は、メインディスプレイの左上からの位置が設定されます。したがって、メインディスプレイの上や左に他のディスプレイが配置されているような場合には負の値になることもあります。
記述例
<div id = "d1" > </div>
<script>
document.getElementById("d1" ).textContent = window.screen.width + "×" + window.screen.height;
document.getElementById("d2" ).textContent = window.screen.availWidth + "×" + window.screen.availHeight;
document.getElementById("d3" ).textContent = window.outerWidth + "×" + window.outerHeight;
document.getElementById("d4" ).textContent = window.innerWidth + "×" + window.innerHeight;
document.getElementById("d5" ).textContent = window.screenX + "×" + window.screenY;
document.getElementById("d6" ).textContent = window.pageXOffset + "×" + window.pageYOffset;
</script>
innerWidth×innerHeight は、下の実行例では iframe で表示しているため iframe のサイズになっています。別ウィンドウで開けば実際のウィンドウの内側のサイズになります。
(3)ウィンドウの状態
プロパティ 値
closedR/O ウィンドウの状態(true:閉、false:開) ○ ○ ○ ○ ○ ○ ○ ○
記述例
<div id = "d1" > </div>
<script>
var w = null ;
this .display = function () {
if (w != null )
document.getElementById("d1" ).textContent = w .closed;
}
</script>
closed は、ウィンドウが開いていれば false、閉じていれば true になります。したがって、「ウィンドウを開く」ボタンで別のウィンドウが開くと false、「ウィンドウを閉じる」ボタンでウィンドウが閉じると true になります。
実行例
8.1.2 ウィンドウ制御
(1)ウィンドウを開く
ウィンドウを開きます。
window.open('url', 'name' [, 'style'])
ウィンドウを開く。
多くのブラウザでは、ウィンドウはメインディスプレイの指定位置に開くが、Chrome 、Opera は、ブラウザがメインディスプレイにない場合は同じディスプレイの右上(?)に開く。
また、ロケーションバーは Safari 以外はセキュリティの関係で完全に非表示にはできない。
引数 url:開こうとするページのアドレス
引数 name:ウィンドウの名前
引数 style:ウィンドウの特性(特性=値 で指定する。複数ある場合は , で区切る)
主な特性 値 機能
top 数値 ウィンドウの上側位置 ○ ○ ○ ○ ○ ○ × ○
left 数値 ウィンドウの左側位置 ○ × ○ ○ ○ ○ × ○
height 数値 コンテンツエリアの高さ(水平スクロールバーの高さを含む)(注) ○ ○ ○ ○ ○ ○ × ×
width 数値 コンテンツエリアの幅(垂直スクロールバーの幅を含む)(注) ○ ○ ○ ○ ○ ○ × ×
toolbar yes|no ツールバーの表示(yes)、非表示(no) ○ × × × × × × ○
location yes|no ロケーションバーの表示(yes)、非表示(no) △ × × × × × × ○
directories yes|no ブックマークやリンクバーなどの表示(yes)、非表示(no) × × × × × × × ×
status yes|no ステータスバーの表示(yes)、非表示(no) ○ × × × × × × ○
menubar yes|no メニューバーの表示(yes)、非表示(no) △ × × × × × × ×
scrollbars yes|no スクロールバーの表示(yes)、非表示(no) ○ × × × × × × ×
resizable yes|no リサイズ可(yes)、不可(no) ○ × × × × × × ×
(注)指定した大きさで表示される最小サイズ
height 104 115 99 99 100 90 158
width 254 372 123 138 120 270 334
戻り値 :ウィンドウオブジェクト
記述例
var w = window.open("xxx.htm" ,"sample" ,"width=300,height=200,scrollbars=yes,resizable=yes" );
主なスタイルを指定してみます。
実行例
ただし、同じ width、height を指定しても実際に開くウィンドウの大きさはブラウザによって異なります。
下の例はすべて Windows10 で height=150,width=350 で開いています。赤い線がその大きさです。
そして、表示されている数値が実際のコンテンツエリアの大きさです。(以外 は正しくないようです。)
記述例
<script>
window.open("openWinS.htm" ,"sample" ,"left=300,top=300,height=150,width=350" )
</script>
注意
ブラウザによっては、ウィンドウではなく、タブとして開くことがあります。
Internet Explorer directories 以外すべてが yes のとき
Edge directories 以外すべてが yes のとき
Chromium Edge toolbar、directories 以外すべてが yes のとき
Chrome toolbar、directories 以外すべてが yes のとき
FireFox directories 以外すべてが yes のとき
Opera location、directories 以外すべてが yes のとき
Sleipnir 常に
(2)ウィンドウを閉じる
ウィンドウを閉じます。
ウィンドウオブジェクト.close()
window.open メソッドで開いたウィンドウを閉じる。window.close() とすると、自身のウィンドウを閉じる。
戻り値 :なし
記述例
var w = window.open("xxx.htm" , "sample" );
w.close();
(3)ウィンドウの移動
ウィンドウを移動します。
ウィンドウオブジェクト.moveTo(x, y)、ウィンドウオブジェクト.moveBy(x, y)
window.open メソッドで開いたウィンドウを移動する。
引数 x:移動先の x 座標(moveTo)、x 方向への移動量(moveBy)
引数 y:移動先の y 座標(moveTo)、y 方向への移動量(moveBy)
戻り値 :なし
記述例
var w = window.open("xxx.htm" , "sample" );
w.moveTo(100, 200);
w.moveBy(10, 0);
w.close();
開いたウィンドウを移動させます。
実行例
(4)ウィンドウサイズの変更
ウィンドウの大きさを変更します。
ウィンドウオブジェクト.resizeTo(x, y)、ウィンドウオブジェクト.resizeBy(x, y)
window.open メソッドで開いたウィンドウの大きさを変更する。
引数 x:幅(resizeTo)、幅の増加量(resizeBy)
引数 y:高さ(resizeTo)、高さの増加量(resizeBy)
戻り値 :なし
記述例
var w = window.open("xxx.htm" , "sample" );
w.resizeTo(100, 200);
w.resizeBy(10, 0);
w.close();
開いたウィンドウの大きさを変更します。
実行例
ウィンドウの内容をスクロールします。
ウィンドウオブジェクト.scrollTo(x, y)、ウィンドウオブジェクト.scrollBy(x, y)
window.open メソッドで開いたウィンドウの内容をスクロールする。
引数 x:スクロール先の x 座標(scrollTo)、x 方向へのスクロール量(scrollBy)
引数 y:スクロール先の y 座標(scrollTo)、y 方向へのスクロール量(scrollBy)
戻り値 :なし
記述例
var w = window.open("xxx.htm" , "sample" );
w.scrollTo(100, 200);
w.scrollBy(10, 0);
w.close();
開いたウィンドウの内容をスクロールします。
実行例
(6)ウィンドウのフォーカス
ウィンドウにフォーカスを合わせたり、はずしたりします。
ウィンドウオブジェクト.focus()、ウィンドウオブジェクト.blur()
window.open メソッドで開いたウィンドウにフォーカスを合わせる/はずす。
戻り値 :なし
記述例
var w = window.open("xxx.htm" , "sample" );
w.focus();
w.blur();
w.close();
開いたウィンドウにフォーカスします(ブラウザによってはポップアップ画面がブロックされるかもしれないので許可してやってください)。
実行例
8.1.3 ダイアログ表示
(1)警告ダイアログ
window.alert(message)
[OK]ボタン付きの警告ダイアログを表示する。
引数 message:表示する文字列
戻り値 :なし
記述例
window.alert("メッセージ" );
実行例
(2)確認ダイアログ
window.confirm(message)
[OK]ボタンと[キャンセル]ボタンが付いている確認ダイアログを表示する。
引数 message:表示する文字列
戻り値 :[OK]が true、[キャンセル]が false
記述例
var r = window.confirm("メッセージ" );
実行例
(3)文字列入力ダイアログ
window.prompt(message[, init])
文字列入力ダイアログを表示する。
引数 message:表示する文字列
引数 init:初期値
戻り値 :入力された文字列、[キャンセル]のときは null
記述例
var r = window.prompt("メッセージ" , "初期値" );
実行例
8.1.4 タイマー
(1)タイマー
タイマーを設定、解除します。
window.setTimeout(func, msec[, arg1[, arg2, ...]])
msec ミリ秒後に func を実行する。
引数 func:関数("" で囲むか、() を付けないで関数名のみを記述)
引数 msec:ミリ秒
引数 arg1, arg2:func で指定した関数の引数
戻り値 :タイマーID(正の整数)
window.clearTimeout(timer)
タイマーを解除する。
引数 timer:タイマーID
戻り値 :なし
記述例
var tm ;
tm = window.setTimeout("now()" , 3000);
window.clearTimeout(tm );
[set] ボタンをクリックすると3秒後に別途定義されている now() が呼び出され、現在時刻が表示されます。3秒の間に [reset] ボタンをクリックするとタイマーが解除されます。
実行例
setTimeout の最初の引数として "now()" としていますが、これは now でも構いません。ただし、now() としてしまうと、すぐに now() が実行されてしまいます。
(2)定期実行
定期的に実行するタイマーを設定、解除します。
window.setInterval(func, msec[, arg1[, arg2, ...]])
msec ミリ秒毎に func を定期的に実行する。
引数 func:関数("" で囲むか、() を付けないで関数名のみを記述)
引数 msec:ミリ秒
引数 arg1, arg2:func で指定した関数の引数
戻り値 :インターバルID(正の整数)
window.clearInterval(timer)
タイマーを解除する。
引数 timer:インターバルID
戻り値 :なし
記述例
var tm ;
tm = window.setInterval("now()" , 1000);
window.clearInterval(tm );
[set] ボタンをクリックすると毎秒別途定義されている now() が呼び出され、現在時刻が表示されます。[reset] ボタンをクリックするとタイマーが解除されます。
実行例
setInterval の最初の引数として "now()" としていますが、これは now でも構いません。ただし、now() としてしまうと、すぐに now() が実行されてしまいます。
(3)アニメーション用タイマー
ブラウザの更新準備ができたら func を実行します。タブやブラウザウィンドウがアクティブでなかったら実行する頻度を落とします。主にアニメーションを更新するときに使用します。
ただし、自動的に繰り返し実行されるわけではなく、func の中で次の実行のために毎回 requestAnimationFrame で func を設定する必要があります。
(setInterval や setTimeout は常に指定された時間で実行します。)
window.requestAnimationFrame(func)
ブラウザの準備ができたら func を実行する。
引数 func:関数
戻り値 :リクエストID
window.cancelAnimationFrame(requestID)
コールバック関数(func)の更新を中止する。
引数 requestID:リクエストID
戻り値 :なし
記述例
var requestId;
function now() {
requestId = window.requestAnimationFrame(now);
var t = new Date();
document.getElementById('x' ).textContent=t.toLocaleDateString() + " " + t.toLocaleTimeString();
}
requestId = window.requestAnimationFrame(now);
[set] ボタンをクリックすると現在時刻が表示されます。時刻の更新は一定時間ごとではなく更新準備ができるごとに表示されます。[reset] ボタンをクリックするとタイマーが解除されます。
実行例
8.1.5 イベント
ウィンドウに対して、いろいろな操作(マウスを重ねる、クリックするなど)をしたり、ウィンドウが変化(サイズが変わる、ドキュメントが読み込まれるなど)すると、その都度イベントが発生しています。
発生したイベントに対して処理を行いたいときに、イベントと関数を関連付けます。
イベントリスナーを設定、解除します。なお、第3引数の useCapture については、「10.2 イベントの伝播」 を参照してください。
window.addEventListener(event, func, useCapture)
event 発生時に func を実行するようにイベントリスナーを設定する。
引数 event:イベントの種類
引数 func:関数
引数 useCapture:Capture(捕捉)フェーズを使用する(true)、使用しない(false) 規定値
戻り値 :なし
window.removeEventListener(event, func, useCapture)
指定した引数とまったく同じである、イベントリスナーを削除する。ただし、addEventListener のとき、第二引数に直接メソッドを記述していた場合は削除できない。
引数 event:イベントの種類
引数 func:関数
引数 useCapture:Capture(捕捉)フェーズを使用する(true)、使用しない(false) 規定値
戻り値 :なし
記述例
<script>
function add() {
window.addEventListener('click' , now, false );
}
function removex() {
document.getElementById('x' ).textContent="" ;
window.removeEventListener('click' , now, false );
}
function now() {
let t = new Date();
document.getElementById('x' ).textContent=t.toLocaleDateString() + " " + t.toLocaleTimeString();
}
</script>
<div onClick = 'add();' > addEventListener</div> <div onClick = 'removex();' > removeEventListener</div>
<span id = 'x' > </span>
[addEventListener] ボタンで、クリックで時刻が表示されるようイベントリスナーを設定します。[removeEventListener] ボタンで、イベントリスナーを解除します。
[addEventListener] ボタンクリック後に、ボタン下部のどこかをクリックしてください。時刻が変わります。
実行例
8.1.6 メッセージ
別ウィンドウにメッセージを伝達します。
通常、異なった複数のページでのスクリプトはそれらが実行されたページが同じプロトコル、ポート番号、ホストである場合に限りお互いにアクセスすることが可能です。
ウィンドウオブジェクト.postMessage(message, targetOrigin )
ウィンドウオブジェクトにメッセージを伝達する。
targetOrigin が * でない URI の場合、ウィンドウオブジェクトと一致しなければ伝達されない。
引数 message:メッセージ
引数 targetOrigin:メッセージの伝達先の URI(特に指定しない場合は *)
戻り値 :なし
記述例
<script>
function send() {
var val = F1.message.value;
var iframe = document.getElementById('other' );
iframe.contentWindow.postMessage(val,'*' );
}
</script>
<form name = "F1" action = "#" >
<input type = "text" name = "message" value = "メッセージ" > <span class = "switch" onclick = "send();" > 送信</span>
</form>
<br>
<iframe src = "other.htm" id = "other" frameborder = "1px" width = "600px" height = "60px" > </iframe>
other.htm
<div id = "d" > </div>
<script>
window.addEventListener('message' , function (event ){
document.getElementById('d' ).textContent = event .data;
});
</script>
iframe 内の HTML にメッセージが伝達されます。伝達された側には message イベントが発生します。
実行例
8.1.7 エンコードとデコード
バイナリデータなどと base64 エンコードされた文字列との間で変換します。
そのまま送信すると問題を起こす可能性のあるデータを送信できる文字列にエンコードします。また、その逆にエンコードされた文字列を元のバイナリデータにデコードします。
base64 とは、64種類の印字可能な英数字(1文字6ビット)のみを用いて表すエンコード方式で、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのものです。
(1)エンコード
バイナリデータなどから base64 エンコードされた文字列を作成します。
ただし、ユニコードの文字列の場合は、ほとんどのブラウザで例外が発生します。
window.btoa(binary )
バイナリデータなどから base64 エンコードされた文字列を作成する。
引数 binary:バイナリデータ
戻り値 :base64 エンコードされた文字列
ユニコードの文字列の場合は、ほとんどのブラウザで例外が発生します(二つ目の例)。その場合は三つ目の例のような記述が必要です。
四つ目の例は画像データをエンコードしています。ただし、最初の42文字だけを表示しています。
記述例
<span id = "d01" > </span> <br>
<script>
document.getElementById('d01' ).textContent = window.btoa("ABCDE" );
try {
document.getElementById('d02' ).textContent = window.btoa("あいうえお" );
}
catch (e ) {
document.getElementById('d02' ).textContent = e ;
}
document.getElementById('d03' ).textContent = encode("あいうえお" );
function encode(str ) {
return window.btoa(unescape(encodeURIComponent(str )));
}
function enc() {
var canvas = document.createElement("canvas" );
canvas .width = 74;
canvas .height = 74;
var context = canvas .getContext("2d" ) ;
context .drawImage(image , 0, 0, 74, 74);
if (canvas .toBlob != undefined )
canvas .toBlob(function (result ) { set(result ); });
else
set(canvas .msToBlob());
}
function set(bin ) {
var file = new Blob([bin ], {'type' :'image/png' });
var reader = new FileReader();
reader .onload = function () {
var arr = new Uint8Array(reader .result);
var b = "" ;
for (var i = 0 ; i < 42 ; i ++) {
b += String.fromCharCode(arr [i ]);
}
document.getElementById('d04' ).textContent = window.btoa(b );
}
reader .readAsArrayBuffer(file );
}
</script>
<img id = "image" src = "bear.png" onload = "enc();" > <span id = "d04" > </span> <br>
ユニコードの文字列のエンコードでは、ほとんどのブラウザで例外が発生します(二つ目の例)。
実行例
(2)デコード
base64 エンコードされた文字列からバイナリデータなどを作成します。
window.atob(encoded )
base64 エンコードされた文字列からバイナリデータなどを作成する。
引数 encoded:base64 エンコードされた文字列
戻り値 :デコードされた元のデータ
二つ目の例の結果は、「(1)エンコード」で "あいうえお" をエンコードしたときに使用した unescape(encodeURIComponent("あいうえお")) そのものです。
よって、unescape(encodeURIComponent()) の逆のことをしなければ、"あいうえお" になりません。それが3つ目の例です。
四つ目の例は、エンコードされた画像データですが、ここではバイナリ値に変換しているのではなく、img 要素の src 属性に "data:image/png;base64," に続いて指定することで画像を表示しています。ちなみに下の例の画像は base64 エンコードされた文字列として 11256文字になります(記述例では省略してあります)。
記述例
<span id = "d01" > </span> <br>
<img id = "d04" >
<script>
document.getElementById('d01' ).textContent = window.atob("QUJDREU=" );
document.getElementById('d02' ).textContent = window.atob("44GC44GE44GG44GI44GK" );
document.getElementById('d03' ).textContent = decode("44GC44GE44GG44GI44GK" );
document.getElementById('d04' ).src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAABKCAYAAAAc ..." ;
function decode(str ) {
return decodeURIComponent(window.atob(str ).split('' ).map(function (c ) {
return '%' + ('00' + c .charCodeAt(0).toString(16)).slice(-2);
}).join('' ));
}
</script>
実行例
8.2 ナビゲータ(Navigator)
navigator オブジェクトを用いることで、スクリプトを実行しているアプリケーションについての情報を得ることができます。
navigator オブジェクトの主なプロパティとメソッドについて説明します。
プロパティ 値
appCodeNameR/O ブラウザの内部 "コード" ネーム ○ ○ ○ ○ ○ ○ ○ ○
appNameR/O ブラウザの正式名称 ○ ○ ○ ○ ○ ○ ○ ○
appVersionR/O ブラウザのバージョン ○ ○ ○ ○ ○ ○ ○ ○
userAgentR/O ブラウザに関する情報 ○ ○ ○ ○ ○ ○ ○ ○
記述例
<div id = "d1" > </div>
<script>
window.addEventListener('load' , function () {
document.getElementById("d1" ).textContent=navigator.appCodeName;
document.getElementById("d2" ).textContent=navigator.appName;
document.getElementById("d3" ).textContent=navigator.appVersion;
document.getElementById("d4" ).textContent=navigator.userAgent;
}, false );
</script>
実行例
ブラウザによる違い
appCodeName appName appVersion userAgent
Mozilla Netscape 5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0; HCTE; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko Mozilla/5.0 (Windows NT 10.0; WOW64; Trident /7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0; HCTE; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko
Mozilla Netscape 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge /18.18363
Mozilla Netscape 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg /111.0.1661.62
Mozilla Netscape 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36
Mozilla Netscape 5.0 (Windows) Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox /111.0
Mozilla Netscape 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 OPR/97.0.0.0 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 OPR /97.0.0.0
Mozilla Netscape 5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Sleipnir/6.4.22 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Sleipnir /6.4.22
Mozilla Netscape 5.0 (Windows NT 6.2) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2 Mozilla/5.0 (Windows NT 6.2) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2
ブラウザの区別に使えそうな文字列を赤字 で示してみました。なお、他のブラウザと判別されなくて、"Chrome" を含めば 、"Safari" を含めば とすれば良いかもしれません。
ブラウザの判定順
1. "Edge" → Edge
2. "Edg" → Chromium Edge
3. "Firefox" → Firefox
4. "OPR" → Opera
5. "Sleipnir" → Sleipnir
6. "Chrome" → Chrome
7. "Trident" → Internet Explorer
8. "Safari" → Safari
8.3 ヒストリ(History)
history オブジェクトを用いることで、ブラウザの履歴についての情報を得たり、履歴リストの中の URL のページへ移動することなどができます。
history オブジェクトの主なプロパティとメソッドについて説明します。
8.3.1 ヒストリ情報
プロパティ 値
lengthR/O ブラウザの履歴リストの中の URL の数 ○ ○ ○ ○ ○ ○ ○
記述例
<div id = "d1" > </div>
<script>
window.addEventListener('load' , function () {
document.getElementById("d1" ).textContent=history.length;
}, false );
</script>
実行例
8.3.2 移動
back()、forward() は、ブラウザの「戻る」「進む」と同様の機能になります。
history.forward()
ブラウザの履歴リストの中の次の URL に移動する。go(1) と同じ。
戻り値 :なし
history.back()
ブラウザの履歴リストの中の前の URL に移動する。go(-1) と同じ。
戻り値 :なし
history.go(number )
ブラウザの履歴リストの number 個先のページに移動する。
引数 number:履歴リスト中の番号(負の場合は前に、正の場合は次に移動する)
戻り値 :なし
記述例(ヒストリのボタン)
<div class = "switch" onclick = "history.back()" > ⇷</div>
<div class = "switch" onclick = "history.forward()" > ⇸</div>
まず、⇨ ボタンで、赤⇨緑⇨青の順に移動させてページをヒストリに残してください。
その後、⇷ ⇸ ボタンでヒストリを移動させてください。
実行例
8.3.3 変更
(1) 履歴の追加
history.pushState(state, title, url )
ブラウザの履歴を追加する。ただし、指定したURLの再読み込みは発生しないので、ページも遷移しない。
引数 state:状態と関連付けされた情報
引数 title:タイトル
引数 url:ブラウザに表示される URI
戻り値 :なし
次の例は、[戻る]ボタンをクリックしても、履歴に追加されている自分自身に戻ることになります。
記述例
<script>
history.pushState(null , null , null );
window.addEventListener("popstate" , function () {
history.pushState(null , null , null );
});
</script>
実行例をクリックしてください。別ウィンドウで「ヒストリ 1」を開きます。
その後、[⇨ ヒストリ 2] ボタンで「ヒストリ 2」へ移動させてください。「ヒストリ 2」では、履歴に自分自身(ヒストリ 2)を追加します。
「ヒストリ 2」では、ブラウザの[戻る]ボタンで「ヒストリ 1」には戻れません。履歴にある自分自身(ヒストリ 2)に移動します(つまり移動しない)。
もちろん、[⇨ ヒストリ 1] ボタンでは「ヒストリ 1」へ移動できます。また、「ヒストリ 1」のブラウザの[戻る]ボタンでも「ヒストリ 2」に戻れます。
(2) 履歴の置き換え
history.replaceState(state, title, url )
現在のセッション履歴を置き換える。
引数 state:状態と関連付けされた情報
引数 title:タイトル
引数 url:移動先の URI
戻り値 :なし
[戻る]ボタンをクリックしても、履歴が変更されているため、変更されたページに移動することになります。
記述例(b2.htm)
<script>
history.replaceState(null , null , 'b1.htm' );
</script>
実行例をクリックしてください。別ウィンドウで「ヒストリ 1」を開きます。
その後、[⇨ ヒストリ 2] ボタンで「ヒストリ 2」へ移動させ、さらに[⇨ ヒストリ 3] ボタンで「ヒストリ 3」へ移動させてください。
「ヒストリ 2」では、履歴を「ヒストリ 1」に変更しています。そのため、「ヒストリ 3」では、ブラウザの[戻る]ボタンで「ヒストリ 2」ではなく、「ヒストリ 1」に戻ることになります。
8.4 ロケーション(Location)
location オブジェクトを用いることで、現在表示しているアドレス(URL)に関する情報を得ることができます。
location オブジェクトの主なプロパティとメソッドについて説明します。
8.4.1 ロケーション情報
プロパティ 値
href 指定したURLへ移動、もしくは現在表示しているページのアドレス(URL) ○ ○ ○ ○ ○ ○ ○ ○
protocol URL のプロトコル ○ ○ ○ ○ ○ ○ ○ ○
host ホスト名とポート番号 ○ ○ ○ ○ ○ ○ ○ ○
hostname ホスト名 ○ ○ ○ ○ ○ ○ ○ ○
port ポート番号 ○ ○ ○ ○ ○ ○ ○ ○
pathname パス ○ ○ ○ ○ ○ ○ ○ ○
search URLの ? 以降の部分 ○ ○ ○ ○ ○ ○ ○ ○
hash URLの # 以降の部分 ○ ○ ○ ○ ○ ○ ○ ○
実行例
8.4.2 移動
location.assign(url)
指定したURLへ移動する。履歴は追加される(現在のページは記録される)
引数 url:移動するドキュメントの URL
戻り値 :なし
location.replace(url)
指定したURLへ移動する。履歴は上書きされる(現在のページは記録されない)
引数 url:移動するドキュメントの URL
戻り値 :なし
記述例
(2) のソース
<div class = "switch"
onclick = "location.assign('a3.htm');" > go</div>
(2) のソース
<div class = "switch"
onclick = "location.replace('b3.htm');" > go</div>
(3) のソース
<div class = "switch"
onclick = "history.back();" > back</div>
(3) のソース
<div class = "switch"
onclick = "history.back();" > back</div>
[go] ボタンをクリックして、(1)→(2)→(3) と進んでください。そして、(3) で [back] ボタンをクリックしてください。
左側は、(2)→(3) は location.assign('a3.htm'); を実行しているので、(2) の URL が履歴に残り、(3) で history.back(); したときには、(2) に戻ります。
右側は、(2)→(3) は location.replace('a3.htm'); を実行しているので、(2) の URL の履歴が (3) の URL で上書きされてしまい、(3) で history.back(); したときには、(1) に戻ることになります。
なお、もう一度実行したいときには、[最初から] ボタンをクリックしてください。
8.4.3 再読み込み
location.reload()
現在のページを再読み込みする
引数 なし
戻り値 :なし
記述例
<div class = "switch" onclick = "location.reload();" > リロード</div>
<span> リロード時刻:</span> <span id = "t" > </span>
<script>
let d = new Date();
document.getElementById("t" ).textContent = d.toLocaleString();
</script>
[リロード] ボタンをクリックすると、ドキュメントが再読み込みされ読み込まれた日時が表示されます。
実行例
8.5 ノード(Node)
Document や Element は Node を継承しています。よって、それらは次に挙げる Node のメソッドやプロパティも持っていることになります。
8.5.1 ノード情報
ノードが持つ主なプロパティです。
プロパティ 値
nodeNameR/O ノード名 ○ ○ ○ ○ ○ ○ ○ ○
localNameR/O ノードの修飾名のコロン(:)の後ろの部分 ○ ○ ○ ○ ○ ○ ○ ○
nodeTypeR/O ノードの種類
名称 値
ELEMENT_NODE 1
TEXT_NODE 3
PROCESSING_INSTRUCTION_NODE 7
COMMENT_NODE 8
DOCUMENT_NODE 9
DOCUMENT_TYPE_NODE 10
DOCUMENT_FRAGMENT_NODE 11
○ ○ ○ ○ ○ ○ ○ ○
nodeValue ノードの値 ○ ○ ○ ○ ○ ○ ○ ○
parentNodeR/O 親ノード ○ ○ ○ ○ ○ ○ ○ ○
parentElementR/O 親ノードの Element オブジェクト ○ ○ ○ ○ ○ ○ ○ ○
textContent そのノードおよびすべての子孫の全テキスト内容 ○ ○ ○ ○ ○ ○ ○ ○
childNodesR/O 子ノードリスト ○ ○ ○ ○ ○ ○ ○ ○
firstChildR/O 最初の子ノード、なければ null ○ ○ ○ ○ ○ ○ ○ ○
lastChildR/O 最後の子ノード、なければ null ○ ○ ○ ○ ○ ○ ○ ○
nextSiblingR/O ひとつ次の兄弟ノード、なければ null ○ ○ ○ ○ ○ ○ ○ ○
previousSiblingR/O ひとつ前の兄弟ノード、なければ null ○ ○ ○ ○ ○ ○ ○ ○
記述例
<html>
<head>
<meta charset = "UTF-8" >
<title> タイトル</title>
<script>
function dispNode(node , ind ) {
let s = ind + node .nodeName + "(" + node .nodeType + ")" ;
s += (node .nodeType == 1 ? node .localName : node .textContent);
for (let i = 0 ; i < node .childNodes.length ; i ++) {
s += dispNode(node .childNodes[i ], ind + " " );
}
return s ;
}
</script>
</head>
<body onload = "document.getElementById('d' ).textContent=dispNode(document, '');" >
<h1> 見出し</h1>
<p> <strong> 強調強調</strong> 本文本文 ... 本文</p>
<p> 本文本文 ... 本文</p>
<pre id = "d" style = "border:solid 1px gray" > </pre>
</body>
</html>
HTML の内容を下側の枠の中に表示しています。エレメントの場合は ノード名(ノードタイプ)ローカル名、その他は ノード名(ノードタイプ)テキスト内容 を表示しています。なお、#text(3) のみの行は改行だと思われます。
実行例
8.5.2 ノードの追加・削除
親要素へノードの追加、削除、置換、挿入をします。
ノード.appendChild(child)
ノードの最後に指定されたノード(child)を子要素として追加する。
引数 child:追加するノード
戻り値 :追加したノード
ノード.removeChild(child)
ノードから指定されたノード(child)を取り除く。
引数 child:削除するノード
戻り値 :取り除いたノード
ノード.replaceChild(newChild, oldChild)
ノードから元のノード(oldChild)を取り除き新しいノード(newChild)と置き換える。
引数 newChild:新しいノード
引数 oldChild:元のノード
戻り値 :元のノード
ノード.insertBefore(newChild, refChild)
ノードの子要素である参照ノード(refChild)の前に(参照ノードが null の場合は末尾に)新しいノード(newChild)を挿入する。
引数 newChild:新しいノード
引数 refChild:参照ノード
戻り値 :挿入したノード
記述例
<p id = "p1" > replacing node</p>
<p id = "p2" > removing node</p>
<div id = "initSwitch" class = "switch" onClick = "location.reload(false);" title = "初期状態" > 初期状態</div>
<div id = "appendSwitch" class = "switch" onClick = "append();" title = "追加" > 追加</div>
<div id = "insertSwitch" class = "switch" onClick = "insert();" title = "挿入" > 挿入</div>
<div id = "modifySwitch" class = "switch" onClick = "modify();" title = "変更" > 変更</div>
<div id = "removeSwitch" class = "switch" onClick = "remove();" title = "削除" > 削除</div>
<script>
function append() {
let p = document.createElement("p" );
p .textContent="appended node" ;
p .style.color="red" ;
document.body.appendChild(p );
}
function insert() {
let p = document.createElement("p" );
p .textContent="inserted node" ;
p .style.color="red" ;
let sw = document.getElementById("initSwitch" );
document.body.insertBefore(p , sw );
}
function modify() {
let p1 = document.getElementById("p1" );
let p = document.createElement("p" );
p .textContent="replaced node" ;
p .style.color="red" ;
document.body.replaceChild(p , p1 );
}
function remove() {
let p2 = document.getElementById("p2" );
document.body.removeChild(p2 );
}
</script>
ボタンをクリックすると、親要素である body のノードが追加、挿入、変更、削除されます。
なお、記述例では省略してありますが、同じボタンはクリックできないようにしてあります。
実行例
ノードを途中に挿入するためには、insertBefore しかありません。しかし、このメソッドは指定したノードの前に挿入します。
ノードの後ろに挿入するためには、nextSibling を使用し次のノードを得て、その前に挿入するようにします。
記述例
<div> ----------</div>
<div id = "target" > Target</div>
<div> ----------</div>
<script>
let div1 = document.createElement("div" );
div1 .textContent="before" ;
div1 .style.color="blue" ;
document.body.insertBefore(div1 , target );
let div2 = document.createElement("div" );
div2 .textContent="after" ;
div2 .style.color="red" ;
document.body.insertBefore(div2 , target .nextSibling);
</script>
実行例
8.5.3 ノードのチェック
ノードが存在するかどうかなどのチェックをします。
ノード.hasChildNodes()
子ノードを持つかどうかを返す。
戻り値 :あり(true)、なし(false)
ノード.contains(child)
特定の子ノードを持つかどうかを返す。
引数 child:調べたいノード
戻り値 :あり(true)、なし(false)
ノード.isEqualNode(Child)
指定のノードと等しいかどうかを返す。
引数 child:比較ノード
戻り値 :等しい(true)、等しくない(false)
記述例
<table id = "tb" style = "display:none;" >
<tr> <td> r1c1</td> <td id = "current" > r1c2</td> <td> r1c3</td> </tr>
<tr> <td> r1c1</td> <td> r1c2</td> <td> r1c3</td> </tr>
</table>
<div id = "d1" > </div>
<script>
let t = document.getElementById("tb" );
document.getElementById("d1" ).textContent = t .hasChildNodes();
let c = document.getElementById("current" );
document.getElementById("d2" ).textContent = t .contains(c );
let r = t .getElementsByTagName("tr" )[0];
document.getElementById("d3" ).textContent = r .childNodes[1].isEqualNode(c );
</script>
実行例
8.5.4 ノードのコピー
ノードをコピーします。ノードなどのオブジェクトは、単なる代入ではそのオブジェクトへの参照がコピー(シャローコピー)されるだけで、実体はコピーされません。したがって、代入の結果、コピー元とコピー先は同じオブジェクトを参照することになります。
cloneNode はノードの複製(ディープコピー)を返します。また、引数で true を指定した場合は子孫を含めた完全な複製を作成します。
ノード.cloneNode(deep)
ノードの複製を返す。
引数 deep:子孫ノードも含めてコピーするかどうか
戻り値 :子孫ノードもコピーする(true)、コピーしない(false)規定値
戻り値 :ノードの複製
appendChild は、document 上に存在するノードだと位置が移動するだけのようです。したがって、単に代入しただけの a0 はコピー元からコピー先(d0)に移動しています。
それに対して、cloneNode して複製を作成した a1 と a2 はコピー元が残ったままコピー先(d1 や d2)に複製されています。ただし、a1 はテキストを含めた子孫は複製していないので、テキストはコピーされていません。しかし、それだと何も分からないので、コピー元にスタイルシートで枠を描いています。枠はコピーされています。
記述例
<table>
<tr> <td> コピー先</td> <td> </td> <td> コピー元</td> </tr>
<tr> <td id = "d0" > </td> <td> ← </td> <td> <span style = "color:red;" > AAAAA</span> </td> </tr>
<tr> <td id = "d1" > </td> <td> ← </td> <td> <span style = "color:blue;double 3px gray;" > BBBBB</span> </td> </tr>
<tr> <td id = "d2" > </td> <td> ← </td> <td> <span style = "color:green;" > CCCCC</span> </td> </tr>
</table>
<script>
let a = document.querySelectorAll("span");
let a0 = a [0];
let a1 = a [1].cloneNode(false );
let a2 = a [2].cloneNode(true );
document.getElementById("d0" ).appendChild(a0 );
document.getElementById("d1" ).appendChild(a1 );
document.getElementById("d2" ).appendChild(a2 );
</script>
実行例
ただし、イベントハンドラは属性として記述されたもの(インラインイベントハンドラ)はコピーされます(一番目の例)が、Javascript で代入されたもの(二番目の例)や addEventListener で設定されたもの(三番目の例)はコピーされません。
文字列にマウスポインタを重ねてください。イベントハンドラが記述されているものは背景色が黄色くなります。
記述例
<table>
<tr> <td> コピー先</td> <td> </td> <td> コピー元</td> </tr>
<tr> <td id = "d0" > </td> <td> ← </td> <td> <span id = "a" onmouseenter = "this.style.backgroundColor='yellow';" onmouseleave = "this.style.backgroundColor='transparent';" > AAAAA</span> </td> </tr>
<tr> <td id = "d1" > </td> <td> ← </td> <td> <span id = "b" > BBBBB</span> </td> </tr>
<tr> <td id = "d2" > </td> <td> ← </td> <td> <span id = "c" > CCCCC</span> </td> </tr>
</table>
<script>
let a = document.getElementById("a");
let b = document.getElementById("b");
let c = document.getElementById("c");
b .onmouseenter = function () {this .style.backgroundColor='yellow' ;}
b .onmouseleave = function () {this .style.backgroundColor='transparent' ;}
c .addEventListener("mouseenter" , function () {this .style.backgroundColor='yellow' ;}, false );
c .addEventListener("mouseleave" , function () {this .style.backgroundColor='transparent' ;}, false );
document.getElementById("d0" ).appendChild(a .cloneNode(true ));
document.getElementById("d1" ).appendChild(b .cloneNode(true ));
document.getElementById("d2" ).appendChild(c .cloneNode(true ));
</script>
実行例
8.6 ドキュメント(Document)
document オブジェクトは表示している文書自体を示します。
なお、Document は Node を継承していますので、Node のプロパティや機能を使用することができます。
document オブジェクトの主なプロパティとメソッドについて説明します。
8.6.1 ドキュメント情報
(1) ドキュメント情報
プロパティ 値
URLR/O 文書のロケーション ○ ○ ○ ○ ○ ○ ○ ○
locationR/O 現在の document の URI ○ ○ ○ ○ ○ ○ ○ ○
characterSetR/O 適用されている文字セット(エンコーディング) ○ ○ ○ ○ ○ ○ ○ ○
doctypeR/O 文書型宣言 (DTD) ○ ○ ○ ○ ○ ○ ○ ○
lastModifiedR/O 最終更新日 ○ ○ ○ ○ ○ ○ ○ ○
記述例
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8" >
</head>
<body>
<div id = "d1" > </div>
<script>
document.getElementById('d1' ).textContent=document.URL;
document.getElementById('d2' ).textContent=document.location;
document.getElementById('d3' ).textContent=document.characterSet;
document.getElementById('d4' ).textContent=document.doctype.name;
document.getElementById('d5' ).textContent=document.lastModified;
</script>
</body>
</html>
実行例
(2) HTML情報
プロパティ 値
headR/O head 要素のリスト ○ ○ ○ ○ ○ ○ ○ ○
title title 要素 ○ ○ ○ ○ ○ ○ ○ ○
styleSheetsR/O すべての stylesheet 要素のリスト ○ ○ ○ ○ ○ ○ ○ ○
scriptsR/O すべての script 要素のリスト ○ ○ ○ ○ ○ ○ ○ ○
body body 要素 ○ ○ ○ ○ ○ ○ ○ ○
formsR/O form 要素のリスト ○ ○ ○ ○ ○ ○ ○ ○
linksR/O すべてのハイパーリンクのリスト ○ ○ ○ ○ ○ ○ ○ ○
imagesR/O 画像のリスト ○ ○ ○ ○ ○ ○ ○ ○
記述例
<!DOCTYPE html>
<html>
<head>
<title> タイトル</title>
<style>
</style>
<script>
</script>
</head>
<body>
<form name = "f1" > </form>
<a href = "another.htm" > aaa</a>
<img src = "figures/bear.png" >
<div id = "d1" > </div>
<script>
document.getElementById('d1' ).textContent=document.head.nodeName;
document.getElementById('d2' ).textContent=document.title;
document.getElementById('d3' ).textContent=document.styleSheets.length;
document.getElementById('d4' ).textContent=document.scripts.length;
document.getElementById('d5' ).textContent=document.body.nodeName;
document.getElementById('d6' ).textContent=document.forms[0].name;
document.getElementById('d7' ).textContent=document.links[0].href;
document.getElementById('d8' ).textContent=document.images[0].src;
</script>
</body>
</html>
forms、links、images は最初の要素を表示しています。
実行例
8.6.2 ドキュメント出力
(1) open
document.open()
ドキュメントを開いて書込み可能にする。
戻り値 :なし
記述例
document.open();
(2) close
document.close()
ドキュメントへの書き込みを閉じる。
戻り値 :なし
記述例
document.open();
document.close();
(3)write、writeln
document.write(string)
ドキュメントに文字列を出力する。
引数 string:出力文字列
戻り値 :なし
document.writeln(string)
ドキュメントに文字列と改行文字を出力する。
ただし、改行要素 <br> ではないため、表示上は改行されない。
引数 string:出力文字列
戻り値 :なし
記述例
document.open();
document.write("今は、" );
let t = new Date();
document.writeln(t.toLocaleTimeString() + "です。" );
document.close();
実行例
8.6.3 ドキュメント要素
(1) getElementById、getElementsByName、getElementsByTagName、getElementsByClassName
id や name、class などの属性、あるいは 要素名をドキュメント内から検索し、見つかった要素を取得することができます。なお、見つからない場合には、null 値となります。
document.getElementById(id)
特定の id 属性値を持つ要素を得る。
引数 id:id 属性値
戻り値 :要素(Element)
document.getElementsByName(name)
特定の name 属性値を持つ要素を得る。
引数 name:name 属性値
戻り値 :要素(Element)のリスト
document.getElementsByTagName(tag)
特定のタグの要素を得る。
引数 tag:タグ名
戻り値 :要素(Element)のリスト
document.getElementsByClassName(class)
特定の(スタイルシートの) class 属性値を持つ要素を得る。
引数 class:class 属性値
戻り値 :要素(Element)のリスト
記述例
<div id = "sw1" class = "switch" > スイッチ1</div> <div id = "sw2" class = "switch x" > スイッチ2</div>
<form action = "#" >
<input type = "radio" name = "option" value = "1" > 選択1
<input type = "radio" name = "option" value = "2" > 選択2
<input type = "radio" name = "option" value = "3" checked > 選択3
</form>
<div id = "d1" > </div>
<script>
document.getElementById('d1' ).textContent=document.getElementById("sw1" ).textContent;
document.getElementById('d2' ).textContent=document.getElementsByName("option" )[0].checked;
document.getElementById('d3' ).textContent=document.getElementsByTagName("input" )[2].checked;
document.getElementById('d4' ).textContent=document.getElementsByClassName("switch x" )[0].textContent;
</script>
実行例
なお、たいていのブラウザでは、次のように id を変数のように使用して getElementById と同様に id の要素を得ることもできます。
記述例
<div id = "x" > x の内容</div>
<div id = "d1" > </div>
<div id = "d2" > </div>
<script>
document.getElementById('d1' ).textContent = document.getElementById('x' ).textContent;
document.getElementById('d2' ).textContent = x.textContent;
</script>
実行例
(2) createElement、createElementNS
document.createElement(tag)
指定されたタグ要素を新たに作成する。
引数 tag:タグ名
戻り値 :要素(Element)
記述例
<form name = "F1" action = "#" >
<select name = "S1" size = "3" >
<option> AAA
<option> BBB
</select>
</form>
<script>
let elm = document.createElement("option" );
elm .text = "CCC" ;
document.F1.S1.add(elm );
</script>
実行例
SVG 要素などの作成には名前空間を指定する必要があるので、次のメソッドを使用します。
document.createElementNS(namespace, tag)
指定された名前空間にタグ要素を新たに作成する。
引数 namespace:名前空間URI(例えば、SVGは http://www.w3.org/2000/svg)
引数 tag:タグ名
戻り値 :要素(Element)
記述例
<svg id = "svg" viewbox = "0,0 50 50" width = "50" height = "50" > </svg>
<script>
let circle = document.createElementNS("http://www.w3.org/2000/svg" , "circle" );
circle .setAttribute("cx" , 30);
circle .setAttribute("cy" , 30);
circle .setAttribute("r" , 20);
circle .setAttribute("fill" , "green" );
document.getElementById("svg" ).appendChild(circle );
</script>
実行例
(3) createTextNode
document.createTextNode(text)
文字列を新たに作成する。
引数 text:文字列
戻り値 :テキストノード
記述例
<p id = "p1" > </p>
<script>
let textnode = document.createTextNode("<div>foo</div>" );
document.getElementById("p1" ).appendChild(textnode );
</script>
実行例
(4) querySelector、querySelectorAll
引数で指定したセレクタ (id や name、class などの属性、あるいは 要素名などのスタイルシートを適用する対象)や結合子 と一致する要素をドキュメント内から検索し、見つかった要素を取得することができます。また、見つからない場合には、null 値となります。
なお、単純な検索ならば getElementById などを使用した方が速いようです。
document.querySelector(セレクタ)
セレクタ に一致する最初の要素を得る。
引数 セレクタ:スタイルシートで指定するセレクタ(と結合子)と同じ (ただし、"," 区切りで複数指定した場合はいずれかと一致するという意味になる)
戻り値 :要素(Element)
document.querySelectorAll(セレクタ)
セレクタ に一致する要素をすべて得る。
引数 セレクタ:スタイルシートで指定するセレクタ(と結合子)と同じ (ただし、"," 区切りで複数指定した場合はいずれかと一致するという意味になる)
戻り値 :要素(Element)のリスト
記述例
<div id = "sw1" class = "switch" > スイッチ1</div> <div id = "sw2" class = "switch x" > スイッチ2</div>
<form action = "#" >
<input type = "radio" name = "option" value = "1" > 選択1
<input type = "radio" name = "option" value = "2" > 選択2
<input type = "radio" name = "option" value = "3" checked > 選択3
</form>
<div id = "d1" > </div>
<script>
document.getElementById('d1' ).textContent=document.querySelector("#sw1" ).textContent;
document.getElementById('d2' ).textContent=document.querySelector("input" ).checked;
document.getElementById('d3' ).textContent=document.querySelectorAll("input" )[2].checked;
document.getElementById('d4' ).textContent=document.querySelector(".switch, .x" ).textContent;
</script>
4つ目の ".switch, .x" では、クラス名が "switch" または "x" に一致する最初の要素である "スイッチ1" が得られます(switch と x の AND 条件ではありません)。
実行例
なお、(1)の getElementsByName などと (4)の querySelector などは、ほとんど同じように使用することができますが、一つ大きな違いがあります。それは、getElementsByName、getElementsByTagName、getElementsByClassName で得られた要素のリストは、それらの要素に追加・削除があった場合はリストの内容も作り変えられますが、querySelector、querySelectorAll で得られた要素のリストは作り変えられないということです。
ただし、要素の内容の変更はどちらも反映されます。
記述例
<span id = "e1" > 11111</span> <span id = "e2" > 22222</span> <br>
<span id = "d11" > </span> <span id = "d12" > </span>
<span id = "d21" > </span> <span id = "d22" > </span>
<script>
let g = document.getElementsByTagName("span" );
let q = document.querySelectorAll("span" );
let e1 = document.getElementById("e1" );
document.body.removeChild(e1 );
document.getElementById('d11' ).textContent = g [0].textContent;
document.getElementById('d21' ).textContent = q [0].textContent;
document.getElementById('e2' ).textContent = "00000" ;
document.getElementById('d12' ).textContent = g [0].textContent;
document.getElementById('d22' ).textContent = q [1].textContent;
</script>
e1 を削除して、e2 の内容を "00000" に変更しています。
その結果、getElementsByTagName で取得した g 内の最初の要素も削除され2番目の "22222" が最初の要素になっています。それに対して、querySelectorAll で取得した q は変更されず "11111" が最初の要素になっています。
ただし、要素の内容の変更は反映されるようで、e2 の内容はともに "00000" となっています。
実行例
8.6.4 フォーカス
(1) hasFocus
文書または文書内の何れかの要素がフォーカスを持っているかどうかを示します。
document.hasFocus()
文書または文書内の何れかの要素がフォーカスを持っているかどうかを示す。
引数 なし
戻り値 :文書内のアクティブ要素にフォーカスがある(true)、ない(false)
下の例は iframe 要素の中に HTML文書があるので、最初はフォーカスを持っていませんので false と表示されます。
枠の中をクリックしてみてください。フォーカスを得て true と表示されます。
枠の外か他のウィンドウをクリックすると、フォーカスが移り false と表示されます。
記述例
<span id = "d1" > </span> <br>
<script>
setInterval(function () {
document.getElementById("d1" ).textContent = document.hasFocus();
}, 1000);
</script>
実行例
8.6.5 イベント
(1) createEvent
指定されたタイプの イベント を作成します。返されるオブジェクトは初めに初期化する必要があり、その後で dispatchEvent へ渡すことができます。
ただし、初期化するための初期化メソッドのいくつかは廃止予定となっています。また、 Internet Explorer 以外の多くのブラウザは、イベントオブジェクトの生成に new Event や new MouseEvent などが用意されているので、createEvent は使用しない方が良いでしょう。
document.createEvent(type)
特定の id 属性値を持つ要素を得る。
引数 type:id イベントタイプ
イベントタイプ イベントモジュール 初期化メソッド
"UIEvents" ユーザインタフェースイベントモジュール event.initUIEvent(注1)
"MouseEvents" マウスイベントモジュール event.initMouseEvent(注1)
"MutationEvents"(注2) 変異イベントモジュール event.initMutationEvent
"HTMLEvents" HTML イベントモジュール event.initEvent(注1)
戻り値 :イベント(Event)
注1)廃止予定となっているので使用しない方が良い
注2)MutationEvent 自体が廃止予定となっているので使用しない方が良い
click イベントを生成し、セレクト、チェックボックス、ボタンに送っています。click イベントを受け取った要素は直接クリックされたのと同じように動作します。
ちなみに、セレクトはクリックされるとランダムに項目を選択します。
記述例
<select id = "select" ><option> aaa<option> bbb<option> ccc</select> <div = "sw1" class = "switch" onclick = "fire();" > クリック</div>
<input id = "check" type = "checkbox" > <br>
<button id = "button" style = "width:5em;" > 今の日時</button> <span id = "date" > </span>
<script>
document.getElementById("select" ).addEventListener("click" , function (){ this .selectedIndex=parseInt(Math.random() * 3); });
document.getElementById("button" ).addEventListener("click" , dispDate);
function dispDate(event ) {
let d = new Date(event .timeStamp);
document.getElementById("date" ).textContent=d .toLocaleString();
}
function fire() {
let evt = document.createEvent("HTMLEvents" );
evt .initEvent("click" , true , true );
document.getElementById("select" ).dispatchEvent(evt );
document.getElementById("check" ).dispatchEvent(evt );
document.getElementById("button" ).dispatchEvent(evt );
}
</script>
「クリック」ボタンをクリックしてみてください。セレクト、チェックボックス、ボタンの状態が変わります。
実行例
は、デフォルトの機能が実行されない(?)ようでチェックボックスが変化しません(ただし、Event オブジェクトを new MouseEvent() などで生成すれば変化します)。
は、timeStamp は正しく設定されません。
8.7 エレメント(Element)
element オブジェクトは Document の一部分を表現します。
なお、Element は Node を継承していますので、Node のプロパティや機能を使用することができます。
element オブジェクトの主なプロパティとメソッドについて説明します。
8.7.1 エレメント情報
(1) エレメント情報
プロパティ 値
attributesR/O すべての属性のリスト ○ ○ ○ ○ ○ ○ ○ ○
className class(スタイルシート)属性値 ○ ○ ○ ○ ○ ○ ○ ○
classListR/O class 属性のリスト ○ ○ ○ ○ ○ ○ ○ ○
dataset 独自データ属性(data- の後ろの文字列。ただし、- を削除し、その後ろの文字を大文字にした名前のメンバーを持つ) ○ ○ ○ ○ ○ ○ ○ ○
id id ○ ○ ○ ○ ○ ○ ○ ○
innerHTML 要素内容(HTML を含む) ○ ○ ○ ○ ○ ○ ○ ○
innerText 自身の要素内容(HTML を含まない)を設定、または自身と子孫のすべての要素内容(HTML を含まない)を取得する ○ ○ ○ ○ ○ ○ ○ ○
style style 属性のリスト ○ ○ ○ ○ ○ ○ ○ ○
tagNameR/O 要素のタグ名 ○ ○ ○ ○ ○ ○ ○ ○
textContent 自身の要素内容(HTML を含まない)を設定、または自身と子孫のすべての要素内容(HTML を含まない)を取得する ○ ○ ○ ○ ○ ○ ○ ○
title title 属性値 ○ ○ ○ ○ ○ ○ ○ ○
記述例
<div id = "id1" class = "c1 c2 c3" style = "display:none;" title = "title1" > <SPAN STYLE='COLOR:RED;'> XXX</SPAN> YYY</div>
<div id = "id2" data-my-rank = "プレミアム" data-max-number = "10" style = "display:none;" > ZZZ</div>
<div id = "d1" > </div>
<script>
function dispList(list ) {
let s = "" ;
for (let i = 0 ; i < list .length ; i++)
s += list [i] + " " ;
return s ;
}
function dispStyle(style ) {
let s = "" ;
for (let i = 0 ; i < style .length ; i++) {
let t = style [i];
s += t + "(" + style [t ] + ") " ;
}
return s ;
}
function dispAttr(attr ) {
let s = "" ;
for (let i = 0 ; i < attr .length ; i++)
s += attr [i].name + "(" + attr [i].value + ") " ;
return s ;
}
let e = document.getElementById("id1" );
document.getElementById("d1" ).textContent=e .id;
document.getElementById("d2" ).textContent=e .tagName;
document.getElementById("d3" ).textContent=e .title;
document.getElementById("d4" ).textContent=e .className;
document.getElementById("d5" ).textContent=dispList(e .classList);
document.getElementById("d6" ).textContent=dispStyle(e .style);
document.getElementById("d7" ).textContent=e .innerHTML;
document.getElementById("d8" ).textContent=e .innerText;
document.getElementById("d9" ).textContent=e .textContent;
document.getElementById("d10" ).textContent=dispAttr(e .attributes);
e = document.getElementById("id2" );
document.getElementById("d21" ).textContent=e .dataset.myRank;
document.getElementById("d22" ).textContent=e .dataset.maxNumber;
</script>
innerHTML はタグを含みますが、innerText や textContent は含みません。
ただし、innerHTML に含まれる要素名や属性名は小文字に、また、引用符はダブルクォテーションになりますので、注意してください。
実行例
また、innerText は元来 独自の属性なので、他のブラウザでも記述はできますが、若干の違いがあります。
それに対して、textContent は、ブラウザによる違いがほとんどありませんので innerText ではなく、textContent を使用するようにした方が良いでしょう。
記述例
<div id = "str" style = "display:none" > A B
C</div>
<table>
<tr> <td id = "d01" > </td> <td id = "d02" > </td> <td> = </td> <td> undefined</td> </tr>
<tr> <td id = "d11" > </td> <td id = "d12" > </td> <td> = </td> <td> null</td> </tr>
<tr> <td id = "d21" style = "white-space:normal;" > </td> <td id = "d22" style = "white-space:normal;" > </td> <td> = </td> <td> innerText</td> </tr>
<tr> <td id = "d31" style = "white-space:pre;" > </td> <td id = "d32" style = "white-space:pre;" > </td> <td> = </td> <td> textContent</td> </tr>
</table>
<br>
<table>
<tr> <td id = "d1" style = "white-space:pre;" > </td> <td> = </td> <td> innerText</td> </tr>
<tr> <td id = "d2" style = "white-space:pre;" > </td> <td> = </td> <td> textContent</td> </tr>
</table>
<script>
window.addEventListener("load" , function () {
document.getElementById('d01' ).innerText=undefined ;
document.getElementById('d02' ).textContent=undefined ;
document.getElementById('d11' ).innerText=null ;
document.getElementById('d12' ).textContent=null ;
let s = "\tA B\nC" ;
document.getElementById('d21' ).innerText=s ;
document.getElementById('d22' ).textContent=s ;
document.getElementById('d31' ).innerText=s ;
document.getElementById('d32' ).textContent=s ;
document.getElementById('d1' ).innerHTML=document.getElementById('str' ).innerText;
document.getElementById('d2' ).innerHTML=document.getElementById('str' ).textContent;
} , false );
</script>
前半部分では代入される側(左辺)が innerText と textContent でどう違うのかを示しています。スタイルシートの white-space 属性の値によっても違うようです。ちなみに、代入している文字列は "(タブ)A(連続した空白)B(改行)C" です。
後半部分は、代入する側(右辺)が innerText と textContent でどう違うのかを示しています。代入するエレメントの内容はやはり "(タブ)A(連続した空白)B(改行)C" です。
実行例
(2) クライアント情報
プロパティ 値
clientHeightR/O ボーダー、スクロールバーを含まない要素全体の高さ ○ ○ ○ ○ ○ ○ ○ ○
clientLeftR/O 左ボーダー ○ ○ ○ ○ ○ ○ ○ ○
clientTopR/O 上ボーダー ○ ○ ○ ○ ○ ○ ○ ○
clientWidthR/O ボーダー、スクロールバーを含まない要素全体の横幅 ○ ○ ○ ○ ○ ○ ○ ○
記述例
<style>
div.parent {
background-color:lightcyan;
width:255px;
padding:15px 15px;
}
div.child {
background-color:lawngreen;
height:60px;
width:100px;
margin:10px 40px 20px 30px;
border-top:solid 15px limegreen;
border-bottom:solid 25px limegreen;
border-left:solid 35px limegreen;
border-right:solid 45px limegreen;
overflow: scroll;
}
</style>
<div id = "parent" class = "parent" > <div id = "child" class = "child" > XXXXXXXXXX<br> YYYYYYYYYY<br> ZZZZZZZZZZ</div> </div>
<div id = "d1" > </div>
<script>
let c = document.getElementById("child" );
document.getElementById("d1" ).textContent=c .clientTop;
document.getElementById("d2" ).textContent=c .clientLeft;
document.getElementById("d3" ).textContent=c .clientHeight;
document.getElementById("d4" ).textContent=c .clientWidth;
</script>
矢印や文字列は理解の助けになるように別途表示しています。
破線の矩形は child のマージン範囲を示すために別途表示しています。
実行例
(3) オフセット情報
プロパティ 値
offsetParentR/O オフセット座標の基準となる要素 (position属性が relative、absolute または fixed である直近の祖先要素) ○ ○ ○ ○ ○ ○ ○ ○
offsetHeightR/O ボーダーを含む要素全体の高さ ○ ○ ○ ○ ○ ○ ○ ○
offsetLeftR/O 水平方向のオフセット ○ ○ ○ ○ ○ ○ ○ ○
offsetTopR/O 垂直方向のオフセット ○ ○ ○ ○ ○ ○ ○ ○
offsetWidthR/O ボーダーを含む要素全体の横幅 ○ ○ ○ ○ ○ ○ ○ ○
記述例
<style>
div.grandParent {
background-color:lavenderblush;
width:250px;
padding:10px 40px 20px 30px;
}
div.parent {
background-color:lightcyan;
padding:15px 0px 25px 35px;
}
div.child {
background-color:lawngreen;
width:50px;
margin:12px 42px 22px 32px;
border:solid 10px limegreen;
}
</style>
<div id = "grandParent" class = "grandParent" style = "position:relative;" > <div id = "parent" class = "parent" > <div id = "child" class = "child" > XXX</div> </div> </div>
<div id = "d1" > </div>
<script>
let c = document.getElementById("child" );
document.getElementById("d1" ).textContent=c .offsetParent.id;
document.getElementById("d2" ).innerHTML=c .offsetTop;
document.getElementById("d3" ).innerHTML=c .offsetLeft;
document.getElementById("d4" ).innerHTML=c .offsetHeight;
document.getElementById("d5" ).innerHTML=c .offsetWidth;
</script>
parent の要素にはありませんが、grandParent の要素には relative である position属性 がありますので、child の要素のオフセットの基準は grandParent の要素になります。
矢印や文字列は理解の助けになるように別途表示しています。
破線の矩形は child のマージン範囲を示すために別途表示しています。
実行例
プロパティ 値
scrollHeightR/O 全体を表示するのに必要な高さ ○ ○ ○ ○ ○ ○ ○ ○
scrollLeftR/O 表示されている部分の、要素の左端からの水平方向のオフセット ○ ○ ○ ○ ○ ○ ○ ○
scrollTopR/O 表示されている部分の、要素の上端からの垂直方向のオフセット ○ ○ ○ ○ ○ ○ ○ ○
scrollWidthR/O 全体を表示するのに必要な横幅 ○ ○ ○ ○ ○ ○ ○ ○
記述例
<style>
div.scroll {
background-color:lawngreen;
height:50px;
width:50px;
overflow: scroll;
}
</style>
<div id = "scroll" class = "scroll" > A123456789<br> BB12345678<br> CCC1234567<br> DDDD123456<br>
EEEEE12345<br> FFFFFF1234<br> GGGGGGG123<br> HHHHHHHH12<br> IIIIIIIII1</div>
<div id = "d1" > </div>
<script>
let s = document.getElementById("scroll" );
document.getElementById("d1" ).textContent=s .scrollTop;
document.getElementById("d2" ).textContent=s .scrollLeft;
document.getElementById("d3" ).textContent=s .scrollHeight;
document.getElementById("d4" ).textContent=s .scrollWidth;
</script>
左側の要素をスクロールさせると、スクロール情報が変化します。
右側の要素は、スクロール情報を説明するために別途表示しています。
実行例
8.7.2 エレメントの要素
(1) getElementById、getElementsByClassName、getElementsByTagName、getElementsByTagNameNS
svgにgetElementsByClassNameがない
id や 要素名を特定の要素内から検索し、見つかった要素を取得することができます。なお、見つからない場合には、null 値となります。
エレメントオブジェクト.getElementById(id)
特定の id 属性値を持つ要素を得る。
ただし、このメソッドは一般的な HTML 要素にはないが、SVG 要素にはある。
引数 id:id 属性値
戻り値 :要素(Element)
エレメントオブジェクト.getElementsByClassName(class)
特定のクラス名を持つ要素を得る。
ただし、このメソッドは一般的な要素にはあるが、SVG 要素にはない。
引数 class:クラス名
戻り値 :要素(Element)のリスト
エレメントオブジェクト.getElementsByTagName(tag)
特定のタグの要素を得る。
引数 tag:タグ名
戻り値 :要素(Element)のリスト
記述例
<ol id = "ol" style = "display:inline-block;" >
<li id = "li1" > aaaaa</li>
<li id = "li2" > bbbbb</li>
<li id = "li3" class = "emphasis" > ccccc</li>
</ol>
<svg id = "svg" viewbox = "0,0 150 90" width = "150" height = "90" >
<image id = "image1" class = "emphasis" x = "50" y = "10" width = "74" height = "74" xlink:href = "figures/bear.png" />
</svg>
<div id = "d11" > </div> <div id = "d12" > </div>
<script>
let o = document.getElementById('ol' );
let s = document.getElementById('svg' );
document.getElementById('d11' ).textContent="未実装" ;
document.getElementById('d12' ).textContent=s .getElementById("image1" ).tagName;
document.getElementById('d21' ).textContent=o .getElementsByClassName("emphasis" )[0].tagName;
try {
document.getElementById('d22' ).textContent=s .getElementsByClassName("emphasis" )[0].tagName;
}
catch (x ) {
document.getElementById('d22' ).textContent=x .message;
}
document.getElementById('d31' ).textContent=o .getElementsByTagName("li" )[0].id;
document.getElementById('d32' ).textContent=s .getElementsByTagName("image" )[0].id;
</script>
ol 要素には getElementById はありません。ol 要素のような通常の HTML 要素の ID はドキュメントでユニークである必要があります。そのため、要素ごとに探す必要はなく document.getElementById を使用すれば目的の ID を持つ要素を得られます。
の svg 要素には getElementByClassName がないので例外が発生します。名前空間を指定した getElementsByTagNameNS を使用します。
実行例
SVG 要素内の要素の ID は SVG ごとにユニークである必要はありますが、ドキュメント全体でユニークである必要はありません(他の SVG で使用されている ID を使用しても構いません)。そのため、要素ごとに探す必要があります。
記述例
<svg id = "svg1" viewbox = "0,0 150 110" width = "150" height = "110" >
<image id = "image1" x = "50" y = "20" width = "74" height = "74" xlink:href = "figures/bear.png" />
<circle id = "circle1" cx = "30" cy = "40" r = "20" fill = "green" >
</svg>
<svg id = "svg2" viewbox = "0,0 150 110" width = "150" height = "110" >
<image id = "image1" x = "50" y = "20" width = "74" height = "74" xlink:href = "figures/bear2.png" />
<circle id = "circle2" cx = "30" cy = "40" r = "20" fill = "green" >
</svg>
<div id = "d11" > </div> <div id = "d12" > </div>
<div id = "d21" > </div> <div id = "d22" > </div>
<script>
let s1 = document.getElementById('svg1' );
let s2 = document.getElementById('svg2' );
document.getElementById('d11' ).textContent=s1 .getElementById("image1" ).tagName;
document.getElementById('d12' ).textContent=s2 .getElementById("image1" ).tagName;
document.getElementById('d21' ).textContent=s1 .getElementById("circle1" ).tagName;
try {
document.getElementById('d22' ).textContent=s2 .getElementById("circle1" ).tagName;
}
catch (x ) {
document.getElementById('d22' ).textContent=x .message;
}
</script>
image1 は svg1 にも svg2 にもありますが、circle1 は svg2 にはありませんので例外が発生します。
なお、色のついた文字列は説明のために別途表示しています。
実行例
名前空間を指定する場合は次のメソッドを使用します。
エレメントオブジェクト.getElementsByTagNameNS(namespace, tag)
指定された名前空間内の特定のタグの要素を得る。
引数 namespace:名前空間URI(例えば、HTML は http://www.w3.org/1999/xhtml、SVG は http://www.w3.org/2000/svg)
引数 tag:タグ名、*(すべて)
戻り値 :要素(Element)のリスト
記述例
<ol id = "ol" style = "display:inline-block;" >
<li id = "li1" > aaaaa</li>
<li id = "li2" > bbbbb</li>
<li id = "li3" > ccccc</li>
</ol>
<svg id = "svg" viewbox = "0,0 250 90" width = "250" height = "90" >
<image id = "image1" x = "50" y = "10" width = "74" height = "74" xlink:href = "figures/bear.png" />
<image id = "image2" x = "130" y = "10" width = "74" height = "74" xlink:href = "figures/bear2.png" />
</svg>
<div id = "d11" > </div> <div id = "d12" > </div>
<script>
let o = document.getElementById('ol' );
let s = document.getElementById('svg' );
document.getElementById('d11' ).textContent=o .getElementsByTagNameNS(
"http://www.w3.org/1999/xhtml" , "li" )[1].id;
document.getElementById('d12' ).textContent=s .getElementsByTagNameNS(
"http://www.w3.org/2000/svg" , "image" )[1].id;
</script>
実行例
(2) querySelector、querySelectorAll
引数で指定したセレクタ (id や name、class などの属性、あるいは 要素名などのスタイルシートを適用する対象)や結合子 と一致する要素をドキュメント内から検索し、見つかった要素を取得することができます。また、見つからない場合には、null 値となります。
なお、単純な検索ならば getElementById などを使用した方が速いようです。
エレメントオブジェクト.querySelector(セレクタ)
セレクタ に一致する最初の要素を得る。
引数 セレクタ:スタイルシートで指定するセレクタ(と結合子)と同じ (ただし、"," 区切りで複数指定した場合はいずれかと一致するという意味になる)
戻り値 :要素(Element)
エレメントオブジェクト.querySelectorAll(セレクタ)
セレクタ に一致する要素をすべて得る。
引数 セレクタ:スタイルシートで指定するセレクタ(と結合子)と同じ (ただし、"," 区切りで複数指定した場合はいずれかと一致するという意味になる)
戻り値 :要素(Element)のリスト
記述例
<ol id = "ol" style = "display:inline-block;" >
<li id = "li1" > aaaaa</li>
<li id = "li2" class = "emphasis" > bbbbb</li>
<li id = "li3" class = "emphasis x" > ccccc</li>
</ol>
<div id = "d1" > </div>
<script>
let ol = document.getElementById("ol" );
document.getElementById('d1' ).textContent=ol .querySelector("#li1" ).textContent;
document.getElementById('d2' ).textContent=ol .querySelector("li" ).textContent;
document.getElementById('d3' ).textContent=ol .querySelectorAll("li" )[2].textContent;
document.getElementById('d4' ).textContent=ol .querySelector(".emphasis, .x" ).textContent;
</script>
4つ目の ".emphasis, .x" では、クラス名が "emphasis" または "x" に一致する最初の要素である "bbbbb" が得られます(emphasis と x の AND 条件ではありません)。
実行例
なお、(1)の getElementsByName などと (2)の querySelector などは、ほとんど同じように使用することができますが、一つ大きな違いがあります。それは、getElementsByName、getElementsByTagName、getElementsByClassName で得られた要素のリストは、それらの要素に追加・削除があった場合はリストの内容も作り変えられますが、querySelector、querySelectorAll で得られた要素のリストは作り変えられないということです。
ただし、要素の内容の変更はどちらも反映されます。
記述例
<ol id = "ol" style = "display:inline-block;" >
<li id = "li1" > aaaaa</li>
<li id = "li2" > bbbbb</li>
<li id = "li3" > ccccc</li>
</ol>
<span id = "d11" > </span> <span id = "d12" > </span>
<script>
let ol = document.getElementById("ol" );
let g = ol .getElementsByTagName("li" );
let q = ol .querySelectorAll("li" );
let li1 = document.getElementById("li1" );
ol .removeChild(li1 );
document.getElementById('d11' ).textContent=g [0].textContent;
document.getElementById('d21' ).textContent=q [0].textContent;
document.getElementById("li2" ).textContent = "xxxxx" ;
document.getElementById('d12' ).textContent=g [0].textContent;
document.getElementById('d22' ).textContent=q [1].textContent;
</script>
li1 を削除して、li2 の内容を "xxxxx" に変更しています。
その結果、getElementsByTagName で取得した g 内の最初の要素も削除され2番目の "bbbbb" が先頭の要素になっています。それに対して、querySelectorAll で取得した q は変更されず "aaaaa" が先頭の要素になっています。
ただし、要素の内容の変更は反映されるようで、li2 の内容はともに "xxxxx" となっています。
実行例
8.7.3 エレメントの属性
(1) hasAttribute、hasAttributeNS、hasAttributes
エレメントオブジェクト.hasAttribute(name)
指定の属性を持つかどうかを返す。
引数 name:属性名
戻り値 :あり(true)、なし(false)
エレメントオブジェクト.hasAttributes()
何らかの属性を持つかかどうかを返す。
戻り値 :あり(true)、なし(false)
記述例
<div id = "id1" class = "c1 c2 c3" style = "display:none;" > XXX</div>
<div id = "d1" > </div>
<script>
let e = document.getElementById("id1" );
document.getElementById("d1" ).textContent=e .hasAttributes();
document.getElementById("d2" ).textContent=e .hasAttribute("class" );
document.getElementById("d3" ).textContent=e .hasAttribute("xxx" );
</script>
class という属性はあるので true、xxx はないので false になります。
実行例
SVG 要素などが属性を持つかどうかを調べるには名前空間を指定する必要があるので、次のメソッドを使用します。
エレメントオブジェクト.hasAttributeNS(namespace, name)
指定された名前空間に指定の属性を持つかどうかを返す。
引数 namespace:名前空間URI(例えば、XLink は http://www.w3.org/1999/xlink)
引数 name:属性名
戻り値 :あり(true)、なし(false)
SVG での HREF は、名前空間が http://www.w3.org/1999/xlink に定義されています。そのため、参照するには、hasAttributeNS メソッドを使用し名前空間を指定する必要があります。
記述例
<svg id = "svg" viewbox = "0,0 150 90" width = "150" height = "90" >
<image id = "image" x = "50" y = "10" width = "74" height = "74" xlink:href = "figures/bear.png" />
</svg>
<div id = "d1" > </div>
<script>
let img = document.getElementById("image" );
document.getElementById("d1" ).textContent=img .hasAttributeNS("http://www.w3.org/1999/xlink" , "href" );
document.getElementById("d2" ).textContent=img .hasAttributeNS("http://www.w3.org/1999/xlink" , "x" );
document.getElementById("d3" ).textContent=img .hasAttribute("href" );
document.getElementById("d4" ).textContent=img .hasAttribute("x" );
</script>
名前空間 http://www.w3.org/1999/xlink に href という属性はあるので true、x はないので false になります。
逆に、名前空間を指定しないと href は false、x は true になります。
実行例
(2) getAttribute、getAttributeNS、setAttribute、setAttributeNS、removeAttribute、removeAttributeNS
エレメントオブジェクト.getAttribute(name)
指定の属性値を返す
引数 name:属性名
戻り値 :属性値
エレメントオブジェクト.setAttribute(name, value)
指定の属性に属性値を設定する
引数 name:属性名
引数 value:属性値(空白区切りで複数の属性値を設定できる)
戻り値 :なし
エレメントオブジェクト.removeAttribute(name)
指定の属性を削除する
引数 name:属性名
戻り値 :なし
記述例
<div id = "id1" class = "c1 c2 c3" style = "display:none;" > XXX</div>
<div id = "id2" data-my-rank = "プレミアム" data-max-number = "10" > YYY</div>
<div id = "d1" > </div>
<script>
let e = document.getElementById("id1" );
document.getElementById("d1" ).textContent=e .getAttribute("class" );
e .setAttribute("class" , "xx" );
document.getElementById("d2" ).textContent=e .getAttribute("class" );
e .removeAttribute("class" );
document.getElementById("d3" ).textContent=e .getAttribute("class" );
e = document.getElementById("id2" );
document.getElementById("d11" ).textContent=e .getAttribute("data-my-rank" );
document.getElementById("d12" ).textContent=e .getAttribute("data-max-number" );
</script>
2番目と3番目の例は、setAttribute で変更した後の class 属性値と removeAttribute で削除した後の class 属性値を表示しています。
最後の2つは独自データ属性の例です。
実行例
SVG 要素などの属性を参照、設定するには名前空間を指定する必要があるので、次のメソッドを使用します。
エレメントオブジェクト.getAttributeNS(namespace, name)
指定された名前空間の属性値を返す
引数 namespace:名前空間URI(例えば、SVGは http://www.w3.org/2000/svg)
引数 name:属性名
戻り値 :属性値
エレメントオブジェクト.setAttributeNS(namespace, name, value)
指定された名前空間に属性値を設定する
引数 namespace:名前空間URI(例えば、SVGは http://www.w3.org/2000/svg)
引数 name:属性名
引数 value:属性値(空白区切りで複数の属性値を設定できる)
戻り値 :なし
エレメントオブジェクト.removeAttributeNS(namespace, name)
指定された名前空間の属性を削除する
引数 namespace:名前空間URI(例えば、SVGは http://www.w3.org/2000/svg)
引数 name:属性名
戻り値 :なし
記述例
<svg id = "svg" viewbox = "0,0 150 90" width = "150" height = "90" >
<image id = "image" x = "50" y = "10" width = "74" height = "74" xlink:href = "figures/bear.png" />
</svg>
<div id = "d1" > </div>
<script>
let img = document.getElementById("image" );
document.getElementById("d1" ).textContent=img .getAttributeNS("http://www.w3.org/1999/xlink" , "href" );
img .removeAttributeNS("http://www.w3.org/1999/xlink" , "href" );
document.getElementById("d2" ).textContent=img .hasAttributeNS("http://www.w3.org/1999/xlink" , "href" );
img .setAttributeNS("http://www.w3.org/1999/xlink" , "href" , "figures/bear2.png" );
document.getElementById("d3" ).textContent=img .getAttributeNS("http://www.w3.org/1999/xlink" , "href" );
</script>
下から2つは、removeAttribute で削除した後の href 属性の有無と setAttribute で変更した後の href 属性値を表示しています。
実行例
8.7.4 エレメントの操作
HTML の各要素に対する操作です。
要素の内容をスクロールします。
エレメントオブジェクト.scrollTo(x, y)、エレメントオブジェクト.scrollBy(x, y)
要素の内容をスクロールして移動する。
引数 x:移動先の x 座標(scrollTo)、x 方向への移動量(scrollBy)
引数 y:移動先の y 座標(scrollTo)、y 方向への移動量(scrollBy)
戻り値 :なし
scrollTo は、指定した位置を要素の左上にスクロールします。
記述例
<div id = "scroll" > A123456789<br> BB12345678<br> CCC1234567<br> DDDD123456<br> EEEEE12345<br> FFFFFF1234<br> GGGGGGG123<br> HHHHHHHH12<br> IIIIIIIII1</div> <br>
<div> scrollTo(<input name = "left" type = "number" size = "3" min = "0" max = "100" value = "0" onchange = "change();" > ,
<input name = "top" type = "number" size = "3" min = "0" max = "100" value = "0" onchange = "change();" > )<br>
<script>
function change() {
let top = document.f.top.value;
let left = document.f.left.value;
let s = document.getElementById('scroll' );
s .scrollTo(left , top );
}
</script>
左側の要素の内容をスクロールさせ、指定した位置を要素の左上に移動させます。
右側の要素は、スクロール位置を説明するために別途表示しています。
実行例
scrollBy は、指定したスクロール量だけスクロールします。
記述例
<div id = "scroll" > A123456789<br> BB12345678<br> CCC1234567<br> DDDD123456<br> EEEEE12345<br> FFFFFF1234<br> GGGGGGG123<br> HHHHHHHH12<br> IIIIIIIII1</div> <br>
<div> scrollBy(<input name = "left" type = "number" size = "3" min = "-50" max = "50" value = "0" onchange = "change();" > ,
<input name = "top" type = "number" size = "3" min = "-50" max = "50" value = "0" onchange = "change();" > )<br>
<script>
function change() {
let top = document.f.top.value;
let left = document.f.left.value;
let s = document.getElementById('scroll' );
s .scrollBy(left , top );
document.f.top.value = 0;
document.f.left.value = 0;
}
</script>
左側の要素の内容を指定した量だけスクロールさせます。負数も指定できます。その後、入力された数値を 0にしています。
右側の要素は、スクロール位置を説明するために別途表示しています。
実行例
8.7.5 イベント
HTML の各要素に対して、いろいろな操作(マウスを重ねる、クリックする、キー入力するなど)をすると、その都度イベントが発生しています。
(1) イベントリスナー
発生したイベントに対して処理を行いたいときに、イベントと関数を関連付けるためのメソッドが用意されています。なお、第3引数の useCapture については、「10.2 イベントの伝播」 を参照してください。
エレメントオブジェクト.addEventListener(event, func, useCapture)
event 発生時に func を実行するようにイベントリスナーを設定する。
引数 event:イベントの種類
引数 func:関数(イベントハンドラ)
引数 useCapture:Capture(捕捉)フェーズを使用する(true)、使用しない(false) 規定値
戻り値 :なし
エレメントオブジェクト.removeEventListener(event, func, useCapture)
指定した引数とまったく同じである、イベントリスナーを削除する。ただし、addEventListener のとき、第二引数に直接メソッドを記述していた場合は削除できない。
引数 event:イベントの種類
引数 func:関数(イベントハンドラ)
引数 useCapture:Capture(捕捉)フェーズを使用する(true)、使用しない(false) 規定値
戻り値 :なし
記述例
<div onClick = 'add();' > addEventListener</div> <div onClick = 'removex();' > removeEventListener</div>
<div id = 'time' > 現在時刻→<span id = 'x' > </span> </div>
<script>
var time = document.getElementById('time' );
function add() {
time.addEventListener('mousemove' , now, false );
}
function removex() {
document.getElementById('x' ).textContent="" ;
time.removeEventListener('mousemove' , now, false );
}
function now() {
let t = new Date();
document.getElementById('x' ).textContent=t .toLocaleDateString() + " " + t .toLocaleTimeString();
}
</script>
[addEventListener] ボタンで、時刻が表示されるよう id が time のエレメントにイベントリスナーを設定します。[removeEventListener] ボタンで、イベントリスナーを解除します。
「現在時刻」の文字の上でマウスを動かしてみてください。
実行例
(2) イベントの送信
HTML の各要素に対して、イベントを送信します。
イベントが送信された要素の内、少なくともひとつのイベントハンドラが preventDefault() を呼び出した場合は戻り値が false になります。preventDefault() は、そのイベントのデフォルトの動作をキャンセルしたいときに呼び出します。
エレメントオブジェクト.dispatchEvent(event)
イベントを送信する。
引数 event:イベント
戻り値 :このイベントを処理したイベントハンドラが preventDefault() を呼び出した場合(false)、そうでなければ(true)
一つ目のチェックボックスは preventDefault() を実行していますので、チェックを付けたり消したりというデフォルトの動作は行われません。
記述例
<input id = "check1" type = "checkbox" > <input id = "check2" type = "checkbox" >
<div class = "switch" onclick = "fire();" > クリック</div>
<script>
document.getElementById("check1" ).addEventListener("click" , function (event ){event .preventDefault();});
function fire() {
let evt1 ;
let evt2 ;
try {
evt1 = new MouseEvent("click" , {"cancelable" :true });
evt2 = new MouseEvent("click" , {"cancelable" :true });
}
catch (x ) {
evt1 = document.createEvent("HTMLEvents" );
evt2 = document.createEvent("HTMLEvents" );
evt1 .initEvent("click" , true , true );
evt2 .initEvent("click" , true , true );
}
document.getElementById("check1" ).dispatchEvent(evt1 );
document.getElementById("check2" ).dispatchEvent(evt2 );
}
</script>
実行例
ただし、dispatchEvent でイベントを送ってもデフォルトの処理が行われるかどうか微妙なようです(イベントは送られます)。
複数の要素に同じイベントを送ったときは、 は一つ目はチェックが付きますが、二つ目以降は付きません(厳密にいうと、イベントが発生したときには付くのですがその後消えます)。
しかし、別々のイベントを送ったときは、正しくデフォルトの処理が行われるようです。
また、 は、別々のイベントを送ってもまったくチェックが付きません。
記述例
<input id = "check01" type = "checkbox" > A <input id = "check02" type = "checkbox" > B <input id = "check03" type = "checkbox" > C
<div class = "switch" onclick = "fire();" > クリック</div>
<input id = "check11" type = "checkbox" > A <input id = "check12" type = "checkbox" > B <input id = "check13" type = "checkbox" > C
<script>
function fire() {
let evt = getEvent();
let evt1 = getEvent();
let evt2 = getEvent();
let evt3 = getEvent();
document.getElementById("check01" ).dispatchEvent(evt );
document.getElementById("check02" ).dispatchEvent(evt );
document.getElementById("check03" ).dispatchEvent(evt );
document.getElementById("check11" ).dispatchEvent(evt1 );
document.getElementById("check12" ).dispatchEvent(evt2 );
document.getElementById("check13" ).dispatchEvent(evt3 );
}
function getEvent() {
let evt ;
try {
evt = new MouseEvent("click" );
}
catch (x ) {
evt = document.createEvent("HTMLEvents" );
evt .initEvent("click" , true , true );
}
return evt ;
}
</script>
実行例
8.8 スタイルシート(Stylesheet)
ドキュメントで使用されるスタイルシートは、document の styleSheets プロパティで一元的に保持されており、次のような構造をしています。また、各要素で個別に指定されたスタイル属性は、要素の style 属性で参照することができます。
html
document
CSSStylesheet[] styleSheets
CSSStyleRule[] cssRules
CSSStyleDeclaration style
:
:
:
element
CSSStyleDeclaration[] style
:
element
CSSStyleDeclaration[] style
:
CSSStylesheet[] styleSheets
link 要素や style 要素で指定されたスタイルシートごとに、リストに保存されます。
<link rel = "stylesheet" href = "xxxxx.css" >
<style> …… </style>
CSSStyleRule[] cssRules
スタイルシート内の セレクタ {プロパティ:値; …… } ごとに、リストに保存されます。
<style>
strong {color:red;font-weight:bold;}
div.note {background-color:yellow;}
</style>
CSSStyleDeclaration[] style
プロパティ:値; ごとに、リストに保存されます。
<style>
strong {
color:red;
background-color:lightgrey;
font-weight:bold;
}
</style>
<div style = "color:red;font-weight:bold;" > 文字列</div>
8.8.1 スタイルシート (CSSStyleSheet)
document の styleSheets プロパティで CSSStyleSheet のリストが得られます。
CSSStyleSheet のリストは link 要素も含め記述した順に作成されます。
CSSStyleSheet オブジェクトの主なプロパティとメソッドについて説明します。
(1) スタイルシート情報
プロパティ 値
cssRules CSSStyleRule(セレクタ要素)のリスト(CSSRuleList)を返す。 セレクタ {プロパティ:値;} ○ ○ ○ ○ ○ ○ ○ ○
cssText スタイルシート要素 ○ ○ × × × × × ×
hrefR/O link 要素の href 属性値(style 要素のときは "")を返す。 ○ ○ ○ ○ ○ ○ ○ ○
cssText は、 などの独自プロパティです。
記述例
h3080801(1)a.css
p { color: red; }
span {font-weight: bold;}
<html>
<head>
<meta charset = "UTF-8" >
<title> styleSheets</title>
<link rel = "stylesheet" href = "h3080801(1)a.css" >
<style>
.note {
font-size: 9pt;
color: chocolate;
}
</style>
</head>
<body>
<table>
<tr> <td id = "d00" > </td> <td> → </td> <td id = "d01" > </td> <td id = "d02" > </td> </tr>
<tr> <td id = "d10" > </td> <td> → </td> <td id = "d11" > </td> <td id = "d12" > </td> </tr>
</table>
<script>
for (let x = 0 ; x < document.styleSheets.length ; x++) {
let ss = document.styleSheets[x];
document.getElementById("d" + x + "0" ).textContent = ss .href;
document.getElementById("d" + x + "1" ).textContent = ss .cssText;
document.getElementById("d" + x + "2" ).textContent = ss .cssRules;
}
</script>
</body>
</html>
一つ目は link 要素で記述されたスタイルシートなので、href が設定されています。二つ目は style 要素で記述されているため href はありません。
実行例
(2) スタイルシートの追加・削除
スタイルシート.insertRule(rule, index)
ルールを指定位置に挿入する。
引数 rule:ルール(セレクタ {プロパティ:値;})
引数 index:挿入する番号(0~)
戻り値 :なし
スタイルシート.deleteRule(index)
スタイルルールを除去する。
引数 index:削除するルールの番号
戻り値 :なし
記述例
<html>
<head>
<meta charset = "UTF-8" >
<title> styleSheets</title>
<style>
p { color: red; }
span {font-weight: bold;}
.note {
font-size: 9pt;
color: chocolate;
}
</style>
</head>
<body>
<div id = "d1" > </div>
<div id = "d2" > </div>
<div id = "d3" > </div>
<script>
function dispStyle(style ) {
let s = "" ;
for (let i = 0 ; i < style .length ; i++) {
let n = style [i];
s += n + ": " + style [n ] + "; " ;
}
return s ;
}
function dispRules(rules ) {
let s = "" ;
for (let i = 0 ; i < rules .length ; i++) {
s += rules [i].selectorText + " {" + dispStyle(rules [i].style) + "} " ;
}
return s ;
}
let ss = document.styleSheets[0];
document.getElementById("d1" ).textContent= dispRules(ss .cssRules);
ss .deleteRule(1);
document.getElementById("d2" ).textContent= dispRules(ss .cssRules);
ss .insertRule("span {font-style: italic;}" , ss .cssRules.length);
document.getElementById("d3" ).textContent= dispRules(ss .cssRules);
</script>
</body>
</html>
二つ目のスタイルルール(span {font-weight: bold;})を削除した後、別のルール(span {font-style: italic;})を最後に挿入しています
実行例
8.8.2 ルール (CSSStyleRule)
document の styleSheets プロパティで得られた CSSStyleSheet の cssRules で CSSStyleRule のリストである CSSRuleList が得られます。CSSStyleRule はそのリストの要素です。
プロパティ 値
selectorTextR/O ルールセットのセレクタ文字列 ○ ○ ○ ○ ○ ○ ○ ○
styleR/O スタイルシートの定義 CSSStyleDeclaration (Internet Explorer は MSStyleCSSProperties)のリスト △ ○ ○ ○ ○ ○ ○ ○
記述例
<html>
<head>
<meta charset = "UTF-8" >
<title> styleSheets</title>
<style>
p { color: red; }
span {font-weight: bold;}
.note {
font-size: 9pt;
color: chocolate;
}
</style>
</head>
<body>
<span id = "d10" > </span> <span id = "d20" > </span> <bp>
<script>
let r = document.styleSheets[0].cssRules;
for (let i = 0 ; i < r .length ; i++) {
document.getElementById("d1" + i).textContent = r [i].selectorText;
document.getElementById("d2" + i).textContent = r [i].style;
}
</script>
</body>
</html>
スタイルシートで定義されているルールのセレクタとその定義を表示しています。
実行例
8.8.3 スタイル属性 (CSSStyleDeclaration)
document の styleSheets プロパティで得られた CSSStyleSheet の cssRules で得られた CSSStyleRule の style で得られます。
また、エレメントの style 属性でも得られます。
プロパティ 値
cssTextR/O スタイルシート定義文字列(スタイルシート属性名と属性値のペアからなる文字列) ○ ○ ○ ○ ○ ○ ○
parentRule このスタイル属性を持つルール CSSStyleRule(要素のスタイルシートの場合は null) ○ ○ ○ ○ ○ ○ ×
記述例
<html>
<head>
<meta charset = "UTF-8" >
<title> styleSheets</title>
<style>
.note {
font-size: 9pt;
color: chocolate;
}
</style>
</head>
<body>
<div id = "t" style = "background-color:yellow;" > </div>
<span id = "d11" > </span> <span id = "d12" > </span> <bp>
<span id = "d21" > </span> <span id = "d22" > </span> <bp>
<script>
let d1 = document.styleSheets[0].cssRules[0].style;
let d2 = document.getElementById("t" ).style;
document.getElementById("d11" ).textContent = d1 .cssText;
document.getElementById("d12" ).textContent = d1 .parentRule;
document.getElementById("d21" ).textContent = d2 .cssText;
document.getElementById("d22" ).textContent = d2 .parentRule;
</script>
</body>
</html>
一つ目は link 要素や style 要素で指定されたスタイルシートを、二つ目は id="t" の div 要素に個別に指定された style 属性値を表示しています。
実行例
また、style 属性値を変更することで、要素のスタイルを変更することができます。要素に style 属性が記述されていなくても構いません。
ただし、このとき指定する属性名はスタイルシートで指定した名前とは少し異なります。スタイルシートで指定する名前は、font-size や background-color のように "-" を含むものもありますが、Javascript では "-" は減算演算子と見なされてしまいます。したがって、"-" は使用できませんので、Javascript では "-" を省き "-" の次に位置している文字を大文字にして使用します。例えば、fontSize や backgroundColor です。
記述例
<html>
<head>
<meta charset = "UTF-8" >
<title> styleSheets</title>
<style>
.x { background-color:white; }
</style>
</head>
<body>
<table>
<tr> <th> エレメントの style 変更</th> <th> sytle 要素の style 変更</th> <th style = "width:30em;" > </th> </tr>
<tr> <td id = "t1" > スタイルシート指定なし</td> <td class = "x" > class 指定</td> </tr>
<tr> <td id = "t2" class = "x" > class 指定</td> <td class = "x" > class 指定</td> </tr>
<tr> <td id = "t3" style = "background-color:white;" > style 属性指定</td> <td class = "x" > class 指定</td> </tr>
<table>
<script>
document.getElementById("t1" ).style.backgroundColor = "yellow" ;
document.getElementById("t2" ).style.backgroundColor = "yellow" ;
document.getElementById("t3" ).style.backgroundColor = "yellow" ;
let ss = document.styleSheets[0].cssRules[0].style;
ss .backgroundColor = "lime" ;
ss .color = "blue" ;
</script>
</body>
</html>
どのような方法でスタイルシートが指定されていても(あるいはまったく指定されていなくても)エレメントの style 属性値は、同じように変更することができます。
また、sytle 要素の style を変更して、そのルールを class で指定したエレメントすべてを一度に変更することもできます。ただし、id="t2" のエレメントのように元は class で指定していても、後で個別に変更してしまったスタイル属性は個別の変更が優先されるようです。
実行例
document の forms プロパティでフォーム要素(HTMLFormElement)のリストを得ることができます。
各フォーム要素は、リストの要素番号を指定し、
let f = document.forms[0];
のように参照することができます。また、フォーム要素の name 属性があれば name で参照することもできます。
let f = document.f1;
let f = document.forms["f1" ];
フォーム要素の主なプロパティとメソッドについて説明します。
8.9.1 フォーム要素
プロパティ 値
acceptCharsetR/O このフォームで使用可能な文字エンコーディング名(複数ある場合は 空白 区切り) ○ ○ ○ ○ ○ ○ ○ ○
action データの送信先の URI ○ ○ ○ ○ ○ ○ ○ ○
elements form 要素に含まれるすべてのフォーム部品のリスト ○ ○ ○ ○ ○ ○ ○ ○
enctype エンコードタイプ ○ ○ ○ ○ ○ ○ ○ ○
method サーバーにデータを送る形式(get または post) ○ ○ ○ ○ ○ ○ ○ ○
nameR/O フォームの名前 ○ ○ ○ ○ ○ ○ ○ ○
target 表示ターゲット ○ ○ ○ ○ ○ ○ ○ ○
記述例
<form name = "f1" action = "http://foo.com/exec.htm" method = "get" target = "_top" enctype = "text/plain" accept-charset = "UTF-8 Shift_JIS" >
</form>
<div id = "d1" > </div>
<script>
let f = document.forms[0];
document.getElementById("d1" ).textContent=f .name;
document.getElementById("d2" ).textContent=f .method;
document.getElementById("d3" ).textContent=f .action;
document.getElementById("d4" ).textContent=f .target;
document.getElementById("d5" ).textContent=f .enctype;
document.getElementById("d6" ).textContent=f .acceptCharset;
</script>
実行例
form 要素の input type="submit" や input type="reset" 要素と同じことを Javascript で行うことができます。
form 要素の submit() や reset() を呼び出します。
フォーム.submit()
フォームを送信する(送信ボタンをクリックするのと同じ動作をする)。
戻り値 :なし
フォーム.reset()
フォームを初期状態にリセットする(リセットボタンをクリックするのと同じ動作をする)。
戻り値 :なし
記述例
<form name = "f1" action = "#" >
コード:<input type = "text" name = "param" value = "A001" > <input type = "hidden" name = "value" value = "0" >
<div onClick = "document.f1.value.value='1';document.f1.submit();" > 追加</div>
<div onClick = "document.f1.value.value='2';document.f1.submit();" > 削除</button>
<div onClick = "document.getElementById('params').textContent=' ';document.f1.reset();" > リセット</button>
</form>
[追加]と[削除]という2つの送信ボタンがありますので、区別がつくように type='hidden' とした name='value' のパラメータを用意しています。[追加]ボタンは '1' を、[削除]ボタンは '2' を設定して submit() を実行しています。[リセット]ボタンは reset() を実行しています。
実行例
8.9.2 フォーム部品(共通)
フォーム要素に含まれるのフォーム部品(input 要素、textarea 要素など)のリストを得ることができます。
各フォーム部品は、リストの要素番号を指定し、
let e = document.f1.elements[0];
のように参照することができます。また、フォーム部品の name 属性があれば name で参照することもできます。
let e = document.f1.e1;
let e = document.f1.elements["e1" ];
(1) フォーム部品情報
プロパティ 値
formR/O フォーム部品を包含するフォームオブジェクト ○ ○ ○ ○ ○ ○ ○ ○
name フォーム部品の名前(name 属性値) ○ ○ ○ ○ ○ ○ ○ ○
type フォーム部品のタイプ(type 属性値) ○ ○ ○ ○ ○ ○ ○ ○
value フォーム部品の値(value 属性値) ○ ○ ○ ○ ○ ○ ○ ○
記述例
<form name = "f1" action = "#" >
<input type = "text" name = "e1" value = "初期値" >
<input type = "submit" name = "e2" value = "送信" >
</form>
<div id = "d1" > </div>
<script>
let f = document.forms[0];
document.getElementById("d1" ).textContent=f .e1.name;
document.getElementById("d2" ).textContent=f .e1.type;
document.getElementById("d3" ).textContent=f .e1.value;
document.getElementById("d4" ).textContent=f .e1.form.name;
document.getElementById("d5" ).textContent=f .e2.name;
document.getElementById("d6" ).textContent=f .e2.type;
document.getElementById("d7" ).textContent=f .e2.value;
document.getElementById("d8" ).textContent=f .e2.form.name;
</script>
form はオブジェクトが返るため、この例では form の name 属性を表示しています。
実行例
(2) フォーカス
入力欄やボタンなどにカーソルを位置づけたり、選択状態にします。
エレメント.focus()
このエレメント(フォーム部品)にフォーカスを移す。
戻り値 :なし
エレメント.blur()
このエレメント(フォーム部品)からフォーカスを外す。
戻り値 :なし
記述例
<form name = "f1" action = "#" >
<input type = "text" name = "e1" value = "初期値" >
</form>
<br>
<div onClick = "document.f1.e1.focus();" > フォーカスを当てる</div> <div onClick = "document.f1.e1.blur();" > フォーカスを外す</div>
実行例
8.9.3 フォーム部品(テキスト)
エレメント.select()
入力フィールド内の文字列を選択状態にする。
戻り値 :なし
記述例
<form name = "f1" action = "#" >
<input type = "text" name = "e1" value = "初期値" > <input type = "text" name = "e2" placeholder = "入力ヒント" >
<div onClick = "document.f1.e1.select();" > 選択状態にする</div> <div onClick = "document.f1.e2.select();" > 選択状態にする</div>
</form>
[選択状態にする]ボタンをクリックすると入力されている文字列が選択状態になります。右側は「入力ヒント」なので選択されず、未入力状態になります。
実行例
8.9.4 フォーム部品(チェックボックス、ラジオボタン)
プロパティ 値
checked チェックされているかどうかを設定あるいは取得する。 チェックされている(true)、されていない(false) ○ ○ ○ ○ ○ ○ ○ ○
defaultCheckedR/O 初期値として checked が記述されているかどうかを設定あるいは取得する。 記述されている(true)、されていない(false) ○ ○ ○ ○ ○ ○ ○ ○
記述例
<form name = "f1" action = "#" >
<input type = "checkbox" name = "e1" value = "1" onclick = "checkChecked(cb, 'd12')" > 選択1
<input type = "checkbox" name = "e1" value = "2" onclick = "checkChecked(cb, 'd12')" checked > 選択2
<input type = "checkbox" name = "e1" value = "3" onclick = "checkChecked(cb, 'd12')" > 選択3
<span id = "d11" style = "background-color:yellow;" > </span> <span id = "d12" > </span> <br>
<input type = "radio" name = "e2" value = "1" onclick = "checkChecked(rb, 'd22')" > 選択1
<input type = "radio" name = "e2" value = "2" onclick = "checkChecked(rb, 'd22')" checked > 選択2
<input type = "radio" name = "e2" value = "3" onclick = "checkChecked(rb, 'd22')" > 選択3
<span id = "d21" style = "background-color:yellow;" > </span> <span id = "d22" > </span>
</form>
<script>
var cb = document.f1.e1;
var rb = document.f1.e2;
function checkChecked(c , id ) {
let s = "" ;
for (var i = 0 ; i < c .length ; i++) {
if (c [i].checked == true )
s += c [i].value + " " ;
}
document.getElementById(id ).textContent = s ;
}
function checkDefaultChecked(c , id ) {
let s = "" ;
for (var i = 0 ; i < c .length ; i++) {
if (c [i].defaultChecked == true ) {
s += c [i].value + " " ;
}
document.getElementById(id ).textContent = s ;
}
cb[2].checked = true ;
checkDefaultChecked(cb, "d11" );
checkChecked(cb, "d12" );
checkDefaultChecked(rb, "d21" );
checkChecked(rb, "d22" );
</script>
チェックボックスやラジオボタンにチェックを付けると、チェックのついた要素の value がその右側に表示されます。
背景が黄色い部分は 初期値として checked が付けられている要素です。なお、チェックボックスの「選択3」は、実行時にチェックを付けるため、背景が黄色い "3" は表示されません。
実行例
8.9.5 セレクト部品(セレクト)
プロパティ 値
selectedIndex 現在選択されているオプションを示すインデックス番号(0~) ○ ○ ○ ○ ○ ○ ○ ○
options オプションのコレクション(HTMLOptionElement を持つ HTMLOptionsCollection)
HTMLOptionElement
プロパティ 値
option.defaultSelected 初期値として選択されていたかどうか(true:選択されている、false:されていない)
option.selected 選択されているかどうか(true:選択されている、false:されていない)
option.label オプションとして表示されている文字列
option.value オプションの value 値
○ ○ ○ ○ ○ ○ ○ △
記述例
<form name = "f1" action = "#" >
<select name = "e1" onclick = "dispSelectedIndex(e1, 'd12')" >
<option value = "1" label = "選択1" > </option>
<option value = "2" label = "選択2" > </option>
<option value = "3" label = "選択3" selected> </option>
<option value = "4" label = "選択4" > </option>
</select> <span id = "d10" > </span> <span id = "d11" style = "background-color:yellow;" > <span id = "d12" > </span> <br>
<br>
<select name = "e2" onclick = "dispSelectedIndex(e2, 'd22')" >
<option value = "1" > 選択1</option>
<option value = "2" > 選択2</option>
<option value = "3" selected > 選択3</option>
<option value = "4" > 選択4</option>
</select> <span id = "d20" > </span> <span id = "d21" style = "background-color:yellow;" > <span id = "d22" > </span> <br>
<br>
<input type = "text" name = "e3" size = "5" list = "arealist" >
<span id = "d30" > </span> <span id = "d31" style = "background-color:yellow;" > </span> <span id = "d32" > </span> <br>
</form>
<datalist id = "arealist" >
<option value = "1" label = "選択1" > </option>
<option value = "2" label = "選択2" > </option>
<option value = "3" label = "選択3" selected > </option>
<option value = "4" label = "選択4" > </option>
</datalist>
<script>
var e1 = document.f1.e1;
var e2 = document.f1.e2;
var e3 = document.f1.e3.list;
function dispOptions(c , id ) {
let s = "" ;
let o = c .options;
for (var i = 0 ; i < o .length ; i++) {
s += o [i].label + "(" + o [i].value + ") " ;
}
document.getElementById(id ).textContent = s ;
}
function dispSelectedIndex(c , id ) {
document.getElementById(id ).textContent =
c [c .selectedIndex].value + " " + (c .selectedIndex == getDefaultSelected(c ) ? "変更なし" : "" );
}
function getDefaultSelected(c ) {
for (var i = 0 ; i < c .length ; i++) {
if (c [i].defaultSelected == true )
return i;
}
return -1;
}
function checkDefaultSelected(c , id ) {
let i = getDefaultSelected(c );
if (i >= 0) {
document.getElementById(id ).textContent = c [i].value;
}
}
dispOptions(e1, "d10" ); checkDefaultSelected(e1, "d11" ); dispSelectedIndex(e1, "d12" );
dispOptions(e2, "d20" ); checkDefaultSelected(e2, "d21" ); dispSelectedIndex(e2, "d22" );
dispOptions(e3, "d30" );
</script>
一つ目は選択肢を option 属性で指定しています。二つ目は option 要素で指定しています。どちらも同じように参照することができます。
三つ目は datalist 要素を指定した テキスト入力欄です。option 要素は list 属性で参照できますが、defaultSelected や selectedIndex はなさそうです。
背景が黄色い部分は 初期値として selected が付けられている要素です。また、初期値と同じ選択肢を選んだ場合は「変更なし」が表示されます。
実行例
Safari では、option 要素で指定したときは options の label に選択肢が設定されないようです。
8.10 イメージ(HTMLImageElement)
document の images プロパティでフォーム要素(HTMLFormElement)のリストを得ることができます。
各イメージ要素は、リストの要素番号を指定し、
let img = document.images[0];
のように参照することができます。また、イメージ要素の id 属性があれば id で参照することもできます。
let img = document.img1;
let img = document.images["img1" ];
イメージ要素の主なプロパティとメソッドについて説明します。
8.10.1 イメージ要素
プロパティ 値
alt alt 属性値(画像を表示しない場合の代替文字列) ○ ○ ○ ○ ○ ○ ○ ○
completeR/O 読込みが完了しているかどうか(true:完了、false:未完)Internet Explorer 以外は読み込めなくても読み込めないと分かった時点で true になる。 ○ ○ ○ ○ ○ ○ ○ ○
height 画像の表示上の高さ ○ ○ ○ ○ ○ ○ ○ ○
isMapR/O サーバサイドイメージマップを使用するかどうか(true:使用する、false:使用しない) ○ ○ ○ ○ ○ ○ ○ ○
naturalHeightR/O 画像の本来の高さ ○ ○ ○ ○ ○ ○ ○ ○
naturalWidthR/O 画像の本来の幅 ○ ○ ○ ○ ○ ○ ○ ○
src src 属性値(画像ファイルの URL) ○ ○ ○ ○ ○ ○ ○ ○
useMapR/O クライアントサイドイメージマップの要素名 ○ ○ ○ ○ ○ ○ ○ ○
width 画像の表示上の幅 ○ ○ ○ ○ ○ ○ ○ ○
xR/O 画像の表示された横位置 × ○ ○ ○ ○ ○ ○ ○
yR/O 画像の表示された縦位置 × ○ ○ ○ ○ ○ ○ ○
記述例
<img id = "e1" src = "figures/bear.png" alt = "右手(?)を挙げた熊" width = "56" height = "111" usemap = "#fist" >
<map name = "fist" >
<area shape = "circle" coords = "13,39,11" href = "#" title = "こぶし" >
</map>
<div id = "d1" > </div>
<script>
let i = document.images;
document.getElementById('d1' ).textContent=i .e1.alt;
document.getElementById('d2' ).textContent=i .e1.width;
document.getElementById('d3' ).textContent=i .e1.height;
document.getElementById('d4' ).textContent=i .e1.naturalWidth;
document.getElementById('d5' ).textContent=i .e1.naturalHeight;
document.getElementById('d6' ).textContent=i .e1.src;
document.getElementById('d7' ).textContent=i .e1.x;
document.getElementById('d8' ).textContent=i .e1.y;
document.getElementById('d9' ).textContent=i .e1.ismap;
document.getElementById('d10' ).textContent=i .e1.usemap;
</script>
74 × 74 のサイズの画像を拡縮して表示しています。また、ismap は指定していませんが、usemap は使用しています。
なお、Internet Explorer では x や y を取得することはできないようです。
実行例
なお、width や height を変更すれば、画像の大きさを変えることができます。
記述例
<table>
<tr> <td style = "height:160px;text-align:center;" >
<img id = "e" src = "figures/bear.png" width = "74" height = "74" >
</td> <td style = "width:20px;" >
<input type = "range" name = "h" min="0" max = "148" value = "74" style = "width:148px;transform:rotateZ(90deg) translateY(70px);"
onchange = "document.getElementById('e' ).height=this.value;" > <br>
</td> </tr>
<tr> <td>
<input type = "range" name = "w" min = "0" max = "148" value = "74" style = "width:148px;height:10px;"
onchange = "document.getElementById('e' ).width=this.value;" >
</td> <td> </td> </tr>
</table>
実行例
8.10.2 Image オブジェクト
Image オブジェクトでは、new 演算子を使って画像をオブジェクト化できます。
new Image([width, height ])
Image インスタンスを生成する。
引数 width:画像の幅
引数 height:画像の高さ
戻り値 :Image インスタンス
記述例
<body>
<script>
let img = new Image();
img .src = "figures/bear.png" ;
document.body.appendChild(img );
</script>
</body>
実行例
8.11 アンカー
document の links プロパティは、文書中の、 href 属性の値を持つすべての a 要素と area 要素のリストを返します。
各リンク要素は、リストの要素番号を指定し、
let lnk = document.links[0];
のように参照することができます。
8.11.1 アンカー(HTMLAnchorElement)
アンカーオブジェクトには、a 要素の情報が設定されています。
document の links プロパティは a 要素の他に area 要素も含めたリストなので、アンカーオブジェクトのみを取り出す必要があります。
プロパティ 値
href 新しく表示する文書や場所の URL ○ ○ ○ ○ ○ ○ ○ ○
hreflang リンク先の文書を記述している言語(言語コード一覧 ) ○ ○ ○ ○ ○ ○ ○ ○
media 対象とするメディアタイプ ○ ○ ○ ○ ○ ○ ○ ○
rel 外部ファイルとの関係性 リンクタイプ ○ ○ ○ ○ ○ ○ ○ ○
target リンク先の内容を表示するウィンドウ(フレーム)名 ○ ○ ○ ○ ○ ○ ○ ○
type リンク先の MIME タイプ ○ ○ ○ ○ ○ ○ ○ ○
protocol プロトコル(href の ':' 以前の文字列) ○ ○ ○ ○ ○ ○ ○ ○
hostname サーバー名(href のホスト名) ○ ○ ○ ○ ○ ○ ○ ○
port もしあればポート番号(href のポート番号) ○ ○ ○ ○ ○ ○ ○ ○
pathname パス名(href のホスト名より後の文字列) ○ ○ ○ ○ ○ ○ ○ ○
記述例
<a id = "a1" href = "link.htm" target = "_self" type = "text/html" rel = "next" > 次の文書</a>
<a id = "a2" href = "sample.png" target = "ref" type = "image/png" rel = "nofollow" > 参考画像</a>
<map name = "map" >
<area shape = "circle" coords = "17,26,11" href = "circle.htm" title = "まる" >
</map>
<div id = "d01" > </div>
<script>
let lnk = document.links;
let n = 0;
for (var i = 0 ; i < lnk .length ; i++) {
if (!(lnk [i] instanceof HTMLAnchorElement))
continue ;
document.getElementById("d" + n + "1" ).textContent=lnk[i].href;
document.getElementById("d" + n + "2" ).textContent=lnk[i].text;
document.getElementById("d" + n + "3" ).textContent=lnk[i].type;
document.getElementById("d" + n + "4" ).textContent=lnk[i].target;
document.getElementById("d" + n + "5" ).textContent=lnk[i].rel;
n ++;
}
</script>
実行例
8.11.2 エリア(HTMLAreaElement)
エリアオブジェクトには、area 要素の情報が設定されています。
document の links プロパティは area 要素の他に a 要素も含めたリストなので、エリアオブジェクトのみを取り出す必要があります。
プロパティ 値
coords 領域の座標(x,y)等 ○ ○ ○ ○ ○ ○ ○ ○
href 新しく表示する文書や場所の URL ○ ○ ○ ○ ○ ○ ○ ○
hreflang リンク先の文書を記述している記述言語(言語コード一覧 ) ○ ○ ○ ○ ○ ○ ○ ○
media 対象とするメディアタイプ ○ ○ ○ ○ ○ ○ ○ ○
rel 外部ファイルとの関係性 リンクタイプ ○ ○ ○ ○ ○ ○ ○ ○
shape 領域の形状 ○ ○ ○ ○ ○ ○ ○ ○
target リンク先の内容を表示するウィンドウ(フレーム)名 ○ ○ ○ ○ ○ ○ ○ ○
type リンク先の MIME タイプ ○ ○ ○ ○ ○ ○ ○ ○
protocol プロトコル(href の ':' 以前の文字列) ○ ○ ○ ○ ○ ○ ○ ○
hostname サーバー名(href のホスト名) ○ ○ ○ ○ ○ ○ ○ ○
port もしあればポート番号(href のポート番号) ○ ○ ○ ○ ○ ○ ○ ○
pathname パス名(href のホスト名より後の文字列) ○ ○ ○ ○ ○ ○ ○ ○
記述例
<img id = "e1" src = "bear.png" alt = "右手(?)を挙げた熊" width = "74" height = "74" usemap = "#map" >
<a id = "a1" href = "bear.htm" > くま</a>
<map name = "map" >
<area shape = "circle" coords = "17,26,11" href = "fist.htm" title = "こぶし" alt = "こぶし" >
<area shape = "circle" coords = "46,25,5" title = "はな" alt = "はな" >
<area shape = "default" coords = "0,0,73,73" href = "other.htm" title = "その他" alt = "その他" >
</map>
<div id = "d01" > </div>
<script>
let lnk = document.links;
let n = 0;
for (var i = 0 ; i < lnk .length ; i++) {
if (!(lnk [i] instanceof HTMLAreaElement))
continue ;
document.getElementById("d" + n + "1" ).textContent=lnk[i].href;
document.getElementById("d" + n + "2" ).textContent=lnk[i].alt;
document.getElementById("d" + n + "3" ).textContent=lnk[i].shape;
document.getElementById("d" + n + "4" ).textContent=lnk[i].coords;
n ++;
}
</script>
二つ目の area 要素(はな)には href 属性がありません。この場合はエリアオブジェクトも生成されないようです。
また、Internet Explorer や Edge では、shape="default" にしても、shape は rect となるようです。
実行例
8.12 メディア(HTMLMediaElement)
video 要素や audio 要素の getElementById メソッドなどで、それぞれ HTMLVideoElement や HTMLAudioElement というオブジェクトを得ることができます。
let video = document.getElementById("xxx" );
それらのオブジェクトは共に HTMLMediaElement を継承しています。また、HTMLMediaElement は HTMLElement を継承しています。
8.12.1 メディア情報
プロパティ 値
audioTracks 音声トラック情報 ○ ○ × × × × × ×
autoplay 自動再生するかどうか(preload が 'none' でも自動再生する)(規定値:true) ○ ○ ○ × × × × ×
bufferedR/O バッファされたメディアデータの範囲 ○ ○ ○ ○ ○ ○ ○ ×
controller 要素に割り当てられた MediaController オブジェクト(割り当てられていない場合の値は null) × × × × × × × ×
controls 再生をコントロールするユーザインタフェースの表示(true:表示、false:非表示)を設定あるいは取得する。 ○ ○ ○ ○ ○ ○ ○ ×
crossOrigin メディア要素の CORS 設定 × × × × × × × ×
currentSrcR/O メディアリソースの URI ○ ○ ○ × × × × ×
currentTime 現在の再生時間 ○ ○ ○ ○ ○ ○ ○ ×
defaultMuted 標準状態で音声がミュートされているかどうか(true:ミュートされている、false:されていない)(規定値:false) ○ ○ ○ × × × × ×
defaultPlaybackRate 標準の再生速度倍率(規定値:1) ○ ○ ○ × × × × ×
durationR/O メディアの長さ(秒) ○ ○ ○ ○ ○ ○ ○ ×
endedR/O 再生が終了しているかどうか(true:終了、false:途中)(規定値:false) ○ ○ ○ ○ ○ ○ ○ ×
errorR/O 一番最後に起きたエラー(エラーが起きていない場合は null) ×
loop 繰り返し再生の有効、無効(true:有効、false:無効)(規定値:false) ○ ○ ○ ○ ○ ○ ○ ×
muted ミュートされているかどうか(true:ミュートされている、false:されていない)(規定値:false) ○ ○ ○ ○ ○ ○ ○ ×
networkStateR/O 読込みでのネットワーク状況
名称 値 説明
NETWORK_EMPTY 0 要素はまだ初期化されておらず、すべての属性は初期状態にある
NETWORK_IDLE 1 リソースは選択されているが、この時点ではネットワークを使用していない
NETWORK_LOADING 2 データのローディング中
NETWORK_NO_SOURCE 3 まだ利用するリソースが見つかっていない
○ ○ ○ ○ ○ ○ ○ ×
pausedR/O ポーズ(一時停止)しているかどうか(true:ポーズしている、false:していない)(規定値:false) ○ ○ ○ ○ ○ ○ ○ ×
playbackRate 現在の再生速度倍率(規定値:1) ○ ○ ○ ○ ○ ○ ○ ×
playedR/O 再生中の情報を持つ TimeRanges オブジェクト ○ ○ ○ ○ ○ ○ ○ ×
preload メディアリソースをあらかじめ読み込むかどうか(規定値:auto)
名称 説明
'none' 事前に読み込みを行わない
'metadata' メタデータのみを事前ロードする
'auto' すべてのデータを事前に読み込む
○ ○ ○ × × × × ×
readyStateR/O 読み込み状況
名称 値 説明
HAVE_NOTHING 0 メタ情報さえまだ取得していない
HAVE_METADATA 1 メタ情報は取得したが、動画本体のデータは充分に取得していない
HAVE_CURRENT_DATA 2 現時点での再生に必要な分は取得している
HAVE_FUTURE_DATA 3 現時点での再生だけでなく、後の再生に必要な分も完全ではないものの取得している
HAVE_ENOUGH_DATA 4 再生に必要なデータは、全て取得した
○ ○ ○ ○ ○ ○ ○ ×
seekableR/O 再生位置の変更可能な範囲の情報を持つ TimeRanges オブジェクト ○ ○ ○ ○ ○ ○ ○ ×
seekingR/O 再生位置を変更したかどうか(true:変更した、false:していない)(規定値:false) ○ ○ ○ ○ ○ ○ ○ ×
src メディアリソースファイル ○ ○ ○ × × × × ×
volume 音量(0.0 (無音) ~ 1.0 (最大) )(規定値:1) ○ ○ ○ ○ ○ ○ ○ ×
記述例
<span id = "d01" > </span> <span id = "d21" > </span> <br>
<video id = "v" controls width = "320" height = "180" >
<source src = "xxxxx.ogv" type = 'video/ogg; codecs="theora, vorbis"' >
<source src = "xxxxx.mp4" type = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"' >
</video>
<form name = "f" >
<span id = "d1" > </span> <br>
<span id = "d2" > </span> <br>
<span id = "d3" > </span> <br>
<span id = "d4" > </span> <input type = "checkbox" name = "controls" onchange = "v.controls=set('d4',this.checked);" > <br>
<span id = "d5" > </span> <input type = "checkbox" name = "loop" onchange = "v.loop=set('d5',this.checked);" > <br>
<span id = "d6" > </span> <input type = "checkbox" name = "muted" onchange = "v.muted=set('d6',this.checked);" > <br>
<span id = "d7" > </span> <input type = "range" name = "volume" min = "0" max = "1" step = "0.1" value = "1"
onchange = "v.volume=set('d7',this.value);" > <br>
<span id = "d8" > </span> <br>
<span id = "d9" > </span> <br>
<script>
var v = document.getElementById("v" );
function set(id , value ) {
document.getElementById(id ).textContent = value ;
return value ;
}
function dispInit(event ) {
document.getElementById("d01" ).textContent=v.src;
document.getElementById("d02" ).textContent=v.currentSrc;
document.getElementById("d03" ).textContent=v.autoplay;
document.getElementById("d04" ).textContent=v.preload;
document.getElementById("d05" ).textContent=v.duration;
document.getElementById("d06" ).textContent=v.defaultPlaybackRate;
document.getElementById("d07" ).textContent=v.defaultMuted;
document.getElementById("d08" ).textContent=v.crossOrigin==undefined ?"undefined" :v.crossOrigin;
document.getElementById("d09" ).textContent=v.controller==undefined ?"undefined" :v.controller;
}
function dispEvent(event ) {
document.getElementById("d05" ).textContent=v.duration;
document.getElementById("d1" ).textContent=v.ended;
document.getElementById("d2" ).textContent=v.currentTime;
document.getElementById("d3" ).textContent=v.playbackRate;
document.getElementById("d4" ).textContent=v.controls;f.controls.checked=v.controls;
document.getElementById("d5" ).textContent=v.loop;f.loop.checked=v.loop;
document.getElementById("d6" ).textContent=v.muted;f.muted.checked=v.muted;
document.getElementById("d7" ).textContent=v.volume;f.volume.value=v.volume;
document.getElementById("d8" ).textContent=v.paused;
document.getElementById("d9" ).textContent=v.seeking;
document.getElementById("d10" ).textContent=v.readyState;
document.getElementById("d11" ).textContent=v.networkState;
document.getElementById("d21" ).textContent=(v.audioTracks==undefined || v.audioTracks.length==0)?"undefined" :v.audioTracks[0].id;
document.getElementById("d22" ).textContent=v.buffered.length==0?"" :(v.buffered.start(0) + " ~ " + v.buffered.end(0));
document.getElementById("d23" ).textContent=v.played.length==0?"" :(v.played.start(0) + " ~ " + v.played.end(0));
document.getElementById("d24" ).textContent=v.seekable.length==0?"" :(v.seekable.start(0) + " ~ " + v.seekable.end(0));
}
v.addEventListener('loadstart' , dispInit, false );
v.addEventListener('timeupdate' , dispEvent, false );
v.loop = true ;
</script>
動画を再生してみてください。
表示例
8.12.2 メディア操作
(1) メディア判定
メディアタイプが再生可能かどうかを判定します。
メディアオブジェクト.canPlayType(mediaType)
メディアタイプが再生可能かどうかを判定する。
引数 mediaType:メディアの MIME タイプ
戻り値 :
'probably' 再生可能
'maybe' おそらく再生可能(確実に再生できるとは言い切れない)
'' 再生不可能
記述例
<video id = "v" width = "10" height = "10" > </video>
<audio id = "a" > </audio>
<span id = "d11" > </span> <span id = "d21" > </span> <br>
<script>
var v = document.getElementById("v" );
document.getElementById("d11" ).textContent=v.canPlayType("video/mp4" );
document.getElementById("d12" ).textContent=v.canPlayType("video/webm" );
document.getElementById("d13" ).textContent=v.canPlayType("video/ogg" );
document.getElementById("d14" ).textContent=v.canPlayType("video/xxx" );
var a = document.getElementById("a" );
document.getElementById("d21" ).textContent=a.canPlayType("audio/mp3" );
document.getElementById("d22" ).textContent=a.canPlayType("audio/ogg" );
document.getElementById("d23" ).textContent=a.canPlayType("audio/aac" );
document.getElementById("d24" ).textContent=a.canPlayType("audio/xxx" );
</script>
どれが probably や maybe になるかは、ブラウザやプラグインの状況で変わります。また、再生不可能という判定になっても、実際には再生できる場合もあります。
動画 (video) や 音声 (audio) も参照してください。
表示例
(2) メディア再生
再生を開始したり、一時停止します。
メディアオブジェクト.play()
メディア再生を開始する。
引数 :なし
戻り値 :なし
メディアオブジェクト.pause()
メディア再生を一時停止する。
引数 :なし
戻り値 :なし
記述例
<video id = "v" width = "160" height = "100" > </video>
<source src = "xxxxx.ogv" type = 'video/ogg; codecs="theora, vorbis"' >
<source src = "xxxxx.mp4" type = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"' >
</video> <br>
<div id = "s" class = "switch" onclick = "play();" > 再生</div>
<script>
var v = document.getElementById("v" );
var s = document.getElementById("s" );
var pause = true ;
v.addEventListener('ended' , play, false );
function play() {
if (pause == true ) {
pause = false ;
s.textContent = "一時停止" ;
v.play();
}
else {
pause = true ;
s.textContent = "再生" ;
v.pause();
}
}
</script>
表示例
(3) メディア・リソースのロード
src 属性に指定されたメディアを読み込みます。
preload が 'none' の場合は src 属性でメディア・リソースを指定しただけでは読み込まれませんので、load する必要があります。ただし、play を実行すれば読み込まれますので、再生する場合には特に必要ないかもしれません。また、autoplay 属性が指定されているも読み込まれます。
メディアオブジェクト.load()
メディア・リソースをロードする。
引数 :なし
戻り値 :なし
記述例
<video id = "v" src = "xxxxx1.mp4" width = "160" height = "100" preload = "none" autoplay > </video>
<select name = "file" onchange = "set(this);" >
<option value = "xxxxx1" label = "ねこ1" > </option>
<option value = "xxxxx2" label = "ねこ2" > </option>
<option value = "xxxxx3" label = "ねこ3" > </option>
</select>
<br>
<div id = "s" class = "switch" onclick = "play();" > 再生</div>
<script>
var v = document.getElementById("v" );
var s = document.getElementById("s" );
var pause = true ;
var ext = ".mp4" ;
v.addEventListener('ended' , play, false );
function play() {
if (pause == true ) {
pause = false ;
s.textContent = "一時停止" ;
v.play();
}
else {
pause = true ;
s.textContent = "再生" ;
v.pause();
}
}
function set(c) {
v.src = c[c.selectedIndex].value + ext;
v.load();
pause = true ;
play();
}
</script>
「ねこ1」「ねこ2」「ねこ3」を選択すると、対応する動画が再生されます。
Sleipnir では MP4 ではなく、WEBM を再生しています。
表示例
8.13 イベント(Event)
イベントオブジェクトは、イベントが起きたときに呼び出されるメソッド(イベントリスナー)に最初の引数として渡されます。もし参照の必要がなければ、引数を記述しなくても構いません。
function foo(event ) {
alert(event );
}
button.onclick = foo;
イベントの発生によって実行されるイベントハンドラーに、引数として渡されるイベントオブジェクトは、 Event から派生しているか、あるいは Event から派生したイベントオブジェクトから派生しています。
イベントについては、「10 イベント」 を参照してください。