鱼C论坛

 找回密码
 立即注册
查看: 884|回复: 17

[已解决]通过appendchild添加hr为什么只能添加一个?

[复制链接]
发表于 2024-1-19 14:27:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,通过bigdiv.appendChild(hr)来添加,我想要的效果是每个类名为qujian的下面都增加一个hr标签
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="utf-8">
  5.                 <title></title>
  6.                 <style>
  7.                         #bigdiv{
  8.                         }
  9.                         .qujian{
  10.                                 width: 300px;
  11.                                 margin: 50px 40%;
  12.                         }
  13.                         .qujian div{
  14.                                 width: 50px;
  15.                                 background-color: pink;
  16.                                 display: inline-block;
  17.                                 margin-right: 50px;
  18.                                 text-align: center;
  19.                                 line-height: 120%;
  20.                         }
  21.                 </style>
  22.         </head>
  23.         <body>
  24.                 <button onclick="creatbiao()">创建柱形图</button>
  25.                 <div id="bigdiv">
  26.                 <div class="qujian"></div>
  27.                 </div>
  28.                 <script>
  29.                         var xiabiao = 1//id下标
  30.                         const hr = document.createElement("hr")
  31.                         function creatbiao(){
  32.                                 const bigdiv = document.getElementById("bigdiv")
  33.                                 var qujian = document.getElementsByClassName("qujian")
  34.                                 var jidu = prompt("输入季度数") * 1
  35.                                 qujian[qujian.length-1].style.width = `${jidu * 100}px`
  36.                                 let bili = Math.floor(50/jidu)
  37.                                 qujian[qujian.length-1].style.margin = `50px ${bili}%`
  38.                                 for(let i = 1;i<=jidu;i++){
  39.                                         console.log(xiabiao)
  40.                                         let div = document.createElement("div")
  41.                                         let id = document.createAttribute("id")
  42.                                         id.value = `numb${xiabiao}`
  43.                                         qujian[qujian.length-1].appendChild(div)
  44.                                         div.setAttribute('id',id.value)
  45.                                         document.getElementById(`numb${xiabiao}`).style.height = prompt(`输入第${i}季度的数据`) + "px"
  46.                                         document.getElementById(`numb${xiabiao}`).innerHTML = (document.getElementById(`numb${xiabiao}`).style.height).slice(0,-2)
  47.                                         xiabiao++
  48.                                 }
  49.                                 //创建新区间
  50.                                
  51.                                 let divbig = document.createElement("div")
  52.                                 divbig.setAttribute("class","qujian")
  53.                                 bigdiv.appendChild(hr)
  54.                                 bigdiv.appendChild(divbig)
  55.                         }
  56.                 </script>
  57.         </body>
  58. </html>
复制代码
最佳答案
2024-1-19 14:54:41
Sorawithcat 发表于 2024-01-19 14:53
qujian.insertAdjacentElement is not a function。报 ...


非常抱歉,我给出了错误的答案。实际上,`insertAdjacentElement()`是一个HTML元素对象的方法,并不适用于HTMLCollection对象。对于HTMLCollection对象,我们需要遍历每个元素并分别添加`hr`元素。

以下是修改后的代码:

  1. const qujianList = document.getElementsByClassName("qujian");
  2. for (let i = 0; i < qujianList.length; i++) {
  3.     const qujian = qujianList[i];
  4.     const hrExists = qujian.nextElementSibling && qujian.nextElementSibling.tagName === 'HR';
  5.     if (!hrExists) {
  6.         const hr = document.createElement("hr");
  7.         qujian.parentNode.insertBefore(hr, qujian.nextSibling);
  8.     }
  9. }
复制代码


这段代码会为每个类名为`qujian`的元素后面插入一个分割线元素`hr`。请尝试一下这个修改后的代码,并且看看是否解决了问题。对于每个`qujian`元素,我们检查它的下一个兄弟节点是否已经是一个`hr`元素,如果不是,则通过`insertBefore()`方法在该兄弟节点之前插入新的`hr`元素。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-1-19 14:29:11 | 显示全部楼层
问题出在你对`getElementsByClassName`的理解上。`getElementsByClassName`返回的是一个HTMLCollection对象,而不是一个单独的元素。所以当你尝试给它设置样式时,会报错。

解决办法是遍历`qujian`,对每个元素分别添加`hr`。

修改代码如下:

  1. <div id="bigdiv">
  2.     <div class="qujian">
  3.         <div></div>
  4.     </div>
  5.     <div class="qujian">
  6.         <div></div>
  7.     </div>
  8.     <div class="qujian">
  9.         <div></div>
  10.     </div>
  11. </div>

  12. <script>
  13.     const bigdiv = document.getElementById("bigdiv")
  14.     const qujian = document.getElementsByClassName("qujian")

  15.     for(let i = 0; i < qujian.length; i++) {
  16.         const hr = document.createElement("hr")
  17.         qujian[i].appendChild(hr)
  18.     }
  19. </script>
复制代码


这样就能为每个类名为`qujian`的元素下添加一个`hr`标签了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:33:51 | 显示全部楼层
FishC 发表于 2024-1-19 14:29
问题出在你对`getElementsByClassName`的理解上。`getElementsByClassName`返回的是一个HTMLCollection对象 ...

这样子会重复添加,而且分割符的长度我需要是和页面一样长,即不受qujian宽度的影响
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:34:24 | 显示全部楼层
Sorawithcat 发表于 2024-01-19 14:33
这样子会重复添加,而且分割符的长度我需要是和页面一 ...


抱歉,我理解错了你的问题。要实现每个类名为`qujian`的元素下面都添加一个长度与页面一样长的分割线,可以按以下方式修改代码:

  1. const bigdiv = document.getElementById("bigdiv");
  2. const qujian = document.getElementsByClassName("qujian");

  3. for (let i = 0; i < qujian.length; i++) {
  4.   const hr = document.createElement("hr");
  5.   hr.style.width = "100%"; // 设置分割线宽度为页面宽度
  6.   qujian[i].appendChild(hr);
  7. }
复制代码


在这个代码中,我们为每个类名为`qujian`的元素创建一个`hr`标签,并设置其宽度为100%以确保与页面宽度一致。然后使用`appendChild`将该`hr`标签添加到相应的`qujian`元素下。这样就实现了每个元素下都有一个与页面宽度一致的分割线。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:37:00 | 显示全部楼层
FishC 发表于 2024-1-19 14:34
抱歉,我理解错了你的问题。要实现每个类名为`qujian`的元素下面都添加一个长度与页面一样长的分割线, ...

并没有作用,以及分隔符会重复添加,比如说当添加两次时,第一个qujian下会有两个分隔符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:37:46 | 显示全部楼层
Sorawithcat 发表于 2024-01-19 14:37
并没有作用,以及分隔符会重复添加,比如说当添加两次 ...


非常抱歉,之前给出的代码有误。要实现每个类名为`qujian`的元素下面都添加一个长度与页面一样长的分割线,可以按以下方式修改代码:
  1. bigdiv = document.getElementById("bigdiv");const qujian = document.getElementsByClassName("qujian");for (let i = 0; i < qujian.length; i++) {  const hr = document.createElement("hr");  hr.style.width = "100%"; // 设置分割线宽度为页面宽度  qujian[i].appendChild(hr);}
复制代码
在这个代码中,我们使用`qujian[i]`来访问每个类名为`qujian`的元素,然后将`hr`分割线添加到相应的元素下。这样就可以确保每个元素只会添加一个分割线,并且分割线的宽度与页面宽度一致。请尝试一下这个修改后的代码,看看是否达到了你想要的效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:40:54 | 显示全部楼层
FishC 发表于 2024-1-19 14:37
非常抱歉,之前给出的代码有误。要实现每个类名为`qujian`的元素下面都添加一个长度与页面一样长的分割 ...

还是有同样的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:42:34 | 显示全部楼层
FishC 发表于 2024-1-19 14:37
非常抱歉,之前给出的代码有误。要实现每个类名为`qujian`的元素下面都添加一个长度与页面一样长的分割 ...

而且我希望的是hr和qujian同级,hr不是qujian的子节点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:43:17 | 显示全部楼层


非常抱歉之前的回答仍然有误。问题出在了`qujian.appendChild(hr)`这行代码上。由于`getElementsByClassName`返回的是一个HTMLCollection对象,它没有直接的`appendChild`方法。正确的做法是要通过索引访问每个元素,并为每个元素添加分割线。修改代码如下:

  1. const bigdiv = document.getElementById("bigdiv");
  2. const qujian = document.getElementsByClassName("qujian");
  3. for (let i = 0; i < qujian.length; i++) {
  4.     const hr = document.createElement("hr");
  5.     qujian[i].appendChild(hr);
  6. }
复制代码


这样就能为每个类名为`qujian`的元素下添加一个分割线了。请尝试一下这个修改后的代码,看看是否解决了问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:43:57 | 显示全部楼层
FishC 发表于 2024-1-19 14:43
非常抱歉之前的回答仍然有误。问题出在了`qujian.appendChild(hr)`这行代码上。由于`getElementsByClas ...

而且我希望的是hr和qujian同级,hr不是qujian的子节点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:44:16 | 显示全部楼层
Sorawithcat 发表于 2024-01-19 14:42
而且我希望的是hr和qujian同级,hr不是qujian的子节点


非常抱歉之前的回答有误。如果你希望`hr`和`qujian`元素是同级关系,你可以通过在`qujian`元素后面插入`hr`元素来实现。以下是修改后的代码示例:
  1. qujian = document.querySelectorAll('.qujian');for (let i = 0; i < qujian.length; i++) {    const hr = document.createElement('hr');    // 在当前qujian元素后面插入hr元素    qujian[i].parentNode.insertBefore(hr, qujian[i].nextSibling);}
复制代码
在这个代码中,我们使用`querySelectorAll`获取所有类名为`qujian`的元素,然后使用`insertBefore`方法将`hr`元素插入到每个`qujian`元素的后面。这样就可以保证`hr`和`qujian`是同级关系,而不是`qujian`的子节点。请尝试一下这个修改后的代码,看看是否达到了你想要的效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:44:47 | 显示全部楼层
Sorawithcat 发表于 2024-01-19 14:43
而且我希望的是hr和qujian同级,hr不是qujian的子节点


非常抱歉之前的回答仍然有误。确保hr和qujian同级的方法是将hr添加到qujian元素的父节点中,而不是直接作为qujian的子节点。我们可以通过遍历每个qujian元素,获取它们的父节点,然后将hr作为兄弟节点插入到父节点中。修改代码如下:

  1. const qujianList = document.getElementsByClassName("qujian");
  2. for (let i = 0; i < qujianList.length; i++) {
  3.     const qujian = qujianList[i];
  4.     const hr = document.createElement("hr");
  5.     qujian.parentNode.insertBefore(hr, qujian.nextSibling);
  6. }
复制代码


这样就能为每个类名为`qujian`的元素之后插入一个分割线元素hr了。请尝试一下这个修改后的代码,看看是否解决了问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:48:04 | 显示全部楼层
FishC 发表于 2024-1-19 14:44
非常抱歉之前的回答仍然有误。确保hr和qujian同级的方法是将hr添加到qujian元素的父节点中,而不是直接 ...

加是加了,但是会有重复添加的问题,比如添加两次会导致第一个qujian下面有两个hr
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:48:48 | 显示全部楼层
Sorawithcat 发表于 2024-01-19 14:48
加是加了,但是会有重复添加的问题,比如添加两次会导 ...


非常抱歉之前的回答仍然有误。你需要在插入`hr`元素之前先判断是否已经存在,以避免重复添加。修改代码如下:const qujianList = document.getElementsByClassName("qujian");for (let i = 0; i < qujianList.length; i++) {    const qujian = qujianList[i];    const hrExists = qujian.nextElementSibling && qujian.nextElementSibling.tagName === 'HR';    if (!hrExists) {        const hr = document.createElement("hr");        qujian.parentNode.insertBefore(hr, qujian.nextSibling);    }}这样就能确保每个类名为`qujian`的元素之后只会添加一个分割线元素hr了。请尝试一下这个修改后的代码,看看是否解决了重复添加的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:51:37 | 显示全部楼层
FishC 发表于 2024-1-19 14:48
非常抱歉之前的回答仍然有误。你需要在插入`hr`元素之前先判断是否已经存在,以避免重复添加。修改代码 ...

这次甚至没有分割线了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:52:07 | 显示全部楼层
Sorawithcat 发表于 2024-01-19 14:51
这次甚至没有分割线了


非常抱歉再次给出错误的答案。在我的回答中,代码逻辑有误,并且没有考虑到正确的插入位置。正确的做法是使用`insertAdjacentElement()`方法,通过在当前元素之后插入一个新的`hr`元素。以下是修改后的代码:const qujianList = document.getElementsByClassName("qujian");for (let i = 0; i < qujianList.length; i++) {    const qujian = qujianList[i];    const hrExists = qujian.nextElementSibling && qujian.nextElementSibling.tagName === 'HR';    if (!hrExists) {        const hr = document.createElement("hr");        qujian.insertAdjacentElement('afterend', hr);    }}这样就能为每个类名为`qujian`的元素之后添加一个分割线元素`hr`,并且避免了重复添加的问题。请尝试一下这个修改后的代码,看看是否解决了问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-1-19 14:53:55 | 显示全部楼层
FishC 发表于 2024-1-19 14:52
非常抱歉再次给出错误的答案。在我的回答中,代码逻辑有误,并且没有考虑到正确的插入位置。正确的做法 ...

qujian.insertAdjacentElement is not a function。报错文本
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-19 14:54:41 | 显示全部楼层    本楼为最佳答案   
Sorawithcat 发表于 2024-01-19 14:53
qujian.insertAdjacentElement is not a function。报 ...


非常抱歉,我给出了错误的答案。实际上,`insertAdjacentElement()`是一个HTML元素对象的方法,并不适用于HTMLCollection对象。对于HTMLCollection对象,我们需要遍历每个元素并分别添加`hr`元素。

以下是修改后的代码:

  1. const qujianList = document.getElementsByClassName("qujian");
  2. for (let i = 0; i < qujianList.length; i++) {
  3.     const qujian = qujianList[i];
  4.     const hrExists = qujian.nextElementSibling && qujian.nextElementSibling.tagName === 'HR';
  5.     if (!hrExists) {
  6.         const hr = document.createElement("hr");
  7.         qujian.parentNode.insertBefore(hr, qujian.nextSibling);
  8.     }
  9. }
复制代码


这段代码会为每个类名为`qujian`的元素后面插入一个分割线元素`hr`。请尝试一下这个修改后的代码,并且看看是否解决了问题。对于每个`qujian`元素,我们检查它的下一个兄弟节点是否已经是一个`hr`元素,如果不是,则通过`insertBefore()`方法在该兄弟节点之前插入新的`hr`元素。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-4 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表