Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js TreeWalker和/或document.createRange()未拾取单个元素_Javascript_Html_Range - Fatal编程技术网

Javascript js TreeWalker和/或document.createRange()未拾取单个元素

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=

我有一个具有单个内部节点的div:

<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;
};