2008年11月13日(木)

« スクリプトバージョンアップのお知らせ(脚注展開表示/Yin and Yang/ReadMore) | トップページ | 【ココログ】管理画面のサイドバーなどを隠すCSS設定 »

【JScript】IEでTextRangeを使用する場合の注意

IE7(JScript)でTextRangeを使用していて、おかしな挙動に気がつきました。
TextRangeでは範囲内に<br />などが有る場合は改行とみなされますが、これが含まれる場合には、
  1. TextRange.moveStart('character', N)/TextRange.moveEnd('character', N)で選択範囲を移動する場合には、Nには改行を1文字とみなした数値を指定する必要がある。
  2. TextRange.text.lengthで取れるテキスト長は、改行を[CR][LF]の2文字とみなして計算されている模様。
    また、範囲中、最後の文字(改行以外)よりも後の改行文字数は、lengthに含まれない。
    従って、moveEndの挙動と矛盾する……(__;)/。
という点に注意してコーディングする必要が有ります。
1文字ずつ範囲を広げたり狭めたりした場合の挙動の例はこちら
1文字ずつ動かしているつもりが、lengthの値が急に飛んだりする現象がわかるかと。
特に、move*("character",-1)で範囲をせばめていくと思わぬ挙動を示すことが予想されるので、面倒でも
  1. TextRange作成時・要素選択時に、
    var TextRange=document.body.createRange();
    TextRange.moveToElementText(element);
    で対象要素を選んだ後、
    TextRange.setEndPoint('EndToStart',TextRange);
    のようにして、一旦、範囲をオブジェクトの先頭・length=0にリセットした後、改行が1文字と見なされることに注意しつつ、moveStart/moveEndで範囲を調整する。
  2. moveStart/moveEndでは、正方向の移動に限る。負方向への移動は使用しない。
  3. TextRange.text.lengthの値はそのままでは使わない。
    moveStart/moveEnd("character")で指定出来るオフセットの最大値を求めたい場合は、
    var text=TextRange.text.replace(/\r\n/g,'\n');
    として改行を1文字としたあとでtext.lengthを使用する。
のようにした方が、問題が起きにくい、かも。
【2008/11/13 追記】
上記に関連する内容が詳細に書かれた、ためになるページを見つけました。
Studio FREE-SKY - テキストエリアの選択範囲の位置を特定する
上で、選択位置を先頭・length=0にリセットするのに、
TextRange.setEndPoint('EndToStart',TextRange);
とやっていましたが、
TextRange.collapse(true); // デフォルトがtrue(先頭へ)、falseだと末尾へ
でよいのですね。

この記事をニフティクリップβに追加 この記事をはてなブックマークに追加 2008/11/13(木) 08:56 | | 記事の編集(管理者用)

風柳へひとこと(web拍手) 

パソコン・インターネット」カテゴリの記事

覚書」カテゴリの記事

トラックバック

この記事のトラックバックURL:

記事との関連性が薄いものやSPAM等、管理人が不適切と見なしたトラックバックについては予告無く削除する場合が有ります。悪しからずご了承下さい。

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/161784/43098403

この記事へのトラックバック一覧です: 【JScript】IEでTextRangeを使用する場合の注意:

コメント

コメントを書く