【JScript】IEでTextRangeを使用する場合の注意
IE7(JScript)でTextRangeを使用していて、おかしな挙動に気がつきました。
TextRangeでは範囲内に<br />などが有る場合は改行とみなされますが、これが含まれる場合には、
という点に注意してコーディングする必要が有ります。
TextRangeでは範囲内に<br />などが有る場合は改行とみなされますが、これが含まれる場合には、
- TextRange.moveStart('character', N)/TextRange.moveEnd('character', N)で選択範囲を移動する場合には、Nには改行を1文字とみなした数値を指定する必要がある。
- TextRange.text.lengthで取れるテキスト長は、改行を[CR][LF]の2文字とみなして計算されている模様。
また、範囲中、最後の文字(改行以外)よりも後の改行文字数は、lengthに含まれない。
従って、moveEndの挙動と矛盾する……(__;)/。
1文字ずつ範囲を広げたり狭めたりした場合の挙動の例はこちら。
1文字ずつ動かしているつもりが、lengthの値が急に飛んだりする現象がわかるかと。
特に、move*("character",-1)で範囲をせばめていくと思わぬ挙動を示すことが予想されるので、面倒でも
- TextRange作成時・要素選択時に、
var TextRange=document.body.createRange();で対象要素を選んだ後、
TextRange.moveToElementText(element);
TextRange.setEndPoint('EndToStart',TextRange);のようにして、一旦、範囲をオブジェクトの先頭・length=0にリセットした後、改行が1文字と見なされることに注意しつつ、moveStart/moveEndで範囲を調整する。
- moveStart/moveEndでは、正方向の移動に限る。負方向への移動は使用しない。
- 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設定 »
「パソコン・インターネット」カテゴリの記事
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
- BIGLOBE光ネクスト(大阪)の通信速度問題 - プロバイダ選びは難しい……(2015.08.13)
- BOOK☆WALKER さんに関して最近経験した不安と不満(2015.08.10)
- 『#鳥獣戯画制作キット』が楽しい(2015.07.01)
「覚書」カテゴリの記事
- 鍛高譚 ~ カレイにまつわる物語(2018.05.25)
- ココログをTwitterカードに対応させてみる(2016.11.23)
- 神使の兎 ~宇治神社にて~(2016.07.10)
- Twitter 原寸びゅー:PC版ブラウザ用・Twitterの画像閲覧と保存がはかどる拡張機能の紹介(2016.02.12)
- スマートフォンをPC上の音楽を再生するためのリモコンとして使いたい(2016.01.10)
« スクリプトバージョンアップのお知らせ(脚注展開表示/Yin and Yang/ReadMore) | トップページ | 【ココログ】管理画面のサイドバーなどを隠すCSS設定 »
コメント