2008-09-22 12:40 追記

下のコードだと,どうやら Safari で取得できなかったみたいですね.

document.getSelection() || window.getSelection() の部分の documentwindow を入れ替えてみたところ,取得できました.

ということで,ソースコードを修正しておきました.

はじめに

つまり 「あるページとそのページ内のテキストボックス・テキストエリアにおける選択文字列を取得する」 ということになりますかね.
岩家ぶろぐ » [javascript] bookmarklet で選択文字列を取得する件で

以前に書いたコードを見直したところ結構無駄があったので,書き直してみました.

書き直したソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var get_selected_text = function() {
  var ret = '';
  try {
    //ret = ( document.getSelection()  ||  window.getSelection()  ||  '' ).toString();  // document.getSelection はFirefox,Operaで動作,window.getSelectionはSafariで動作  // del: 2008-09-22 12:40:00+09:00
    ret = ( window.getSelection()  ||  document.getSelection()  ||  '' ).toString();  // document.getSelection はFirefox,Operaで動作,window.getSelectionはSafariで動作  // ins: 2008-09-22 12:40:00+09:00
    if( ret ) { return ret; }
  }
  catch( e ) { return ret; }
 
  var tagnames = [ 'input', 'textarea' ];
  for( var i = 0; i < tagnames.length; i++ ) {
    var elements = document.getElementsByTagName( tagnames[ i ] );
    for( var j = 0; j < elements.length; j++ ) {
      var e = elements[ j ];
      if( e.tagName == 'input'  &&  e.type.toLowerCase() != 'text' ) { continue; }
 
      var sel_start = (function(){ try { return e.selectionStart; } catch( e ) { return 0; } })()
        , sel_end   = (function(){ try { return e.selectionEnd;   } catch( e ) { return 0; } })()
      ;
      if( sel_start == sel_end ) { continue; }
      return e.value.substring( sel_start, sel_end );
    }
  }
  return ret;
};

簡単な解説

var selected_text = get_selected_text(); のようにすることで,アクティヴなウィンドウ上,テキストボックス,テキストエリアのいずれかにおける選択文字列を取得します.

おわりに

例外発生を確認できたところに対してのみ try-catch 構文を使っていますが,細かくは動作検証していません.

なお,IEは起動すらしていません.あしからず...

関連エントリ

このエントリへのトラックバック

このエントリへのトラックバックはまだありません.


このエントリへのコメント »

このエントリへのコメントはまだありません.

コメントをどうぞ

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt=""> <pre lang="" line="">