あなたの例のDOMは、あなたのDOMの実際の複雑さの効果的な例であり、「ラインボックス」は単なるテキスト行であると思います。
<span>
1-2)の内部ごとに<div>
、次のようなものでそれらがまたがる行の数を数えることができます。
var spans = div.getElementsByTagName("span"), spandata = [];
for (var i = 0; i < spans.length; i++) {
var rects = spans[i].getClientRects();
if (i > 0)
if (rects[0].bottom > obj.rects[obj.rects - 1].bottom)
var inirow = obj.lastRow + 1;
else var inirow = obj.lastRow;
var obj = {
element: spans[i],
rects: rects,
iniRow: inirow,
lastRow: inirow + rects.length - 1
};
spandata.push(obj);
}
これで、要素spandata
について必要なすべてのデータのリストが表示されます。<span>
また、それぞれが複数の行にまたがっている可能性があると思います。
getClientRects
IE<8にはいくつかの問題があることに注意してください。
3)最近のブラウザでは、このgetSelection
方法は次のことに役立ちます。
var sel = window.getSelection();
if (sel.type === "Caret")
var span = sel.anchorNode.parentNode;
ラインの位置については、簡単なことではないと言わざるを得ません。カレットのページ位置を簡単に取得することはできません。あなたができる最も簡単なことは、カレットの代わりにダミーのインライン要素を配置することです:
var text = sel.anchorNode.nodeValue;
sel.anchorNode.nodeValue = text.substring(0, sel.anchorOffset);
var dummy = document.createElement("i");
span.appendChild(dummy);
var pos = dummy.getBoundingClientRect();
sel.anchorNode.nodeValue = text;
span.removeChild(dummy);
pos
カレットの位置の情報が含まれています。次に、それらをスパンに関するrect情報と比較する必要があります。
var rects = span.getClientRects();
for (var i = 0; i < rects.length; i++)
if (rects[i]].bottom === pos.bottom) break;
if (i < rects.length) {
for (var i = 0; i < spandata.length; i++) {
if (spandata[i].element === span) {
var line = spandata[i].iniRow + i;
break;
}
}
}
最後に、の場合line != null
、それはカレットの線を含みます。
男、それは複雑だった...