获取元素的文本节点
<div class="title"> I am text node <a class="edit">Edit</a> </div>
我希望得到“我是文本节点”不希望删除“编辑”标签,并需要一个跨浏览器的解决scheme。 这可能是简单的事情,但我想不出另一种办法。
var text = $(".title").contents().filter(function() { return this.nodeType == Node.TEXT_NODE; }).text();
这将获取所选元素的contents
,并为其应用filterfunction。 过滤函数只返回文本节点(即nodeType == Node.TEXT_NODE
节点)。
如果您的意思是获取元素中第一个文本节点的值,则此代码将工作:
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/
.text() - for jquery
$('.title').clone() //clone the element .children() //select all the children .remove() //remove all the children .end() //again go back to selected element .text(); //get the text of element
另一个可用于“复杂”或深度嵌套元素的原生JS解决scheme是使用NodeIterator 。 把NodeFilter.SHOW_TEXT
作为第二个参数(“whatToShow”),并遍历元素的文本节点子节点。
var root = document.getElementById('...'), iter = document.createNodeIterator (root, NodeFilter.SHOW_TEXT), textnode; while (textnode = iter.nextNode()) { // do something with the text node }
你也可以使用TreeWalker
。 两者之间的区别在于NodeIterator
是一个简单的线性迭代器,而TreeWalker
允许您通过兄弟和祖先进行导航。
返回第一个#text节点内容的ES6版本
const extract = (node) => { const nodes = Array.from(node.childNodes).filter(f => f.nodeName === '#text'); return nodes.length ? nodes[0].textContent.trim() : ''; }
这将忽略空白,所以,你从来没有得到空白textNodes..code使用核心的Javascript。
var oDiv = document.getElementById("MyDiv"); var firstText = ""; for (var i = 0; i < oDiv.childNodes.length; i++) { var curNode = oDiv.childNodes[i]; whitespace = /^\s*$/; if (curNode.nodeName === "#text" && !(whitespace.test(curNode.nodeValue))) { firstText = curNode.nodeValue; break; } }
检查它在jsfiddle: – http://jsfiddle.net/webx/ZhLep/
您也可以使用XPath的text()
节点testing来获取文本节点。 例如
var target = document.querySelector('div.title'); var iter = document.evaluate('text()', target, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE); var node; var want = ''; while (node = iter.iterateNext()) { want += node.data; }