2012-02-07 4 views
10

私のプロジェクトでは、カスタムキャレットでネイティブ選択をエミュレートしています。どの方向にユーザーがテキストを選択したかを検出する方法はありますか?つまり、そのユーザーは「hello world」というテキストを選択したと言います。 2つの可能性があります。文字「d」にマウスをクリックして始まり、文字「h」で終わるか、文字「h」で始まり文字「d」で終わることができます。これら2つの状況を区別する簡単な方法はありますか?ありがとうございました。javascriptでユーザ選択の方向を検出

+2

私はこの選択オブジェクトが十分にスマートではないと思います。あなたはマウスクリックの場所を記録し、それをあなた自身で把握しなければならないでしょう。 –

+0

@Diodeusそれを受け入れられるように答えをしてください。そして、(at)OPデフォルトを使用し、マウスの位置計算をあまりにも追加することで、これらのアクションのカスタムセッターとゲッターを追加してみてください。 – Relic

+0

可能です。 https://stackoverflow.com/a/12652116/96100 –

答えて

15

古い質問が、私は簡単に解決策を追加しようと思いました:

var sel = getSelection(), 
position = sel.anchorNode.compareDocumentPosition(sel.focusNode), 
backward = false; 
// position == 0 if nodes are the same 
if (!position && sel.anchorOffset > sel.focusOffset || 
    position === Node.DOCUMENT_POSITION_PRECEDING) 
    backward = true; 

Node.compareDocumentPosition(MDN

4

私が知っている限り、Javascriptに固有のプロパティやイベントはありませんが、方向を教えてくれます。 This siteマウスの方向を追跡する方法については、必要に応じて調整することができます。

基本的に、マウスの位置(loc.pageXまたはY、またはevent.clientXまたはYのいずれか)を取得できる限り、位置と時間に基づいて方向を追跡する独自の関数を記述することができます。

あなたのケースでは、ユーザーが「選択済み」のテキストを持っている場合、つまりmousedownイベントでのみキャプチャしたいと思うかもしれません。

+0

ありがとう、私はそれをする必要があります恐れて、でした:) – Ondra

+0

可能です。 https://stackoverflow.com/a/12652116/96100 –

+0

@TimDown確かに可能ですが、私が提供するリンクには1つのアプローチがあります。あなたにそれを与える*ネイティブ*関数/プロパティ(window.mouseDirectionなど)はありません。あなたの例のように、カスタムコードを作成する必要があります。 – Igor

1

マウスダウンのXのoffetを追跡し、その後のmouseupは、Xオフセット、及び結果は方向を示す:(jQueryの使用)

var textSelectionDirection = (function(){ 
    var direction = '', mouseDownOffset = null; 

    function getDirection(e){ 
     if(e.type == 'mousedown') 
      mouseDownOffset = e.clientX; 
     else if(e.type == 'mouseup'){ 
      direction = e.clientX < mouseDownOffset ? 'left' : 'right'; 
      console.log(direction); 
     } 
    } 

    return getDirection 
})(); 

$(document).on('mousedown mouseup', textSelectionDirection); 

DEMOhttp://jsfiddle.net/ffumv/

+0

これは現在マウス選択でのみ使用でき、キーボードでは使用できません – vsync

1

これは動作するはず:

function isBackwards(sel) { 
    var rg = document.createRange(); 
    rg.setStart(sel.anchorNode, sel.anchorOffset); 
    rg.setEnd(sel.focusNode, sel.focusOffset); 
    return !rg.toString(); 
} 

注:改行と空白の両方を選択できる場合は、上記の機能を変更する必要がありますそのような場合には、何であってもtrueを返します。

+0

単一のテキストノードでは動作しません。開始ノードと終了ノードが同じでない場合にのみ動作します。 – Jordan

1

私はのカップルのための私の作品解決策を見つけるためにしようとしていました日々。ここでは、これは、単一の範囲選択で動作します、私が思い付いたものです:

var selection = window.getSelection(); 
var range = selection.getRangeAt(0); 
var isSelectionDown = selection.focusNode === range.endContainer; 
var isSelectionUp = selection.focusNode === range.startContainer; 

選択の焦点ノードは、ユーザーがマウスを離したところ、常にですが、範囲の終了とコンテナは方向に応じて変化し始めます。

+0

選択が複数のノードにわたる場合にのみ機能します。問題がなければ、 'var isReverse = selection 'に減らすことができます。anchorNode!== selection.getRangeAt(0).startContainer; ' – Pocketsand

関連する問題