javascript - jsdom如何在foreach中的另一个元素中获取一个元素
问题描述
我是 JSDOM 解析器的新手。
我有以下内容:
<div id='mydiv'>
<ul>
<li><a title='a'>TextA</a></li>
<li><a title='b'>TextB</a></li>
<li><a title='c'>TextC</a></li>
<li><a title='d'>TextD</a></li>
</ul>
</div>
我正在使用以下代码,但无法获取文本“TextA”、“TextB”、“TextC”、“TextD”
const categoryDiv = dom.window.document.querySelectorAll('#mydiv > ul > li')
.forEach(item => {
console.log('item', item.getElement('a')); //not sure how to continue from here
});
})
解决方案
const categoryDiv = dom.window.document.querySelectorAll('#mydiv > ul > li')
在这第一步之后,您将拥有一个包含 4 个列表元素的 NodeList。和
安慰。目录(categoryDiv[0])
您可以将第一个列表对象记录到控制台并查看并期望其所有属性。有多种方法可以访问封闭的锚标记。例如
- . 孩子=> HTML 集合
- . childNodes =>节点列表
- . getElementsByTagName('a') => HTML 集合
- . querySelector('a') => href 元素
只有最后一个选项直接为您提供链接元素,前三个您必须选择选择中的第一个元素才能访问链接
然后访问链接的文本有两个选项
- .innerHTML
- .textContent
在这种情况下,选择哪个并不重要,因为如果在链接上调用,两者都会在链接标签内为您提供文本。如果在列表元素上调用它看起来像这样
listElem.outerHTML // <li><a title="a">TextA</a></li>
listElem.innerHTML // <a title="a">TextA</a>
listElem.textContent // TextA
所以你实际上不必访问链接元素。只需在列表项上直接调用 .textContent
最后你想使用 .map 而不是 .forEach 因为 .forEach 只迭代,但不返回任何东西。NodeList 不能直接使用 .map 进行迭代,但可以使用扩展运算符轻松转换
所以所有在一起,例如像这样
const categoryDiv = [...document.querySelectorAll('#mydiv > ul > li')]
.map(listItem => listItem.textContent)
console.log(categoryDiv) // ['TextA', 'TextB', 'TextC', 'TextD']
或这个
const categoryDiv = Array.from(document.querySelectorAll('#mydiv > ul > li'), listItem => listItem.textContent)
或者甚至没有迭代的非常快速的方法是
document.querySelector('#mydiv ul')
.textContent // 'TextA TextB TextC TextD'
.split(' ') // ['TextA', 'TextB', 'TextC', 'TextD']
推荐阅读
- authorization - Cognito - 没有密钥的授权码授予
- python - Git推送Heroku被拒绝
- javascript - 无法在未定义、null 或原始值引导 Vue 模式上设置反应属性
- python - 在 Python 中使用 2 个具有继承的类返回“无”
- java - Github actions- Java with maven: mvn verify multiple poms
- apache-spark - 从 spark 提交中删除 Hive 库的上传
- r - R:在 Texreg 中容纳不同长度的模型
- php - 无法在 Laravel eloquent 中更新集合
- wordpress - 如何在 WooCommerce 编辑订单中计算自定义订单总额?
- java - 如何在 Android 中显示来自 Firebase 的特定子值?