如何通过innerText获取元素

IT技术 javascript innertext
2021-01-16 17:09:38

如果我知道文本标签包含什么,如何在 html 页面中获取标签。例如:

<a ...>SearchingText</a>
6个回答

您可以使用 xpath 来完成此操作

var xpath = "//a[text()='SearchingText']";
var matchingElement = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

您还可以使用此 xpath 搜索包含某些文本的元素:

var xpath = "//a[contains(text(),'Searching')]";
这应该是最佳答案。XPath 可以做更多的事情,比如按属性值选择节点,选择节点集……简单介绍:w3schools.com/xml/xpath_syntax.asp
2021-03-15 17:09:38
@Daniel 您需要将调用更改为:js var matchingElementSet = document.evaluate(xpath, document, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); while(element = result.iterateNext()) { // do something with each element } developer.mozilla.org/en-US/docs/Web/API/XPathResult/...
2021-03-26 17:09:38
IE浏览器中似乎Document.evaluate() 不应该
2021-03-29 17:09:38
问题是,这个诡计的性能损失是什么
2021-04-06 17:09:38
@vsync 我认为这将比任何其他答案都快,因为 xpath 是由浏览器提供的算法执行的,而不是像这里的所有其他答案一样在 javascript 中执行。不过这是一个有趣的问题。
2021-04-10 17:09:38

你必须手动穿越。

var aTags = document.getElementsByTagName("a");
var searchText = "SearchingText";
var found;

for (var i = 0; i < aTags.length; i++) {
  if (aTags[i].textContent == searchText) {
    found = aTags[i];
    break;
  }
}

// Use `found`.
更新了示例, textContent 在这种情况下可能是您想要的。谢谢,伙计们:)
2021-03-12 17:09:38
@AutoSponge 实际上,innerHTML 是标准的。innerText 在 FF 中不起作用
2021-03-14 17:09:38
不,这个问题是关于 JavaScript 和 HTML,而不是 Java
2021-03-21 17:09:38
我发现如果你有 <span><span>search text</span></span> 这个方法可能会返回外部跨度而不是内部跨度。
2021-03-24 17:09:38
@AugustLilleaas,这是i < il怎么回事?那是在做什么?
2021-03-25 17:09:38

使用目前可用的最现代的语法,可以像这样非常干净地完成:

for (const a of document.querySelectorAll("a")) {
  if (a.textContent.includes("your search term")) {
    console.log(a.textContent)
  }
}

或者使用单独的过滤器:

[...document.querySelectorAll("a")]
   .filter(a => a.textContent.includes("your search term"))
   .forEach(a => console.log(a.textContent))

自然,旧版浏览器不会处理这个问题,但如果需要旧版支持,您可以使用转译器。

比为 xpath 学习一种新的解析语言要好得多,而且更容易迭代。
2021-03-27 17:09:38

您可以使用 jQuery :contains() 选择器

var element = $( "a:contains('SearchingText')" );
我明白了:Error: <![EX[["Tried to get element with id of \"%s\" but it is not present on the page","a:contains('SearchingText')"]]]> TAAL[1]虽然我有带有“SearchingText”的元素。
2021-04-09 17:09:38

function findByTextContent(needle, haystack, precise) {
  // needle: String, the string to be found within the elements.
  // haystack: String, a selector to be passed to document.querySelectorAll(),
  //           NodeList, Array - to be iterated over within the function:
  // precise: Boolean, true - searches for that precise string, surrounded by
  //                          word-breaks,
  //                   false - searches for the string occurring anywhere
  var elems;

  // no haystack we quit here, to avoid having to search
  // the entire document:
  if (!haystack) {
    return false;
  }
  // if haystack is a string, we pass it to document.querySelectorAll(),
  // and turn the results into an Array:
  else if ('string' == typeof haystack) {
    elems = [].slice.call(document.querySelectorAll(haystack), 0);
  }
  // if haystack has a length property, we convert it to an Array
  // (if it's already an array, this is pointless, but not harmful):
  else if (haystack.length) {
    elems = [].slice.call(haystack, 0);
  }

  // work out whether we're looking at innerText (IE), or textContent 
  // (in most other browsers)
  var textProp = 'textContent' in document ? 'textContent' : 'innerText',
    // creating a regex depending on whether we want a precise match, or not:
    reg = precise === true ? new RegExp('\\b' + needle + '\\b') : new RegExp(needle),
    // iterating over the elems array:
    found = elems.filter(function(el) {
      // returning the elements in which the text is, or includes,
      // the needle to be found:
      return reg.test(el[textProp]);
    });
  return found.length ? found : false;;
}


findByTextContent('link', document.querySelectorAll('li'), false).forEach(function(elem) {
  elem.style.fontSize = '2em';
});

findByTextContent('link3', 'a').forEach(function(elem) {
  elem.style.color = '#f90';
});
<ul>
  <li><a href="#">link1</a>
  </li>
  <li><a href="#">link2</a>
  </li>
  <li><a href="#">link3</a>
  </li>
  <li><a href="#">link4</a>
  </li>
  <li><a href="#">link5</a>
  </li>
</ul>

当然,更简单的方法仍然是:

var textProp = 'textContent' in document ? 'textContent' : 'innerText';

// directly converting the found 'a' elements into an Array,
// then iterating over that array with Array.prototype.forEach():
[].slice.call(document.querySelectorAll('a'), 0).forEach(function(aEl) {
  // if the text of the aEl Node contains the text 'link1':
  if (aEl[textProp].indexOf('link1') > -1) {
    // we update its style:
    aEl.style.fontSize = '2em';
    aEl.style.color = '#f90';
  }
});
<ul>
  <li><a href="#">link1</a>
  </li>
  <li><a href="#">link2</a>
  </li>
  <li><a href="#">link3</a>
  </li>
  <li><a href="#">link4</a>
  </li>
  <li><a href="#">link5</a>
  </li>
</ul>

参考: