javascript - 将两个以上的子元素附加到一个元素会产生奇怪的行为

标签 javascript html appendchild

我有一个非常奇怪的行为,我不知道是什么原因造成的。

我遍历了 javascript 可以在我的 html 页面中找到的所有 id。每次当“id”以特定标签开头时,它都会进入我的 if 语句。

在这个 if 语句中,我创建了几个元素,例如 P、H1 和 HR。在我的“html”页面中,我有 3 个唯一的 id,它们是 DIV,应该进入 if 语句。这很有效(左图 [ 1]),直到……

我试图将两个以上的子元素附加到那些 DIV 元素。前两个 DIV 元素按预期扩展。最后一个还没有扩展。在有两个以上的元素添加到父元素的那一刻,第 3 个 DIV(standardArticle3)没有通过 if 语句。 (右图[2])

希望代码和场景图片能让这个故事更清晰:

home.component.ts

var allElements = document.getElementsByTagName("*");
console.log(allElements);
for (var i = 0, n = allElements.length; i < n; ++i) {
  var el = allElements[i];
  var foundElementId = el.id;
  console.log(foundElementId);
  if (foundElementId.startsWith("standardArticle"))
  {
    var standardArticleElement = this.jsonReaderService.getStandardArticleContent(foundElementId.substring(15, foundElementId.length));

    var titleElement = document.createElement("h1");
    var titleText = document.createTextNode(standardArticleElement.title);
    titleElement.appendChild(titleText);

    var contentElement = document.createElement("p");
    contentElement.innerHTML = standardArticleElement.content;

    var thematicBreak = document.createElement("hr");
    thematicBreak.style.borderTopColor = "black";

    var thematicBreakTwo = document.createElement("hr");
    thematicBreakTwo.style.borderTopColor = "black";

    // Child elements are all being appended the right way, but the last DIV will never be extended
    el.appendChild(titleElement);
    el.appendChild(thematicBreak);
    el.appendChild(contentElement);
    el.appendChild(thematicBreakTwo);
  }
}

home.component.html

    // other content
    <div id="standardArticle1" class="col-sm-6">
    </div>
    // other content
    <div id="standardArticle2" class="col-sm-6 pull-right">
    </div>
    // other content
    <div id="standardArticle3" class="col-sm-6">
    </div>

enter image description here 场景 1 和 2。

有人知道为什么会这样吗?

最佳答案

document.getElementsByTagName() 返回一个实时 HTMLCollection,您的集合包括页面上的每个元素。这意味着当您附加新元素时,这些元素会包含在集合中,但是由于您迭代到集合的原始长度,您将错过集合的最后一个元素(元素数量与元素数量相同你添加了)。

对于您的问题,似乎更好的解决方案是为您想要查找的所有元素添加一个类,然后使用 document.getElementsByClassName() 获取这些元素:

var allElements = document.getElementsByClassName("standard-article");

... 然后将类名添加到 HTML 中:

// other content
<div id="standardArticle1" class="standard-article col-sm-6">
</div>
// other content
<div id="standardArticle2" class="standard-article col-sm-6 pull-right">
</div>
// other content
<div id="standardArticle3" class="standard-article col-sm-6">
</div>

使用这种方法,您也不需要 id.startsWith("standardArticle") if 语句。

关于javascript - 将两个以上的子元素附加到一个元素会产生奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44436012/

相关文章:

javascript - Cordova/Phonegap 3.3 中的外部链接/InAppBrowser 始终表现为 "_self"

javascript - 同步事件中的 ServiceWorker 无法使用 waitUntil

html - Chrome devtools 的源选项卡中的 Emmet?

html - Wordpress 照片上传错误

javascript - 如何使用 javascript 获取 gridview 控件的 <td> 元素内的元素值?

javascript - 在 AngularJS 中读取 JSON 会按原样打印 HTML 标签

javascript - 如何在 JavaScript 中将选项卡式树转换为 JSON?

javascript - 包含 javascript 属性的对象的appendChild

javascript - 在 JavaScript 中追加元素时出现奇怪的错误

javascript - 为克隆的表单元素添加唯一的名称