html怎么更改页面显示范围怎么办,在HTML中选择后,保持范围对象的更改

如果光标位于新段落的开头,则使用字符偏移不起作用。下面的方法遍历DOM节点并将所有节点计入偏移量。它还可以单独处理开始和结束,以确保选择记住其确切位置。这是我在一个主要项目中使用的更新版本(参见最后的函数):/*

Gets the offset of a node within another node. Text nodes are

counted a n where n is the length. Entering (or passing) an

element is one offset. Exiting is 0.

*/var getNodeOffset = function(start, dest) {

var offset = 0;

var node = start;

var stack = [];

while (true) {

if (node === dest) {

return offset;

}

// Go into children

if (node.firstChild) {

// Going into first one doesn't count

if (node !== start)

offset += 1;

stack.push(node);

node = node.firstChild;

}

// If can go to next sibling

else if (stack.length > 0 && node.nextSibling) {

// If text, count length (plus 1)

if (node.nodeType === 3)

offset += node.nodeValue.length + 1;

else

offset += 1;

node = node.nextSibling;

}

else {

// If text, count length

if (node.nodeType === 3)

offset += node.nodeValue.length + 1;

else

offset += 1;

// No children or siblings, move up stack

while (true) {

if (stack.length <= 1)

return offset;

var next = stack.pop();

// Go to sibling

if (next.nextSibling) {

node = next.nextSibling;

break;

}

}

}

}};// Calculate the total offsets of a nodevar calculateNodeOffset = function(node) {

var offset = 0;

// If text, count length

if (node.nodeType === 3)

offset += node.nodeValue.length + 1;

else

offset += 1;

if (node.childNodes) {

for (var i=0;i

offset += calculateNodeOffset(node.childNodes[i]);

}

}

return offset;};// Determine total offset length from returned offset from rangesvar totalOffsets = function(parentNode, offset) {

if (parentNode.nodeType == 3)

return offset;

if (parentNode.nodeType == 1) {

var total = 0;

// Get child nodes

for (var i=0;i

total += calculateNodeOffset(parentNode.childNodes[i]);

}

return total;

}

return 0;};var getNodeAndOffsetAt = function(start, offset) {

var node = start;

var stack = [];

while (true) {

// If arrived

if (offset <= 0)

return { node: node, offset: 0 };

// If will be within current text node

if (node.nodeType == 3 && (offset <= node.nodeValue.length))

return { node: node, offset: Math.min(offset, node.nodeValue.length) };

// Go into children (first one doesn't count)

if (node.firstChild) {

if (node !== start)

offset -= 1;

stack.push(node);

node = node.firstChild;

}

// If can go to next sibling

else if (stack.length > 0 && node.nextSibling) {

// If text, count length

if (node.nodeType === 3)

offset -= node.nodeValue.length + 1;

else

offset -= 1;

node = node.nextSibling;

}

else {

// No children or siblings, move up stack

while (true) {

if (stack.length <= 1) {

// No more options, use current node

if (node.nodeType == 3)

return { node: node, offset: Math.min(offset, node.nodeValue.length) };

else

return { node: node, offset: 0 };

}

var next = stack.pop();

// Go to sibling

if (next.nextSibling) {

// If text, count length

if (node.nodeType === 3)

offset -= node.nodeValue.length + 1;

else

offset -= 1;

node = next.nextSibling;

break;

}

}

}

}};exports.save = function(containerEl) {

// Get range

var selection = window.getSelection();

if (selection.rangeCount > 0) {

var range = selection.getRangeAt(0);

return {

start: getNodeOffset(containerEl, range.startContainer) + totalOffsets(range.startContainer, range.startOffset),

end: getNodeOffset(containerEl, range.endContainer) + totalOffsets(range.endContainer, range.endOffset)

};

}

else

return null;};exports.restore = function(containerEl, savedSel) {

if (!savedSel)

return;

var range = document.createRange();

var startNodeOffset, endNodeOffset;

startNodeOffset = getNodeAndOffsetAt(containerEl, savedSel.start);

endNodeOffset = getNodeAndOffsetAt(containerEl, savedSel.end);

range.setStart(startNodeOffset.node, startNodeOffset.offset);

range.setEnd(endNodeOffset.node, endNodeOffset.offset);

var sel = window.getSelection();

sel.removeAllRanges();

sel.addRange(range);};

这仅适用于现代浏览器(至少IE 9+)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值