javascript - 获取 <div> 内第三个 <p> 元素的文本内容。具有多个同名的 div 容器

标签 javascript html widget

我有以下代码。

    var bTags = document.getElementsByClassName("Wrapper");
    var kind = bTags[0];
    console.log(kind);
    console.log(kind.childNodes[4].text);
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}}</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>

在我的示例中,“console.log(kind);”成功记录 HTML 对象。当然,它在这里不起作用,因为它没有定义。但不知何故,childNodes[4].text 未定义。我只想使用该特定父节点的“placeDescription”类访问 p 元素的文本。像下面这样的静态尝试是不可能的,因为我有几个 HTML“.Wrapper”对象,它们只是内容不同。 我想我可以通过将 p 元素写入 div 然后使用 ChildNodes 来访问它们,但这在我看来不是很干净。为什么 kind.childNodes[4].text 未定义,而 kind 不是?

const el = document.querySelector('.Wrapper p:nth-of-type(3)'); 如果(el){ console.log(el.textContent) }

感谢您阅读本文。

最佳答案

如果您将 text 更改为 textContent (或旧版 IE 上的 innerText,但它不完全相同),您的代码就可以工作,并且43但是,它很脆弱。您可以使用 querySelector 更加精确:

var div = document.querySelector(".Wrapper div");
console.log(div.textContent);

实例:

var div = document.querySelector(".Wrapper div");
console.log(div.textContent);
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}}</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>

实时显示您的版本,仅查看第一个此类匹配。如果您想要所有这些,您将需要一个循环:

var wrappers = document.querySelectorAll(".Wrapper"); // Or .getElementsByClassName("Wrapper");
for (var i = 0; i < wrappers.length; ++i) {
    var div = wrappers[i].querySelector("div");
    console.log(div.textContent);
}

实例:

var wrappers = document.querySelectorAll(".Wrapper"); // Or .getElementsByClassName("Wrapper");
for (var i = 0; i < wrappers.length; ++i) {
    var div = wrappers[i].querySelector("div");
    console.log(div.textContent);
}
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} first</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} second</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} third</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>

在现代浏览器中(或使用 polyfill 方法 I describe in this other answer ),您可以使用 forEach 而不是 for 循环(甚至是 for-of 在 ES2015+ 中),这使得它更加简洁:

document.querySelectorAll(".Wrapper").forEach(function(wrapper) {
    var div = wrapper.querySelector("div");
    console.log(div.textContent);
});

实例:

document.querySelectorAll(".Wrapper").forEach(function(wrapper) {
    var div = wrapper.querySelector("div");
    console.log(div.textContent);
});
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} first</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} second</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} third</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>

或者使用 ES2015+(同样,您可能需要做一些 polyfilling per above ):

for (const wrapper of document.querySelectorAll(".Wrapper")) {
    const div = wrapper.querySelector("div");
    console.log(div.textContent);
}

实例:

for (const wrapper of document.querySelectorAll(".Wrapper")) {
    const div = wrapper.querySelector("div");
    console.log(div.textContent);
}
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} first</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} second</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>
<div class="Wrapper">
        <h3 class="date" id="date">{{date}}</h3>
    <div class="descriptionWrapper">
        <p class="jobDescription">{{job}} third</p>
        <p class="jobAreaDescription">{{jobArea}}</p>
        <p class="placeDescription">{{ort}}</p>
        <p class="kindDescription">{{anstellung}}</p>
    </div>
    <div class="jobLink">
        {{#custom_link jobLink}}
            {{linkText}}
        {{/custom_link}}
    </div>
</div>

关于javascript - 获取 <div> 内第三个 <p> 元素的文本内容。具有多个同名的 div 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60335875/

相关文章:

html - 将鼠标悬停在链接上时在屏幕中央显示图像

c++ - QT 小部件指针

javascript - 没有秒的Angularjs时钟

javascript - 如何使用 vuex 刷新页面后仍保持登录状态?

javascript - d3.js 对象未完全显示在卡片内

javascript - 为什么我的按钮没有动画?

javascript - 如何删除以 javascript 为目标的 css 元素

php - 文本未正确放置在中心

javascript - jQuery 克隆表单在同一页面中无法工作两次

javascript - Web 组件与小部件 : Is there a difference?