編集(管理者用) | 編集 | 差分 | 新規作成 | 一覧 | RSS | 表紙 | 検索 | 更新履歴

SelectedTexts

選択文字列を取得するためのJavaScript。

ソース

function SelectedTexts() {
	this.texts = [];

	this._traceFrames = function(win){
		this._getSelectedText(win);
		var len = win.frames.length;
		for(var i = 0; i < len; i++){
			this._traceFrames(win[i]);
		}
	};

	this._getSelectedText = function(win){
		var text;
		try {
			text = win.getSelection().toString();
		} catch(e) {
			return;
		}
		if (text) {
			this.texts.push(text);
		} else {
			var inputAreas = this._getInputAreas(win);
			var len = inputAreas.length;
			for (var i = 0; i < len; i++) {
				var ia = inputAreas[i];
				var start = ia.selectionStart;
				var end = ia.selectionEnd;
				if (start < end) {
					this.texts.push(ia.value.substr(start, end - start));
				}
			}
		}
	};

	this._getInputAreas = function(win){
		var elements = win.document.getElementsByTagName('*');
		var inputAreas = [];
		var len = elements.length;
		for (var i = 0; i < len; i++) {
			var el = elements[i];
			var tagName = el.tagName.toLowerCase();
			if(tagName == 'textarea') {
				inputAreas.push(el);
			} else if (tagName == 'input') {
				var type = el.type.toLowerCase();
				if (!type || type == 'text') {
					inputAreas.push(el);
				}
			}
		}
		return inputAreas;
	};

	this._traceFrames(window);
	this.first = this.texts[0];
	this.length = this.texts.length;
	this.each = function(func) {
		var len = this.texts.length;
		for (var i = 0; i < len; i++) {
			func(this.texts[i]);
		}
	};
}

実行環境

Firefox 2.0.0.x にて確認。

目的

選択文字列をJavaScriptで取得する場合、単一のページ上の文字列・フレーム分割されたページの文字列・フォームのテキスト入力欄内の文字列ではそれぞれ取得方法が異なり、ややこしいです。このスクリプトは、それら色々な箇所の選択文字列ををまとめて一括で取得するためのものです。

フレームやテキスト入力欄がある場合、ウィンドウ内には選択文字列が複数現われる場合もあるため、選択された文字列は配列(的なオブジェクト)として取得されます。

使い方

var texts = new SelectedTexts
SelectedTextsオブジェクトを返します。SelectedTextsオブジェクトとは「選択した文字列」の配列のようなもので、以下のプロパティ・メソッドを持ちます。
texts.first
「選択した文字列」の中で、最初に取得された文字列値。
texts.length
「選択した文字列」の数。
texts.texts
「選択した文字列」の配列。
texts.each( func )
それぞれの「選択した文字列」について、関数funcを実行します。funcは「選択した文字列」を第1引数にとる関数です。

制限

インラインフレーム(iframe)内の選択文字列は取得できません。

関連記事