「選択範囲の削除」関数
ここでは、選択範囲の削除を行う方法を示します。削除の処理は、1行記述すれば済むため非常に簡単です。
以下、プログラムのソースコードを示します。この部分は、[選択範囲の削除]ボタンの、onClick属性で指定してあるDelSel()関数の実装になります。onClick属性は、オブジェクトがクリックされた際に実行されるスクリプトを記述する場所です。
//=================================================================== //======================================== // // 選択範囲の削除 // //======================================== // 引数 :なし // 返り値:なし // 仕様 :選択範囲を削除する。 function DelSel () { //==== 選択範囲を削除 ============================================= // objSel.text = ""; // 選択中テキストを空にする }
1点だけ注意すべきところがあります。それは、objSel.textから作成したstrSelPlainを空にする(strSelPlain = "";とする)のではなく、objSel.textを直接空にする(objSel.text = "";とする)点です。strSelPlainは、objSel.textと同じ文字列が入っていますが、実際は、互いに関係のないまったく違う変数です。そのため、Webページの選択範囲を削除するためには、objSel.textを直接空にしなければなりません。そのため、ここではobjSel.text = "";としてあります。
「選択範囲を書き換え」関数
ここでは、選択範囲の書き換えを行う方法を示します。この部分は、[選択範囲の書き換え]ボタンの、onClick属性で指定してあるRepSel()関数の実装になります。
//=================================================================== //======================================== // // 選択範囲を書き換え // //======================================== // 引数 :なし // 返り値:なし // 仕様 :選択範囲を書き換える。 function RepSel () { //==== 書き換え文字列の取得 ======================================= // var strRep = strSelPlain; strRep = prompt( "検索文字列を入力してください", strRep ); if ( ! strRep ) { return; } //==== promptの結果にごみが付く問題の回避処理 ===================== // strRep = escape( strRep ); strRep = strRep.replace( /%0.*$/, "" ); strRep = unescape( strRep ); //==== 選択範囲を書き換え ========================================= // objSel.text = strRep; // 選択中テキストを書き換える }
「書き換え文字列の取得」の部分についてですが、ユーザーからの文字列の取得は、promptメソッドで行えます。ダイアログの右上の終了ボタンを押した場合は、strRepにnullが代入されます。その際はif ( ! strRep ) { return; }という行で関数を抜けるようにしています。
さて、このIEのpromptメソッドなのですが、実は少々難があります。promptメソッドで日本語文字列を取得した際に、その末尾に入力した文字とは違う文字コードが追加されることがあります。そのため、この追加された部分(以下、ごみ)を削除してやる必要があります。その処理が「promptの結果にごみが付く問題の回避処理」の部分になります。
以下、「promptの結果にごみが付く問題の回避処理」の部分の説明です。この「ごみ」を見たい場合は、次のようなプログラムを書いてください。
alert( "回避前 [" + strRep + "] ←注目" ); strRep = escape( strRep ); strRep = strRep.replace( /%0.*$/, "" ); strRep = unescape( strRep );
文字列の末尾に問題が生じており、alertメソッドの結果に異常が生じることが分かります。「] ←注目」という部分が正しく表示されません。これは、strRepの末尾に不要な文字コードが紛れ込んでいるためです。
この問題は、promptメソッドから取得した文字列をescapeメソッドで、URLエンコードするとよく分かります。URLエンコードしたあとの文字列を見ると、大抵の場合、末尾に「%0~」という部分が追加されています。そこで、strRep.replace( /%0.*$/, "" );として、末尾に現れる「%0」以降をすべて削除してしまいます。最後に、unescapeメソッドで通常の文字列に戻せば、この問題は回避できます。
以下、確認用のプログラムです。
strRep = escape( strRep ); s1 = "escape [" + strRep + "]\n"; strRep = strRep.replace( /%0.*$/, "" ); s2 = "末尾削除後 [" + strRep + "]\n"; strRep = unescape( strRep ); s3 = "回避終了後 [" + strRep + "]\n"; alert( s1 + s2 + s3 );
選択範囲の文字列を書き換えるのは、削除する場合とほとんど変わりありません。空の文字列を代入する代わりに、書き換えたい文字列を代入するだけです。
