SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

IEのコンテキストメニュー用インストーラーとソフトの作成

IEで選択した部分のソースコードを右クリックメニューで編集する(後編)

IEのコンテキストメニュー用インストーラーとソフトの作成


「選択範囲の削除」関数

 ここでは、選択範囲の削除を行う方法を示します。削除の処理は、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メソッドで行えます。ダイアログの右上の終了ボタンを押した場合は、strRepnullが代入されます。その際は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 );

 選択範囲の文字列を書き換えるのは、削除する場合とほとんど変わりありません。空の文字列を代入する代わりに、書き換えたい文字列を代入するだけです。

次のページ
まとめ(完成プログラム)

この記事は参考になりましたか?

IEのコンテキストメニュー用インストーラーとソフトの作成連載記事一覧
この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/875 2008/08/21 21:12

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー