【问题标题】:Create and and change h1 tag every four paragraphs (h1 content contains first ten elements of paragraphs)每四个段落创建和更改 h1 标签(h1 内容包含段落的前十个元素)
【发布时间】:2016-12-09 09:55:43
【问题描述】:

我需要做的是每3个段落创建h1标签,所以我有12个段落,应该有4个h1标签,每个需要包含每三个段落的10个元素。

例子:

h1(内容将是它下面每个段落的前十个元素) p p p h1 p p p 等等。

到目前为止我做了什么:

HTML:

<div id="pastraipos">
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
  <p>Lorem ipsum dolor sit amet..</p>
</div>

JS

var parent = document.getElementById("pastraipos");
var children = parent.childElementCount;
    console.log(children);
for (var i=0; i<children; i=i+3){
    var h = document.createElement("H1"); 
    var t = document.createTextNode("Hello World");     
    h.appendChild(t);
    parent.insertBefore(h, parent.children[i]);    
}

因此,这段代码创建了 4 个 h1 元素,并将其附加到 &lt;div id="pastraipos"&gt;&lt;/div&gt;

它有什么问题,它只是每 3 个元素附加一个子元素?

我的结果是:

<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<h1>Hello World</h1>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>
<p>Lorem ipsum dolor sit amet..</p>

我想我需要下一个循环来匹配要附加的正确索引,但问题是当我添加到这个循环时,第二个循环 - 它搞砸了,我被困在这里很糟糕,需要你的帮助,谢谢.

【问题讨论】:

  • 无法理解您要做什么。您可以使用您的代码的 html 输出以及您要实现的目标的 html 输出吗?第一段的解释让我很困惑

标签: javascript html for-loop dom appendchild


【解决方案1】:

这里有两个问题。首先是循环过早停止。第二个是您错误地计算了插入新元素的位置。

这两个问题的原因是一样的:你忘记了你正在实时更新 DOM。每次调用 insertBefore 都会改变 DOM 并改变父元素中的元素数量。

首先,停止过早。您将循环长度基于childElementCount 的缓存版本。这是不正确的。您需要基于实时版本,因为元素的数量不断增加。插入第一个 h1 后,您现在有 13 个元素,然后是 14,然后是 15,依此类推。如果您只在条件中使用childElementCount,这可以正常工作:

for (var i = 0; i < parent.childElementCount; i = i + 3) {

现在,下一个问题是同一行代码。看看插入第一个元素后的 DOM 是什么样子的:

h1
p
p
p
p
...

你想在哪里插入下一个h1不是在第三个元素之后,而是在第四个元素之后,即第三个p 元素。你实际上每次都需要i + 4

这是一个工作示例:

for (var i = 0; i < parent.childElementCount; i = i + 4) {

var parent = document.getElementById("pastraipos");

for (var i = 0; i < parent.childElementCount; i = i + 4) {
  var h = document.createElement("H1");
  var t = document.createTextNode("Hello World");
  h.appendChild(t);
  parent.insertBefore(h, parent.children[i]);
}
<div id="pastraipos">
  <p>1</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>
  <p>5</p>
  <p>6</p>
  <p>7</p>
  <p>8</p>
  <p>9</p>
  <p>10</p>
  <p>11</p>
  <p>12</p>
</div>

【讨论】:

  • 很好的解释,现在哪一部分已经清楚了,但是你介意解释一下,如何将每三个段落的前 10 个元素放在 h1 标签下面,并将文本内容添加到 h1 中吗?
  • @TautvydasBūda 我不明白你的意思,但我认为这是一个不同的问题。你应该单独问。
【解决方案2】:

对于您的金额,只需在 for 循环中修复 2 个问题:i+=4i&lt;=children

var parent = document.getElementById("pastraipos");
var children = parent.childElementCount;
console.log(children);
for (var i=0; i<=children; i=i+4){
    var h = document.createElement("H1"); 
    var t = document.createTextNode("Hello World");     
    h.appendChild(t);
    parent.insertBefore(h, parent.children[i]);    
}

jsfiddle

【讨论】:

  • 是的,真的,非常感谢,您介意解释一下,如何获取 h1 标签下每 3 段的前 10 个元素,并将该信息附加到 h1 吗?
【解决方案3】:

在您的 div 中,您可以使用选择器获取所有 P,然后循环遍历它们并在每 3 段后插入一个 h1:

function insertHeadings(id) {
  var paras =  document.querySelectorAll('#' + id + ' p');
  for (var h, i=0, iLen=paras.length; i<iLen; i+=3) {
    h = document.createElement('h1');
    h.appendChild(document.createTextNode('heading ' + i/3));
    paras[i].parentNode.insertBefore(h, paras[i]);
  }
}
body {
  font-size: 50%;
}
p {
  margin: 0;
}
<div id="d0">
  <p>p1<p>p2<p>p3<p>p4<p>p5<p>p6<p>p7<p>p8<p>p9<p>p10<p>p11<p>p12
</div>
<button onclick="insertHeadings('d0')">Insert headings</button>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多