トップページ >  HTML5 >  The text selection APIs
初版2011/08/26: 最終更新日2011/08/26
The text selection APIs
目次
編集可能なドキュメント
Text Selection API
Editing API
編集可能なドキュメント

これまでのウェブコンテンツでは、テキスト入力フィールドやテキストエリアでのみ、文章の編集ができました。
html5では、編集できる範囲はテキスト入力フィールドやテキストエリアに限らず、通常のコンテンツでも編集が出来るようになります。
また、テキストの選択についても、通常のコンテンツを含めて制御が出来るようになります。
またテキスト編集そのものも、単なるテキストのみではなく、ワープロ感覚でリッチテキストとして編集できるようになります。

このページでは、html5によって実現できるコンテンツ編集に関するAPIをご紹介します。

contenteditable属性
html5(狭義)の仕様で定義されている「コンテンツ編集」に関する属性です。
HTML5の基本 HTML5の新グローバル属性」を参照ください。
Text Selection API
選択されたテキストの情報を取得するための仕組み(API)です。
Editing API
ワープロ感覚でリッチテキストとして編集するための仕組み(API)です。
Text Selection API

Text Selection APIは、選択されたテキストの情報を取得するための仕組み(API)です。

フォームの強化 APIの強化」で、テキスト入力フィールドやテキストエリアでのテキスト選択取得について述べています。
実は、テキスト選択の制御はテキスト入力フィールドやテキストエリアに限らず、テキストコンテンツを持つ要素全てに適用出来るAPIが策定されています。
それが、「Text Selection API」です。

各ブラウザの対応

Text Selection APIは、2011年8月現在以下のブラウザで対応しています。
FireFox 4~、Safari 5~、Google Chrome 9~、Opera 11~、IE 9~
但し、実装の度合いや選択されたテキストに含まれる特殊文字などは、ブラウザにより異なりますので、ご注意ください。

選択範囲を取得する

選択範囲は「Selection」オブジェクトとして提供されます。
「Selection」オブジェクトは、「getSelection」メソッドで取得することができます。

仕様上は、windowオブジェクトからでも、documentオブジェクトからでも同じ「Selection」オブジェクトを取得します。
但し、FireFox、Operaに関しては、documentオブジェクトからの「getSelection」メソッドは、「Selection」オブジェクトではなく、テキストのみを取得します。
ブラウザでの差異に対応するためには、「window.getSelection()」を使う方がよいです。

window.getSelection();
document.getSelection();

選択されたテキストは、「toString」メソッドにて取り出すことができます。
その他のプロパティは以下の通りです。

selection.isCollapsed
選択状態を確認する読み取り専用プロパティです。
選択してなければtrue、選択していればfalseです。
selection.anchorNode
選択開始位置を含むDOMノードの要素オブジェクトを取得する読み取り専用プロパティです。
選択されていない場合は、nullとなります。
selection.anchorOffset
対象DOMノード内の選択開始位置を取得する読み取り専用プロパティです。
選択されていない場合は、0となります。
selection.focusNode
選択終了位置を含むDOMノードの要素オブジェクトを取得する読み取り専用プロパティです。
選択されていない場合は、nullとなります。
selection.focusOffset
対象DOMノード内の選択終了位置を取得する読み取り専用プロパティです。
選択されていない場合は、0となります。

リスト1. 選択されたテキスト情報の取得

//テキスト選択情報を取得。(Windowオブジェクト)
function mySelectWin(){
	//選択テキストを取得
	var selection = window.getSelection();

	//選択内容を取得
	try{
		var text = selection.toString();
	}
	catch( e ){
		var text = "";
	}

	//選択状態を取得
	var str = "";
	var node = null;
	try{
		str += "選択状態:" + selection.isCollapsed + "\n";
		node = selection.anchorNode;
		if( node !== null ){
			str += "開始ノード:" + node.parentNode.tagName + "\n";
			str += "開始位置:" + selection.anchorOffset + "\n";
		}
		node = selection.focusNode;
		if( node !== null ){
			str += "終了ノード:" + node.parentNode.tagName + "\n";
			str += "終了位置:" + selection.focusOffset + "\n";
		}
	}
	catch( e ){
		str = "エラー:" + e.message + "\n";
	}

	//結果の表示
	alert(
		"window.getSelection : " + typeof( selection ) + "\n" +
		"テキスト : " + text + "\n" +
		str
	);
}

//テキスト選択情報を取得。(Documentオブジェクト)
function mySelectDoc(){
	//選択テキストを取得
	var selection = document.getSelection();

	//選択内容を取得
	try{
		var text = selection.toString();
	}
	catch( e ){
		var text = "";
	}

	//選択状態を取得
	var str = "";
	var node = null;
	try{
		str += "選択状態:" + selection.isCollapsed + "\n";
		node = selection.anchorNode;
		if( node !== null ){
			str += "開始ノード:" + node.parentNode.tagName + "\n";
			str += "開始位置:" + selection.anchorOffset + "\n";
		}
		node = selection.focusNode;
		if( node !== null ){
			str += "終了ノード:" + node.parentNode.tagName + "\n";
			str += "終了位置:" + selection.focusOffset + "\n";
		}
	}
	catch( e ){
		str = "エラー:" + e.message + "\n";
	}

	//結果の表示
	alert(
		"document.getSelection : " + typeof( selection ) + "\n" +
		"テキスト : " + text + "\n" +
		str
	);
}

実装例


※このページ内でテキストを選択状態にして、上記ボタンを押してみてください。

選択範囲を親要素全体に変更したり、選択した範囲を削除することもできます。

selection.selectAllChildren(ノード)
DOMノード全体を選択状態にするメソッドです。
selection.deleteFromDocument()
選択されたテキストを削除するメソッドです。

リスト2. 選択範囲の操作

//選択範囲を親要素全体に変更
function mySelectAll(){
	//選択テキストを取得
	var selection = window.getSelection();

	//選択状態を取得
	var node = null;
	try{
		if( ! selection.isCollapsed ){
			node = selection.anchorNode.parentNode;
			selection.selectAllChildren(node);
		}
	}
	catch( e ){
		alert("エラー:" + e.message + "\n");
	}
}

//テキスト選択をコンテンツから削除
function mySelectDelete(){
	//選択テキストを取得
	var selection = window.getSelection();
	//選択範囲を削除
	selection.deleteFromDocument();
}

//応用例
//選択の解除
function mySelectClear(){
	//選択テキストを取得
	var selection = window.getSelection();
	//空ノードの作成
	var node = document.createElement('span');
	try{
		if( ! selection.isCollapsed ){
			//空ノードを選択
			selection.selectAllChildren(node);
		}
	}
	catch( e ){
		alert("エラー:" + e.message + "\n");
	}
}

実装例


※このページ内でテキストを選択状態にして、上記ボタンを押してみてください。

Editing API

Editing APIは、ワープロ感覚でリッチテキストとして編集するための仕組み(API)です。

「WISYWIGエディタ」と呼ばれるテキストエリアをJavascriptでワープロやリッチテキストエディタのように編集できる仕組みはよく知られています。
この「WISYWIGエディタ」と同様なことをウェブ標準でできるAPIを、html5で策定しようとしているのが、「Editing API」です。

各ブラウザの対応

Editing APIは、2011年8月現在以下のブラウザで対応しています。
FireFox 4~、Safari 5~、Google Chrome 9~、Opera 11~、IE 9~

Editing APIのメソッド

Editing APIでは、各メソッドにより編集操作を行います。
各コマンドは、選択テキストに対して実行されます。
以下は、その各メソッドになります。

document.execCommand( commandID [,showUI, value] )
編集コマンドを実行します。
第1引数 commandID は、実行する編集コマンドです。
第2引数は、コマンドに対するユーザインターフェースの表示の有無にかかわるフラグ(true/false)です。省略可能です。
第3引数は、コマンドが必要とする追加情報です。省略可能です。
document.execCommandSupported( commandID )
編集コマンドがサポートしているものかを確認します。
第1引数 commandID は、確認する編集コマンドです。
サポートしていれば true 、しなければ false です。
document.execCommandEnabled( commandID )
編集コマンドが実行可能なものかを確認します。
第1引数 commandID は、確認する編集コマンドです。
実行可能ならば true 、不可であれば false です。

他に「execCommandIndeterm」、「execCommandState」、「execCommandValue」などのメソッドがありますが、その実装度合いは各ブラウザにより異なります。

Editing APIのコマンド

Editing APIを利用する上で、編集コマンドは選択したテキストを装飾する基本コマンドです。
実際には、選択された要素を装飾要素で囲うことになります。
編集コマンドには、以下のようなものがあります。

bold
選択したテキストを、太字にしたり、太字を解除したりします。
装飾方法はブラウザによって異なります。
italic
選択したテキストを、斜体にしたり、斜体を解除したりします。
subscript
選択したテキストを、下付け文字にしたり、下付け文字を解除したりします。
superscript
選択したテキストを、上付け文字にしたり、上付け文字を解除したりします。
delete
選択したテキストを、削除します。
もしくはカーソル前の文字を1文字削除します。
Safari、Chromeでのみ動作します。
forwordDelete
選択したテキストを、削除します。
もしくはカーソルの次の文字を1文字削除します。
Safari、Chromeでのみ動作します。
insertImage
選択した範囲を、新規の画像と入れ替えます。
画像を選択する場合は
document.execCommand('insertImage', true, null);
画像URLを直接指定する場合は
document.execCommand('insertImage', false, url);
とします。
IEは、必ずテキストの選択が必要です。
insertHTML
選択した範囲を、HTMLコードと入れ替えます。
document.execCommand('insertHTML', false, "ここにHTMLコードを入れます");
IEには対応していません。
insertText
選択した範囲を、テキストと入れ替えます。
document.execCommand('insertText', false, "ここにテキストを入れます");
<>は、&lt;及び&gt;となります。
Safari、Chromeでのみ動作します。
insertLineBreak
カーソル位置に改行を入れます。
Safari、Chromeでのみ動作します。
insertOrderedList
選択されたテキストを、順序リスト(ol)に変換します。
insertUnorderedList
選択されたテキストを、非順序リスト(ul)に変換します。
formatBlock
選択されたテキストを、指定した要素で囲みます。
document.execCommand('formatBlock', false, "要素タグ");
insertParagraph
カーソル位置でブロックを分割します。
実際はカーソル前後を別々にp要素またはdiv要素で囲みます。
装飾方法はブラウザによって異なります。
createLink
選択した範囲を、ハイパーリンクしたり、解除したりします。
リンク先を対話型で選択する場合は
document.execCommand('createLink', true, null);
リンクURLを直接指定する場合は
document.execCommand('createLink', false, url);
とします。
対話型はIEのみ対応しています。
unlink
選択テキストを含むハイパーリンクを解除します。
selectAll
フォーカスを当てている領域のコンテンツを全て選択状態にします。
unselect
選択しているテキストを解除します。
undo
直前のコマンドの実行を取り消します。
redo
直前に取り消されたコマンドを再実行します。