フォーム内の選択されたテキストを取得するスクリプトについて解説します。
最近では、
などで、投稿する文字に太字や斜体などのマークアップを行えるものがあります。
これらは、入力欄(大抵は<textarea>要素)内の選択した範囲の初めと終わりにそれぞれ開始タグ・終了タグに相当する記号を附与するようにします。
選択した範囲とは、グラフィカルなユーザエージェントなら反転表示させた範囲となります。
この機能を実現するには、フォーム入力欄のどの区間が選択されているかを認識する必要があります。
インターネットエクスプローラ 4.x以降では、
document.selection.createRange().text
でフォームのみならず、ウィンドウ内のあらゆるテキストの情報を取得出来ます。
もじら系ユーザエージェントやオペラ 8.x以降にもこれに相当するメソッドがあるにはあるのですが(window.getSelection()メソッド)、これはフォーム以外のテキストは取得出来ても、フォームの入力欄の情報を取得する事は出来ません。
その代わり、フォーム入力欄の選択されている区間の起点と終点を情報として取得出来ます。
以下のフォームのテキスト欄に入っている文字列から、任意の区間を選択して、表示を押して下さい。
対応しているユーザエージェントであれば、選択した文字列が、ボタンの後のテキスト欄に表示される事でしょう。
実際にはどのようになっているのかを見てみましょう。
まず、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スクリプト側「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='情報が取得出来ません';}
document.selection.createRange().text
で、選択されているテキストをフォーム入力欄 gs に書き出します。
但し、単純にこの方法を採ると、フォーム外のテキストを反転させていた場合にそのテキストをそのまま拾ってしまいます。
そこで、document.selection.createRange().textでテキストを取得する前に、
document.forms[0].tx.focus();
でフォーム入力欄 tx にフォーカスを移します。
selectionStartプロパティで取得し、有効な値であれば、選択終了地点 e を selectionEndプロパティで取得します。substring()メソッドを用いて当該区間を取り出し、それをフォーム入力欄 gs に書き出します。どのような場合に使えるか?でも解説した通り、実際にはフォームの入力欄に入れられた文字列を何らかの形で加工するのに利用する事が多いと思われます。
この用途の場合、当該フォームの入力データは加工された結果に置き換えられる必要があります。
加工した結果を反映させるには、以下のようになります。
document.selection.createRange().text
に代入するだけで、当該箇所が変更されます。
尚、このとき、選択された部分の前後については考慮する必要はありません。
このとき、代入すべき値は
選択箇所より前の入力欄内の文字列+加工した文字列+選択箇所より後ろの入力欄内の文字列
となります。
つまり、選択部分の前後の内容も併せて代入しないといけません。
substring()メソッドで切り出す事が出来ます。Copyright ©平成18年-平成24年 さいたま・しらぎくさいと 版権所有
marguerite.site@gmail.com