2009-08-23 10 views
3

私のアプリケーションでは、範囲(https://developer.mozilla.org/en/DOM/range)を頻繁に使用する必要があります。特に、ユーザーは頻繁にテキストを強調表示し、それを操作します。ユーザーが間違って単語の断片を含むテキストを強調表示すると、奇妙な結果が生じることがあります。範囲オブジェクトが単語の途中で開始または終了しないようにする

範囲を指定すると、単語の途中で終了するのか終了するのかを確認したい場合は、開始した単語全体が含まれるように展開します/の途中で終わった。

答えて

1

私は範囲で作業しませんでしたが、ハイライトは空白文字の直後に始まり、空白文字の直前で終了するように聞こえます。このチェックを実行する関数をonmouseupイベントを発生させる必要があります。この関数への応答は、単語の終わりに、ハイライトの位置を自動的に修正する必要があります。私はまた強調表示の冒頭でそれを動作させて、ユーザーが単語の真ん中をクリックし、単語の先頭からキャプチャするようにハイライトを正しく設定して、動きの損なわれたインターフェースを持つユーザーへのアクセシビリティを高めることができるようにする。テストメソッドを使って正規表現変数を使って空白文字を定義することもできます。

1

これはどうでしょうか?ちょっとハッキーだったけど、Firefoxでテストしたところ、うまくいきました。

function fixRange(range) 
{ 
    var rangeString = range.toString(); 
    try 
    { 
     while (rangeString[0] != " ") 
     { 
      range.setStart(range.startContainer, range.startOffset - 1); 
      rangeString = range.toString(); 
     } 
     range.setStart(range.startContainer, range.startOffset + 1); 
    } catch (e) {} 
    try 
    { 
     while (rangeString[rangeString.length - 1] != " ") 
     { 
      range.setEnd(range.endContainer, range.endOffset + 1); 
      rangeString = range.toString(); 
     } 
     range.setEnd(range.endContainer, range.endOffset - 1); 
    } catch (e) {} 
    return range; 
} 

使用例(再選択する選択された範囲):たぶん、それはあなたが始められるでしょう

var selection = window.getSelection(); 
selection.addRange(fixRange(selection.getRangeAt(0))); 
+0

これは非常に近いです - 私は変更しなければならなかった二 'while'に'(rangeString [rangeStringこれはほとんどうまくいきますが、何らかの不安定な振る舞いがあります(例:行の終わり近くで一度クリックすると、次のようになります)。その時点より前のすべてを選択してください)。 –

+0

ええ、私はあなたが改行をチェックする必要があると言及するのを忘れていました。たぶんタブも。 Hmm ..今までのところあなたのコードを投稿してください。我々はそれを見ることができます。このコードを実行する前に、折りたたまれた(空の)範囲を確認する必要があるように思えるでしょうか? – InvisibleBacon

関連する問題