JavaScript - 提取特定节点以及节点起始位置

标签 javascript

以下是一个示例节点,

<div>Hell<span class="locate">Q1</span>o <b>w<span class="locate">Q2</span>or</b>ld</div>

我的目标是提取所有“定位”类节点及其起始字符/文本位置(因此稍后,我可以重用该文本/字符位置来注入(inject)节点)

例如:

<div>Hell<span class="locate">Q1</span>o <b>w<span class="locate">Q2</span>or</b>ld</div>

提取类似的东西

输出: <强>1。提取

[
    {
        "start": 5,
        "node": "<span class='locate'>Q1</span>"
    },
    {
        "start": 9,
        "node": "<span class='locate'>Q2</span>"
    }
]
  1. 移除 locate 节点到 Hello world`

到目前为止我已经尝试过: treeWalker = document.createTreeWalker(输入, NodeFilter.SHOW_ALL);

while(treeWalker.nextNode()) {
    temp = {};
    currentNode = treeWalker.currentNode;
    if (currentNode.parentNode.tagName.toLowerCase() === 'div') {
        totalText += currentNode.textContent.length;
        if (
            currentNode.className &&
            currentNode.className.toLowerCase() === 'locate'
        ) {
            temp.startPosition = totalText;
            temp.node = currentNode.cloneNode(true);
            collectorArray.push(temp);
            console.log(currentNode, totalText);                               
        } else {
            updatedNode.appendChild(currentNode.cloneNode(true));
            console.log(currentNode, totalText);                               
        }
    }
} 

我尝试使用 TreeWalker 来收集节点和起始位置,但是,我找不到任何地方。

我也觉得我计算 text 长度的方式是错误的。可能是更好的方法?

整个过程的思路是,在发生一些文本更改后,使用开始位置和收集到的节点,重新应用收集到的locate 节点。

最佳答案

试试这个(抱歉代码段中的缩进错误):

var nodeIterator = document.createNodeIterator(
  document.getElementById('someId'),

  NodeFilter.SHOW_ELEMENT,

    { acceptNode: function(node) {
      if ( node.className == 'locate' ) {
        return NodeFilter.FILTER_ACCEPT;
      }
    }
  },
  false
);


var node;
var doc = document.getElementById('someId').textContent;

var result = [];
var currentStart = 0;

while ((node = nodeIterator.nextNode())) {

  var tempDoc = doc.slice(currentStart, doc.length);
  var idx = tempDoc.indexOf(node.textContent);  
	var temp = {};  
  
	temp.start = currentStart + idx;
	temp.node = node.outerHTML;

	currentStart += (idx + node.textContent.length);

	result.push(temp);
    
}

console.log(result)
<div id="someId">Hell<span class="locate">Q1</span>o <b>w<span class="locate">Q1</span>or</b>ld<span class="locate">Q1</span></div>

请注意,我使用 SHOW_ELEMENT 是因为您可以通过元素类名来区分需要什么。所以稍后你可以在迭代器中设置一个规则,只接受那些节点。

然后我获取根元素的 textContent 并从迭代器对象获取接受节点的索引值。

关于JavaScript - 提取特定节点以及节点起始位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040703/

相关文章:

javascript - 如何向开发类插入滚动条

javascript - Angular CLI 在 node_modules 之外添加脚本

JavaScript 异常不会从 chrome 返回到 Visual Studio 2017

javascript - iframe ng-attr-srcdoc 在较低版本的 android 中不起作用(4.3 及以下)

javascript - 如何在 Angular 应用程序中调用 APP_INITIALIZER

javascript - 检查 'number' html 表单输入的值并仅在高于 0 时才验证

javascript - 在模糊上用一类提交多个表单(jquery、rails)

javascript - 在node.js(readline)中逐行读取数据,但完成后对象始终为空

javascript - React State Hook如何从ES6 Destructuring Assignment中获取状态变量名

javascript - 大学学习JavaScript,这应该是一个基于框架的样式查看器