你想要这样的东西
HTML
<span id="result_5_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Blue</span>
<span id="result_6_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Navy</span>
<span id="result_7_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Red</span>
<span id="result_8_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Green</span>
<span id="result_9_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Navy</span>
Javascript
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
function getElementsByText(node, text) {
var results = [];
walkTheDOM(node, function (currentNode) {
if (currentNode.nodeType === 3 && currentNode.nodeValue === text) {
results.push(currentNode.parentNode);
}
});
return results;
}
console.log(getElementsByText(document, 'Item | Anodized Navy'));
输出
[span#result_6_name.market_listing_item_name, span#result_9_name.market_listing_item_name]
开启jsFiddle
附加 1,正如我们谈到的 treeWalker
function getElementsByText(node, text) {
var results = [],
treeWalker = document.createTreeWalker(
node,
NodeFilter.SHOW_TEXT, {
acceptNode: function (node) {
return NodeFilter.FILTER_ACCEPT;
}
}, false);
while (treeWalker.nextNode()) {
if (treeWalker.currentNode.nodeValue === text) {
results.push(treeWalker.currentNode.parentNode);
}
}
return results;
}
console.log(getElementsByText(document, 'Item | Anodized Navy'));
开启jsFiddle
附加 2,正如我们谈到的 getElementsByTagName('*')
function getElementsByText(node, text) {
var results = [],
tags = node.getElementsByTagName('*'),
tagsLength = tags.length,
tagsIndex,
currentTag,
childNodes,
childNodesLength,
ChildNodesIndex,
currentChildNode;
for (tagsIndex = 0; tagsIndex < tagsLength; tagsIndex += 1) {
currentTag = tags[tagsIndex];
childNodes = currentTag.childNodes;
childNodesLength = childNodes.length;
for (ChildNodesIndex = 0; ChildNodesIndex < childNodesLength; ChildNodesIndex += 1) {
currentChildNode = childNodes[ChildNodesIndex];
if (currentChildNode.nodeType === 3 && currentChildNode.nodeValue === text) {
results.push(currentTag);
}
}
}
return results;
}
console.log(getElementsByText(document, 'Item | Anodized Navy'));
开启jsFiddle
请注意,这些解决方案是相同的,但与此处给出的所有contains 解决方案不同。因为这些解决方案实际上为您提供了具有匹配文本节点的节点作为子节点。我使用的简单标记没有说明这一点,但是当您的标记高度嵌套时,您很快就会注意到差异。
最后是这 3 个解决方案中的 jsPerf。