2009年8月30日日曜日

Opera9.46とjQuery1.3.2、TEXTAREA要素の値を利用する際の注意

Windows版Opera 9.46、jQuery 1.3.2の環境でのことであるが、改行を含むTEXTAREAの値を、DOM要素のvalueプロパティから得るか、jQuery要素のvalメソッドから得るかで、値の内容が異なることがわかった。

よくわからないが、改行文字に関連するらしい。
改行が存在する文字列の場合、jQueryのvalメソッドで得られる文字列の長さは、DOMのvalueプロパティで得られる文字列の長さより、改行の数分短い。

jQueryのソースコードをみると、valメソッド内では、DOM要素のvalueプロパティで得た文字列のなかの「\r」(復帰文字?)を取り除く処理が行われているから、これが原因かと思う。おそらくOSごと、ブラウザごとに得られる値が異なるのでは困る、ということでこうした標準化処理を行っているのだろう。これ自体は親切な機能である。

ただ今回このTEXTAREA要素の値を利用するのが、ほかならぬこの要素内の文字列の選択範囲の情報(選択範囲の開始や終了の位置、キャレットの位置など)を取得する、というものであったため問題が起きた。

[追記 2009/8/30]

Opera 9.64 ではTEXTAREA要素内の文字列の選択範囲操作のとき、「\r」(復帰文字)の存在を考慮して、選択開始位置、終了位置などの文字数を調整する必要がある──でないと他のブラウザとの間で挙動に差が生じる──が、IEではむしろ「\r」の存在は考慮しないほうがよいらしい。Opera同様に「\r」を1文字と数えて調整を行うと、逆に他のブラウザとの間で挙動がズレてしまう(すくなくともIE8ではそうであった)。

0 件のコメント: