堀北真希うさぎ
主な作品
人気女優をモデルにした制作者の創作キャラクタを用いた作品の一例

ページ案内

フォーム内の選択されたテキストを取得するスクリプト。

フォーム内の選択されたテキストを取得するスクリプトについて解説します。

フォーム内の選択されたテキストを取得するスクリプト・目次。

どのような場合に使えるか?

最近では、

などで、投稿する文字に太字や斜体などのマークアップを行えるものがあります。

これらは、入力欄(大抵は<textarea>要素)内の選択した範囲の初めと終わりにそれぞれ開始タグ・終了タグに相当する記号を附与するようにします。

この機能を実現するには、フォーム入力欄のどの区間が選択されているかを認識する必要があります。

フォーム内の選択されたテキストを取得するには。

インターネットエクスプローラ 4.x以降では、

document.selection.createRange().text

でフォームのみならず、ウィンドウ内のあらゆるテキストの情報を取得出来ます。

もじら系ユーザエージェントやオペラ 8.x以降にもこれに相当するメソッドがあるにはあるのですが(window.getSelection()メソッド)、これはフォーム以外のテキストは取得出来ても、フォームの入力欄の情報を取得する事は出来ません。

その代わり、フォーム入力欄の選択されている区間の起点と終点を情報として取得出来ます。

フォーム内の選択されたテキストを取得するサンプル。

以下のフォームのテキスト欄に入っている文字列から、任意の区間を選択して、表示を押して下さい。

対応しているユーザエージェントであれば、選択した文字列が、ボタンの後のテキスト欄に表示される事でしょう。

実際のスクリプト。(平成19年 8月17日 更新)

実際にはどのようになっているのかを見てみましょう。

HTML側の記述。

まず、HTML側では、以下のように記述されております。

<form action="#" onsubmit="change(); return(false); ">
    <p><textarea rows="4" cols="32" name="tx">あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよ</textarea></p>
    <p><input type="submit" value="表示" /> <input type="text" name="gs" value="" /></p>
    </form>

ここで、選択の対象となっている入力欄(<textarea>要素)には tx と言う名前がname属性で与えられているものとします。

また、gs と言う名前が与えられている<input>要素は、結果を出力するためのものです。

JAVAスクリプトでの記述。(平成19年 8月17日 更新)

一方、JAVAスクリプト側「GetSelectedTextInForm.js」では、以下のように記述されております。

function change() {
    if (navigator.userAgent.indexOf('Opera/7.')>-1 ||
        navigator.userAgent.indexOf('Opera 7.')>-1 ||
        navigator.userAgent.indexOf('Opera/6.')>-1 ||
        navigator.userAgent.indexOf('Opera 6.')>-1)
        document.forms[0].gs.value='情報が取得出来ません';
    else if (document.all && !window.opera) {
        document.forms[0].tx.focus();
        document.forms[0].gs.value=document.selection.createRange().text;
        }
    else if (document.getElementById) {
        s=document.forms[0].tx.selectionStart;
        if (s!=0 || s=='0') {
            e=document.forms[0].tx.selectionEnd;
            document.forms[0].gs.value=document.forms[0].tx.value.substring(s,e);
            }
        else document.forms[0].gs.value='';
        }
    else document.forms[0].gs.value='情報が取得出来ません';
    }

JAVAスクリプトの処理の流れは以下のようになります。

  1. オペラ 6.x〜7.xではエラーとします。
  2. インターネットエクスプローラでは、独自仕様の
    document.selection.createRange().text

    で、選択されているテキストをフォーム入力欄 gs に書き出します。

    但し、単純にこの方法を採ると、フォーム外のテキストを反転させていた場合にそのテキストをそのまま拾ってしまいます。

    そこで、document.selection.createRange().textでテキストを取得する前に、

    document.forms[0].tx.focus();

    でフォーム入力欄 tx にフォーカスを移します。

  3. その他の標準準拠ユーザエージェントでは、
    1. フォーム入力欄 tx 内での選択開始地点 sselectionStartプロパティで取得し、有効な値であれば、選択終了地点 eselectionEndプロパティで取得します。
    2. 続いて、フォーム入力欄 tx の内容を substring()メソッドを用いて当該区間を取り出し、それをフォーム入力欄 gs に書き出します。
  4. その他は標準準拠でないのでエラーとします。

実際に利用する場合。 (平成18年11月10日 追記)

どのような場合に使えるか?でも解説した通り、実際にはフォームの入力欄に入れられた文字列を何らかの形で加工するのに利用する事が多いと思われます。

この用途の場合、当該フォームの入力データは加工された結果に置き換えられる必要があります。

加工した結果を反映させるには、以下のようになります。

インターネットエクスプローラの場合
加工した文字列を、読み出したプロパティ
document.selection.createRange().text

に代入するだけで、当該箇所が変更されます。

尚、このとき、選択された部分の前後については考慮する必要はありません。

その他の標準準拠ユーザエージェントの場合
加工したものを当該入力欄のオブジェクトに代入する事になります。

このとき、代入すべき値は

選択箇所より前の入力欄内の文字列 + 加工した文字列 + 選択箇所より後ろの入力欄内の文字列

となります。

つまり、選択部分の前後の内容も併せて代入しないといけません。

しらぎくのウェブサイト作成入門サイトマップ



marguerite.site@gmail.com