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

2008/11/13

【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だと末尾へ
でよいのですね。

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

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

覚書」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


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

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

戻るリンク追加

カレンダー

2022年4月
          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 26 27 28 29 30

ココログカレンダーPlus(旧2)

検索


    • Web全体 サイト内
    • 蔵書のISBNを入力して下さい
    • はじめる前
      初級者向け
      上級者向け
      ブログ紹介
      結果を表示

コメントリストツリー化

無料ブログはココログ