- PR -

選択文字列の開始桁取得について

1
投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-19 22:06
こんにちは。

http://www.gac.jp/article/index.php?stats=question&category=9&id=22653&command=msg
同じような質問がありますが、Selectionオブジェクトに取得した時の、選択が開始した行数の取得は可能でしょうか?(Selectionオブジェクトだとtextareaとかdivとか関係ないですよね??間違ってたらすいません。)

リファレンスを見る限り、なさそうですが・・。
よろしくお願いします。



[ メッセージ編集済み 編集者: 未記入 編集日時 2008-10-19 22:09 ]

[ メッセージ編集済み 編集者: 未記入 編集日時 2008-10-20 16:06 ]
未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-20 09:36
追記です。

環境周りを書いておりませんでしたが、私も同様にnicEditを使ってます。
nicEditでは、textareaに出力しているようで(出力先をtextareaにセット)、それ自体は非表示にされ、編集・表示領域はdiv領域を独自に生成したものが存在しています。

その為、textareaから取得しようにも取得できないと思います。

div領域の選択範囲の開始桁数(改行も含め)が分かればすぐに解決するのですが・・。

よろしくお願いします。
未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-21 14:00
追記です。

一応、下記コードでIE6 & FireFox3では動作するようになりました。
参考になったURLです。(http://www.fourmeisters.com/blog/yoshi/2007/09/wysiwyg.html)

nicEditを使っている為、多少違いがありますが、基本的には
selectionのObjectが、this.getSel();で取得できることです。

また、srcObjにgetElementByIdで取得していますが、デフォルトではついていませんで、
追加しました。

**************************************************************************
 var srcObj = document.getElementById("nicEdit-src");  //固定-Editorの表示パネル
 var const_BR = "~";   //改行文字置換文字列(禁止文字)

 var sel = this.getSel(); //SelectionObject
 var wrd = "";    //選択文字列
 var all_Ln = txt.length; //出力文字列の総桁数
 var sltObj = new Object();
 if(sel.createRange){
  // IE
  //選択文字列
  wrd = sel.createRange().text;
  // ※IE6改行2文字に置換されてしまう為暫定
  wrd = wrd.replace(/[\n\r]/g, const_BR);
  wrd = wrd.replace(new RegExp(const_BR+const_BR,"ig"), const_BR);

  //選択領域の最終ポイントを末尾に移動し、開始桁数を求める
  srcObj.focus();
  var creObj = sel.createRange().duplicate();
  creObj.moveToElementText(srcObj);
  creObj.setEndPoint('EndToEnd', sel.createRange());
  // ※IE6改行2文字に置換されてしまう為暫定
  a1 = clone.text.replace(/[\n\r]/g, const_BR);
  a1 = a1.replace(new RegExp(const_BR+const_BR,"ig"), const_BR);
  // ※IE6改行2文字に置換されてしまう為暫定
  a2 = sel.createRange().text.replace(/[\n\r]/g, const_BR);
  a2 = a2.replace(new RegExp(const_BR+const_BR,"ig"), const_BR);

  //選択領域開始桁
  sltObj.minPos = new Number(a1.length - a2.length);       //(総桁数 - 選択領域の開始ポイントを末尾に移動した桁数)
 } else {
  // IE以外
  //選択文字列
  wrd = new String(sel);
  // ※FF3改行2文字に置換されてしまう為暫定
  wrd = wrd.replace(/[\n\r]/g, const_BR);
  wrd = wrd.replace(new RegExp(const_BR+const_BR,"ig"), const_BR);
alert(wrd);

  //選択領域の最終ポイントを末尾に移動し、開始桁数を求める
  sel.getRangeAt(0).setEndAfter(srcObj);
  // ※FF3改行2文字に置換されてしまう為暫定
  a1 = new String(sel).replace(/[\n\r]/g, const_BR);
  a1 = a1.replace(new RegExp(const_BR+const_BR,"ig"), const_BR);

  //選択領域開始桁
  sltObj.minPos = new Number(all_Ln - a1.length);        //(総桁数 - 選択領域の最終ポイントを末尾に移動した桁数)
 }
****************************************************************************

ソースを見ていただくと分かるのですが(※部)、何回も改行文字を置換しています。
また、Safari & Choromeのブラウザでは、改行コードが得られず、開始文字列を正常に取得できません。
WinXP-SP3を使っていますが、windowsは\r\n,UNIXは\nの改行文字列(不確かですが・・)が標準だからでしょうか?

また、FireFox3ではちゃんと、sel.getRangeAt(0).setEndAfter(srcObj);で文字列の最後尾に移動し、総桁数から計算できるのですが、Safari & Choromeでは、最後尾に移動せず、選択文字列(Range)の最終ポイントにカーソルが合ったままです。

Rangeのメソッド自体setEndAfter以外、カーソルの最後尾移動に移すものが無いように思いましたが、同様な事を試した方いましたら、よろしくお願いします。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-10-21 18:23
改行
/(\r\n|\r|\n)/
でし。
\r\n => MS-DOS
\r => MAC
\n => LINUX

未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-22 09:12
ぴあちゃんさん、ありがとうございます。

おかげ様で若干ソースがすっきりしました。
あとは、RangeのsetEndAfter()コマンドですが、コマンドだけに
単純にブラウザ毎対応していないと言う気が・・。

でも、選択範囲の取得にはコマンドを使わずに取得できるとは思えませんし、ん〜・・。
1

スキルアップ/キャリアアップ(JOB@IT)