如何获取元素的文本节点?

IT技术 javascript jquery
2021-02-09 03:35:19
<div class="title">
   I am text node
   <a class="edit">Edit</a>
</div>

我希望获得“我是文本节点”,不希望删除“编辑”标签,并且需要跨浏览器解决方案。

6个回答
var text = $(".title").contents().filter(function() {
  return this.nodeType == Node.TEXT_NODE;
}).text();

这将获取contents所选元素的 ,并对其应用过滤器功能。filter 函数只返回文本节点(即那些带有 的节点nodeType == Node.TEXT_NODE)。

没有 jQuery,document.querySelector(".title").childNodes[0].nodeValue
2021-03-11 03:35:19
不知道为什么,但在测试上述理论时我没有成功。我运行了以下命令 jQuery("*").each(function() { console.log(this.nodeType); })所有节点类型都得到了1
2021-03-25 03:35:19
@Val - 抱歉,我错过了原始代码。我会更新答案以显示它。您需要,text()因为该filter函数返回节点本身,而不是节点的内容。
2021-03-31 03:35:19
是否可以在单击的节点处获取文本并在其所有子节点中获取文本?
2021-04-10 03:35:19
这很有趣并且解决了这个问题,但是当情况变得更复杂时会发生什么?有一种更灵活的方式来完成工作。
2021-04-10 03:35:19

您可以使用获取第一个 childNode 的 nodeValue

$('.title')[0].childNodes[0].nodeValue

http://jsfiddle.net/TU4FB/

如果文本节点不是第一个子节点,您可能会得到null一个返回值。
2021-03-15 03:35:19
虽然这会起作用,但它取决于子节点的位置。如果(何时)发生变化,它将中断。
2021-04-08 03:35:19

另一种可用于“复杂”或深度嵌套元素的原生 JS 解决方案是使用NodeIteratorNodeFilter.SHOW_TEXT作为第二个参数(“whatToShow”),并逐一只是元素的文本节点孩子。

var root = document.querySelector('p'),
    iter = document.createNodeIterator(root, NodeFilter.SHOW_TEXT),
    textnode;

// print all text nodes
while (textnode = iter.nextNode()) {
  console.log(textnode.textContent)
}
<p>
<br>some text<br>123
</p>

您也可以使用TreeWalker. 两者之间的区别在于它NodeIterator是一个简单的线性迭代器,同时还TreeWalker允许您通过兄弟姐妹和祖先进行导航。

如果您的意思是获取元素中第一个文本节点的值,则此代码将起作用:

var oDiv = document.getElementById("MyDiv");
var firstText = "";
for (var i = 0; i < oDiv.childNodes.length; i++) {
    var curNode = oDiv.childNodes[i];
    if (curNode.nodeName === "#text") {
        firstText = curNode.nodeValue;
        break;
    }
}

你可以在这里看到这个:http : //jsfiddle.net/ZkjZJ/

我认为你也可以使用curNode.nodeType == 3代替nodeName
2021-03-12 03:35:19
@ShadowWizard 另外,如果您打算使用循环来筛选childNodes,请知道一个元素节点可以有多个文本节点。在通用解决方案中,可能需要指定要定位的元素节点中的文本节点的哪个实例(第一个、第二个、第三个等...)。
2021-03-16 03:35:19
@ShadowWizard @Nilloc 推荐的方法是使用常量...... curNode.nodeType == Node.TEXT_NODE(数字比较更快但 curNode.nodeType == 3 不可读 - 哪个节点有数字 3?)
2021-03-22 03:35:19
@Nilloc 可能,但有什么好处?
2021-03-30 03:35:19
@ShadowWizard 使用curNode.NodeType === Node.TEXT_NODE这种比较发生在未知可能迭代的循环中。比较两个小数比比较不同长度的字符串要好(时间和空间考虑)。在这种情况下要问的正确问题是“我有什么类型/类型的节点?”,而不是“我有什么名字?” developer.mozilla.org/en-US/docs/Web/API/Node/nodeType
2021-04-08 03:35:19

返回第一个 #text 节点内容的 ES6 版本

const extract = (node) => {
  const text = [...node.childNodes].find(child => child.nodeType === Node.TEXT_NODE);
  return text && text.textContent.trim();
}
你有什么建议来替换 Array.from ?
2021-03-16 03:35:19
我想知道效率和灵活性。(1) 使用.from()来制作一个浅拷贝的数组实例。(2) 使用 进行.find()字符串比较 使用.nodeName. 使用node.NodeType === Node.TEXT_NODE会更好。(3) 没有值时返回空字符串null,如果没有找到文本节点,则更真实如果未找到文本节点,则可能需要创建一个!如果返回空字符串 ,""可能会产生文本节点存在且可以正常操作的错误印象。本质上,返回空字符串是善意的谎言,最好避免。
2021-03-21 03:35:19
@Snowman 请为此类实质性更改添加您自己的答案,或向 OP 提出建议,让他们有机会将它们纳入他们的答案中。
2021-03-24 03:35:19
@jujule - 更好地用于[...node.childNodes]HTMLCollection转换为数组
2021-03-27 03:35:19
(4)如果一个nodeList中有多个文本节点,这里没有办法指定你想要哪个文本节点。您可能需要第一个文本节点,但您很可能需要最后一个文本节点。
2021-04-09 03:35:19