私は Rangy のコードを掘り下げました (それは素晴らしい! しかし、私の使用例に完全に含めるのはやり過ぎです)。誰かが完全なクロスブラウザー互換性を必要としない限り、彼女はネイティブのワンライナーを使用することができます:
var pos = window.getSelection().getRangeAt(0).getClientRects()[0]
top
そして、利用可能な、bottom
、right
およびleft
onがありますpos
(うそをつきました-本当にワンライナーではありません。範囲があるかどうかを確認するためにラップする必要があります)。
Firefox で動作する必要があるだけなので、それで十分です。
概要:
- Firefox 17 / Chrome 23 で完全に動作します (キャレットを追跡するだけで、実際の選択がなく、キャレット ブラウジングを有効にする必要もありません)
- ただし、ページの空の部分 (テキストではなく) をクリックする
と、実際にはキャレットがどこかに移動することF7に注意してください ( Firefox でキャレット ブラウジングを有効にして場所を確認してください)。段落間をクリックすると、通常は段落の終わり (段落の隣、またはカーソルのすぐ上にある最も近いテキストをクリックした場合) になります。
- Opera 12 では、空でない選択がある場合にのみ機能します。
- IE8 では動作しません。IE9 や IE10 では確認していません。
デモ (JSFiddle では動作しないため、ここに完全にダンプします):
<!DOCTYPE html>
<head>
<script type="text/javascript">
var getSelectionTopLeft = function (){
var selection = window.getSelection();
var rangePos, x, y;
if(selection.rangeCount) {
rangePos = window.getSelection().getRangeAt(0).getClientRects()[0];
// you can get also right and bottom here if you like
x = parseInt(rangePos.left);
y = parseInt(rangePos.top);
console && console.log("found selection at: x=" + x + ", y=" + y);
}else{
x = 0;
y = 0;
console && console.log("no selections found");
}
return {x: x, y: y};
}
var move = function (offsetX, offsetY){
var coords = getSelectionTopLeft();
var square = document.getElementById('square');
square.style.left = (coords.x + offsetX) + 'px';
square.style.top = (coords.y + offsetY) + 'px';
}
</script>
<style type="text/css">
#square {position:absolute; top:0; left:0; width:10px; height:10px; background-color:red;}
</style>
</head>
<body>
<h1>Caret position test</h1>
<div id="square"></div>
<button onclick="move(5, 5)">move the square 5px/5px below the caret</button>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Curabitur tempor pharetra iaculis. Ut tempor mauris et ligula
aliquam sed venenatis dui pharetra. Duis dictum rutrum venenatis.
Cras ut lorem justo.</p>
<p>Nam vehicula elit tincidunt nibh elementum venenatis. Duis a facilisis sem.
Morbi luctus porttitor feugiat. Nunc feugiat augue eu tortor interdum fermentum
a tincidunt felis.</p>
</body>
</html>