計算相對於父容器的範圍開始和結束偏移
假設您遇到以下HTML 元素:
<div>
使用者用滑鼠選擇文字「home」。確定「#parent」元素內的字元偏移量是一項常見任務,尤其是在選擇 HTML 標記時。
雖然「range.startOffset」屬性提供相對於直接容器的偏移量,但它僅限於字元偏移量當容器是文字節點時。為了克服這個限制,我們提出了一個更新的解決方案:
function getSelectionCharacterOffsetWithin(element) { var start = 0; var end = 0; var doc = element.ownerDocument || element.document; var win = doc.defaultView || doc.parentWindow; var sel; if (typeof win.getSelection != "undefined") { sel = win.getSelection(); if (sel.rangeCount > 0) { var range = win.getSelection().getRangeAt(0); var preCaretRange = range.cloneRange(); preCaretRange.selectNodeContents(element); preCaretRange.setEnd(range.startContainer, range.startOffset); start = preCaretRange.toString().length; preCaretRange.setEnd(range.endContainer, range.endOffset); end = preCaretRange.toString().length; } } else if ((sel = doc.selection) && sel.type != "Control") { var textRange = sel.createRange(); var preCaretTextRange = doc.body.createTextRange(); preCaretTextRange.moveToElementText(element); preCaretTextRange.setEndPoint("EndToStart", textRange); start = preCaretTextRange.text.length; preCaretTextRange.setEndPoint("EndToEnd", textRange); end = preCaretTextRange.text.length; } return { start: start, end: end }; }
為了演示更新的方法,我們初始化事件偵聽器以捕獲選擇更改並更新頁面上的日誌元素:
function reportSelection() { var selOffsets = getSelectionCharacterOffsetWithin( document.getElementById("editor") ); document.getElementById("selectionLog").innerHTML = "Selection offsets: " + selOffsets.start + ", " + selOffsets.end; } window.onload = function () { document.addEventListener("selectionchange", reportSelection, false); document.addEventListener("mouseup", reportSelection, false); document.addEventListener("mousedown", reportSelection, false); document.addEventListener("keyup", reportSelection, false); };
此程式碼可讓您準確地確定HTML 元素中使用者選擇的字元偏移量,即使在選擇HTML 標籤時也是如此。
以上是如何準確地確定 HTML 元素內的字元偏移?的詳細內容。更多資訊請關注PHP中文網其他相關文章!