IEでテキストエリア内のカーソル位置を取得する

IEでテキストエリア内のカーソル位置を取得するのは
firefoxみたいにSelectionStart,SelectionEndが無いので
非常に難しい。
 
今ネット上には解決策が二つ程転がってると思う。

1. Selection.jsを使う
 2005-10-23 - こせきの日記
 で作られている、Selection.jsを使えば、テキストエリア内のStart、Endが
 取得できる。素晴らしい。
 でも、欠点が二つ。サンプルがあるので試して欲しいんだけど、
 
 Realtime JavaScript Evaluator

  • テキストの一番最後にカーソルを合わせると、カーソルが最初に戻ってしまう。(IEの場合ね)

  まぁ、これについては回避するのは簡単だけど、次の問題がどうしようもない。

  • 日本語の入力がおかしくなる(IEの場合ね)

  これ作り的にどうしようもない。残念。。。
    
 
2.id:brazilさんの取得方法
 http://d.hatena.ne.jp/brazil/20061021/1161377936
 で紹介されている取得方法でやってみる。これだと、日本語入力もできる。
 素晴らしい。素敵すぎる。
 でも、これもちょっと不具合が。

  • 改行後の(たとえば二行目)の先頭のカーソル位置がうまく取得できない。

  例:↓テキストエリア

aaaaaa
aaa ←この先頭のカーソル位置が取れない

  解決策としては、カーソルを一度移動して、カーソル位置取得して、戻るということをやれば
  できるかなーと思ってやってみた。
 

function move(move_num, area) {
  var range = document.selection.createRange();
  var move_fun = "";
  if(move_num > 0) {
    move_fun = "moveStart";
  } else {
    move_fun = "moveEnd";
  }
  range.select();
  area.focus();
}

function area_selection() {
  var docRange = document.selection.createRange();
  var textRange = document.body.createTextRange();
  textRange.moveToElementText(this.area);

  var range = textRange.duplicate();
  this.move(1, $('area'));
  docRange = document.selection.createRange();
  range.setEndPoint('EndToEnd', docRange);
  var start = range.text.length - 1;
  this.move(-1, $('area'));
  return { start: start, end : start };
}

 実はまだちょこちょこ弄ってるけど、その詳細は後ほど。
 これで、やっと安眠できる。。。
 
■追記
でも、色々不具合があって上記の方法でも駄目みたいなので、また眠れない日々が。