Javascript js TreeWalker和/或document.createRange()未拾取单个元素
我有一个具有单个内部节点的div:Javascript js TreeWalker和/或document.createRange()未拾取单个元素,javascript,html,range,Javascript,Html,Range,我有一个具有单个内部节点的div: <section id="Source" class="source"> <div> test </div> </section> 但是在这个过程中的某个地方,最里面的节点丢失了 正如您在完整代码(包含在代码段中)中所看到的,“测试”范围保留在源代码中,而应该移动到克隆中 const source=document.getElementById('source'); const target=
<section id="Source" class="source">
<div>
test
</div>
</section>
但是在这个过程中的某个地方,最里面的节点丢失了
正如您在完整代码(包含在代码段中)中所看到的,“测试”范围保留在源代码中,而应该移动到克隆中
const source=document.getElementById('source');
const target=document.getElementById('target');
const wrapper=document.getElementById('wrapper');
wordWrap(来源);
拆分内容(源、目标、包装器);
//拆分内容(源、目标、包装器);
函数拆分内容(源、目标、包装器){
常数{
高度
}=target.getBoundingClientRect();
const maxHeight=高度;
常量范围=document.createRange();
const endNode=findEndNode(源,最大高度);
range.setStart(源,0);
range.setEnd(endNode.endContainer,endNode.endOffset);
const content=range.extractContents();
const clone=target.cloneNode(false);
clone.id='clone';
clone.appendChild(内容);
appendChild(克隆);
const hasChildren=source.hasChildNodes();
};
函数findEndNode(源,最大高度){
常量范围=document.createRange();
范围。选择节点内容(源);
var节点=document.createTreeWalker(
来源:,
NodeFilter.SHOW_元素,
无效的
无效的
);
while(node=nodes.nextNode()){
range.setEndBefore(nodes.currentNode);
常数{
高度
}=range.getBoundingClientRect();
常数范围高度=高度;
如果(maxHeight您的endoffset处于禁用状态。在findEndNodes
中,当您找到节点时,当前代码假定偏移量比需要的少一个,这是因为您使用的是setEndBefore,而您应该使用setEndAfter
const source=document.getElementById('source');
const target=document.getElementById('target');
const wrapper=document.getElementById('wrapper');
wordWrap(来源);
拆分内容(源、目标、包装器);
//拆分内容(源、目标、包装器);
函数拆分内容(源、目标、包装器){
常数{
高度
}=target.getBoundingClientRect();
const maxHeight=高度;
常量范围=document.createRange();
const endNode=findEndNode(源,最大高度);
range.setStart(源,0);
range.setEnd(endNode.endContainer,endNode.endOffset);
const content=range.extractContents();
const clone=target.cloneNode(false);
clone.id='clone';
clone.appendChild(内容);
appendChild(克隆);
const hasChildren=source.hasChildNodes();
};
函数findEndNode(源,最大高度){
常量范围=document.createRange();
范围。选择节点内容(源);
var节点=document.createTreeWalker(
来源:,
NodeFilter.SHOW_元素,
无效的
无效的
);
while(node=nodes.nextNode()){
range.setEndAfter(nodes.currentNode);
常数{
高度
}=range.getBoundingClientRect();
常数范围高度=高度;
如果(最大高度
function findEndNode(source, maxHeight) {
const range = document.createRange();
range.selectNodeContents(source);
var nodes = document.createTreeWalker(
source,
NodeFilter.SHOW_ELEMENT,
null,
null
);
while (node = nodes.nextNode()) {
range.setEndBefore(nodes.currentNode);
const {
height
} = range.getBoundingClientRect();
const rangeHeight = height;
if (maxHeight <= rangeHeight) {
console.log('out of bounds');
const newNode = nodes.previousNode();
range.setEndBefore(nodes.currentNode);
break;
} else {
console.log('within bounds');
continue;
}
}
return range;
};