[英]how can I get the Character offset related to body with Range Object and window.getSelection()?
我正在用Javascript編寫客戶端應用程序,我正在使用以下函數:
function creation() {
var userSelection;
if (window.getSelection) {
userSelection = window.getSelection();
}
else if (document.selection) { // should come last; Opera!
userSelection = document.selection.createRange();
}
var rangeObject = getRangeObject(userSelection);
var startOffset = rangeObject.startOffset;
var endOffset = rangeObject.endOffset;
var startCon = rangeObject.startContainer;
var endCon = rangeObject.endContainer;
var myRange = document.createRange();
myRange.setStart(startCon,rangeObject.startOffset);
myRange.setEnd(endCon, rangeObject.endOffset);
$('#result').text(myRange.toString());
}
function getRangeObject(selectionObject) {
if (selectionObject.getRangeAt) {
var ret = selectionObject.getRangeAt(0);
return ret;
}
else { // Safari!
var range = document.createRange();
range.setStart(selectionObject.anchorNode, selectionObject.anchorOffset);
range.setEnd(selectionObject.focusNode, selectionObject.focusOffset);
return range;
}
}
我需要一種方法來了解與body元素相關的字符偏移量。 我找到了一個函數來計算元素中的字符:
function getCharacterOffsetWithin(range, node) {
var treeWalker = document.createTreeWalker(
node,
NodeFilter.SHOW_TEXT,
function (node) {
var nodeRange = document.createRange();
nodeRange.selectNode(node);
return nodeRange.compareBoundaryPoints(Range.END_TO_END, range) < 1 ?
NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
},
false
);
var charCount = 0;
while (treeWalker.nextNode()) {
charCount += treeWalker.currentNode.length;
}
if (range.startContainer.nodeType == 3) {
charCount += range.startOffset;
}
return charCount;
}
這看起來像我的一個答案中的函數。 我過分復雜了一點; 請參閱此答案,了解一個在IE <9中運行的更簡單的功能: https : //stackoverflow.com/a/4812022/96100 。 您只需傳入document.body
作為node
參數即可。 另外,請閱讀鏈接答案中有關此方法缺點的部分。
這是一個現場演示: http : //jsfiddle.net/PzQjA/
這是否已經“解決”了在內部文本而不是textContent中獲取caretOffset的方法?
通過雙擊選擇后,我有一個有效的解決方案......
在getSelection()周圍提取innerText的更好方法
還有更好的方法嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.