【问题标题】:Extracting Partial Text (before the <br>) using getElementsByClassName使用 getElementsByClassName 提取部分文本(在 <br> 之前)
【发布时间】:2021-03-14 23:55:11
【问题描述】:

我无法从 Class 属性中获取特定的文本。文本既有名称又有 ID。两者对我都很重要,但我需要将它们拆分并放置在单独的数组中。

<span class="locDescription"><b>Name1</b><br> ID1</span>
<span class="locDescription"><b>Name2</b><br>ID2</span>
<span class="locDescription"><b>Name3</b><br> ID3</span>

我的第一个想法是弹出每个元素中的最后一项(转换为字符串或列表,用“”分隔并弹出最后一项)。但是,我意识到名称和 ID 之间并不总是有空格,所以这不起作用。

我的第二个想法是使用 OuterHTML 并获取 &lt;br&gt; 之前的所有内容,然后对 &lt;br&gt; 之后的 ID 执行相同操作。

然而,这是使用 outerHTML 返回的文本的样子:

"&lt;span class=\&quot;locDescription\&quot;&gt;&lt;b&gt;Name1&lt;/b&gt;&lt;br&gt;ID1&lt;/span&gt;"

我找不到在&lt;br&gt; 之前简单地抓取的方法...这似乎很容易做到...也许我错过了它。

代替它,我尝试使用索引来抓取文本:

var product_name = []
var elements = document.getElementsByClassName('locDescription');
for(var i=0; i<elements.length; i++) product_name.push(elements[i].outerHTML)

test1 = product_name[0].indexOf('&gt;&lt;b&gt;')

console.log(test1)

返回为 -1,因此它没有解释该文本中的乱码。知道我该如何做到这一点吗?我想我现在要掉进兔子洞了。

【问题讨论】:

  • const bs = document.querySelectorAll('.locDescription&gt;b'); for(let b of bs){ console.log(b.textContent); }
  • 好像你忘记了.indexOf():'&amp;gt;&amp;lt;b&amp;gt;'中“br”的“R”

标签: javascript html getelementsbyclassname outerhtml


【解决方案1】:

querySelector 和 childNodes

const spans = [...document.querySelectorAll(".locDescription")];
const details = spans.map(span => {
  const name = span.querySelector("b").textContent;
  const id = span.childNodes[2].nodeValue;
  return { name, id };
});
console.log(details);
<span class="locDescription"><b>Name1</b><br> ID1</span>
<span class="locDescription"><b>Name2</b><br>ID2</span>
<span class="locDescription"><b>Name3</b><br> ID3</span>

const spans = Array.from(document.querySelectorAll(".locDescription"));
const details = spans.map(function(span){
  const name = span.querySelector("b").textContent;
  const id = span.childNodes[2].nodeValue;
  return { name: name, id: id };
});
console.log(details);
<span class="locDescription"><b>Name1</b><br> ID1</span>
<span class="locDescription"><b>Name2</b><br>ID2</span>
<span class="locDescription"><b>Name3</b><br> ID3</span>

【讨论】:

  • 这很完美!不幸的是,GTM 不允许使用传播或箭头函数?是否有可能用不同的方法实现相同的目标?
【解决方案2】:

您可以使用Node 的属性.previousSibling.nextSibling,这些属性包括其他节点,即TextNodes

注意你可能想要trim().textContent你想要的那些其他节点,因为.textContent返回文本是如何写在你的HTML之后 em> 转义 HTML 名称代码,这意味着包括空格和换行符,如果有的话。

这是一个简单的例子:

  1. 查询&lt;br&gt;
  2. 使用.previousSibling/.nextSibling
  3. 获取他们的.textContent
  4. (可选)trim()返回的文本

var brElement = document.querySelector('br');

console.log(brElement.previousSibling.textContent.trim());
console.log(brElement.nextSibling.textContent.trim());
<p><b>First text</b><br>
Second text</p>

【讨论】:

    【解决方案3】:

    您可以使用正则表达式找到两个边:

    var element = document.getElementsByClassName("locDescription")[0];
    var array = [];
    array[0] = element.innerHTML.match(/.*(?=<br>)/)[0];
    array[1] = element.innerHTML.match(/(?<=<br>).*/)[0];
    console.log(array)
    &lt;span class="locDescription"&gt;&lt;b&gt;Name1&lt;/b&gt;&lt;br&gt; ID1&lt;/span&gt;

    如果你想排除&lt;b&gt;标签:

    var element = document.getElementsByClassName("locDescription")[0];
    var array = [];
    array[0] = element.innerHTML.match(/(?<=<b>).*(?=<\/b>)/)[0]
    array[1] = element.innerHTML.match(/(?<=<br>).*/)[0];
    console.log(array)
    &lt;span class="locDescription"&gt;&lt;b&gt;Name1&lt;/b&gt;&lt;br&gt; ID1&lt;/span&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2016-03-28
      • 2021-10-21
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多