将两个以上的子元素附加到一个元素会产生奇怪的行为
Appending more than two child elements to an element gives a strange behaviour
我有一个非常奇怪的行为,我不知道是什么原因造成的。
我遍历了 javascript 可以在我的 html 页面中找到的所有 ID。每次 'id' startsWith 特定标签时,它都会进入我的 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>
场景 1 和 2。
有人知道为什么会这样吗?
document.getElementsByTagName()
returns 实时 HTML 集合,您的集合包括页面上的每个元素。这意味着当您附加新元素时,这些元素会包含在集合中,但是由于您迭代到集合的原始长度,您将错过集合的最后一个元素(元素数量与元素数量相同你添加了)。
似乎对您的问题更好的解决方案是将 class 添加到您要查找的所有元素,然后只获取带有 document.getElementsByClassName()
:
的元素
var allElements = document.getElementsByClassName("standard-article");
... 然后将您的 class 名称添加到您的 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
语句。
我想我知道你的问题是什么。让我们看看当您遍历页面上的所有元素时会发生什么:for (var i = 0, n = allElements.length; i < n; ++i)
如果页面上有 10 个元素,则 n
设置为 10。但是当您到达 if
语句并添加元素时,n
仍然等于10 但您现在在页面上有其他元素。看起来 Mikael Lennholm 说得更简洁并提供了一个很好的解决方案。
我有一个非常奇怪的行为,我不知道是什么原因造成的。
我遍历了 javascript 可以在我的 html 页面中找到的所有 ID。每次 'id' startsWith 特定标签时,它都会进入我的 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>
有人知道为什么会这样吗?
document.getElementsByTagName()
returns 实时 HTML 集合,您的集合包括页面上的每个元素。这意味着当您附加新元素时,这些元素会包含在集合中,但是由于您迭代到集合的原始长度,您将错过集合的最后一个元素(元素数量与元素数量相同你添加了)。
似乎对您的问题更好的解决方案是将 class 添加到您要查找的所有元素,然后只获取带有 document.getElementsByClassName()
:
var allElements = document.getElementsByClassName("standard-article");
... 然后将您的 class 名称添加到您的 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
语句。
我想我知道你的问题是什么。让我们看看当您遍历页面上的所有元素时会发生什么:for (var i = 0, n = allElements.length; i < n; ++i)
如果页面上有 10 个元素,则 n
设置为 10。但是当您到达 if
语句并添加元素时,n
仍然等于10 但您现在在页面上有其他元素。看起来 Mikael Lennholm 说得更简洁并提供了一个很好的解决方案。