如何从 javascript 添加 html 元素 [关闭]

How do i add html element from javascript [closed]

提问人:Karan Singh 提问时间:11/13/2023 最后编辑:phuziKaran Singh 更新时间:11/13/2023 访问量:58

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

7天前关闭。

我试图通过向复选框添加 eventlistener 函数来选中复选框时创建芯片,但它没有发生。我认为该元素没有插入到 html 中。 这是代码

let ChoosenFiltercontainer = document.getElementById('ChoosenFiltercontainer')
let FilterDropdownsElems = document.querySelector('.FilterDropdowns');
let FilterDropdownsElem = FilterDropdownsElems.querySelectorAll('[type=checkbox]');
let customid = "";
for (let i = 0; i < FilterDropdownsElem.length; i++) {
  customid = customid + FilterDropdownsElem[i].id + i;
  FilterDropdownsElem[i].addEventListener('click', function(customid) {
    ChoosenFiltercontainer.innerHTML += `<div class="col-md-auto " id=${customid}  style="display:none;" >
          <div class="chip chip-outline btn-outline-dark rounded-pill" data-mdb-ripple-color="dark">
            ${FilterDropdownsElem[i].id} <i class="close fas fa-times" style="font-size: small;"></i>
          </div>
        </div>`;
    if (FilterDropdownsElem[i].checked == true) {
      document.getElementById('customid').style.display = "block";
    } else {
      document.getElementById('customid').style.display = "none";
    }
  }.bind(this, customid))
}    

我认为我没有正确使用innerHTML属性

javascript html 引导-4 innerhtml

评论

0赞 trincot 11/13/2023
请修复代码的缩进。
0赞 Rory McCrossan 11/13/2023
另外,请在问题中添加相关的 HTML 和 CSS,以便我们可以创建一个工作示例,使调试更加清晰
0赞 mplungjan 11/13/2023
这里需要什么?}.bind(this,customid)
3赞 trincot 11/13/2023
“它没有发生”:究竟什么没有发生?没有进入循环吗?是否未附加事件处理程序?事件处理程序是否未执行?HTML 没有改变吗?你调试了什么?请提供重现问题所需的代码(需要相关的 HTML)for

答:

0赞 Roshaan Ahmed 11/13/2023 #1

我不确定您的其余代码,因为您尚未提供 html 和 CSS 文件。 无论如何,如果其他一切正常,阅读您的代码并使用 customId 作为字符串而不是变量可能是问题所在。

document.getElementById('customid').style.display = "block";

尝试将其更改为

document.getElementById(customid).style.display = "block";

对 display = “none” 情况执行相同的操作

1赞 asking for a friend 11/13/2023 #2

您尝试根据复选框状态设置显示属性的方式似乎存在问题。此外,您尝试设置动态创建的 div 的 ID 的方式也存在问题。 试试这个:

用于获取事件处理程序中单击的复选框元素。event.target

删除不必要的复选框状态检查,因为它是多余的。(if (FilterDropdownsElem[i].checked == true))

用于在取消选中相应的复选框时删除动态创建的 div。div.remove()

let ChoosenFiltercontainer = document.getElementById('ChoosenFiltercontainer');
let FilterDropdownsElems = document.querySelector('.FilterDropdowns');
let FilterDropdownsElem = FilterDropdownsElems.querySelectorAll('[type=checkbox]');
let customid = "";

for (let i = 0; i < FilterDropdownsElem.length; i++) {
    customid = FilterDropdownsElem[i].id + i; // Use a simpler customid
    
    FilterDropdownsElem[i].addEventListener('click', function (event) {
        let checkbox = event.target;
        let divId = checkbox.id + i;
        let div = document.getElementById(divId);

        if (checkbox.checked) {
            // If the checkbox is checked, create the div if it doesn't exist
            if (!div) {
                ChoosenFiltercontainer.innerHTML += `<div class="col-md-auto" id="${divId}">
                    <div class="chip chip-outline btn-outline-dark rounded-pill" data-mdb-ripple-color="dark">
                        ${checkbox.id} <i class="close fas fa-times" style="font-size: small;"></i>
                    </div>
                </div>`;
            }
        } else {
            // If the checkbox is unchecked, remove the corresponding div
            if (div) {
                div.remove();
            }
        }
    });
}

1赞 mplungjan 11/13/2023 #3

我总是建议委托,所以我将重构而不是调试您的代码,其中包含一些奇怪的语句,例如您的 .bind

下面是从 filterDropdown 容器和 ChoosenFiltercontainer 委托的版本

我将复选框 ID 作为数据属性添加到关闭处,因此我们可以在关闭过滤器时取消选中它

const ChoosenFiltercontainer = document.getElementById('ChoosenFiltercontainer');
document.querySelector('.FilterDropdowns').addEventListener('click', (e) => {
  const tgt = e.target;

  if (!tgt.matches("input[type=checkbox]")) return;
  let elementId = `${tgt.id}_container`; // Create a unique ID for the container
  let filterElement = document.getElementById(elementId);
  if (!filterElement) {
    console.log('creating div');
    ChoosenFiltercontainer.innerHTML += `<div class="col-md-auto filter" id="${elementId}" style="display: none;"><div class="chip chip-outline btn-outline-dark rounded-pill" data-mdb-ripple-color="dark">${tgt.id} <i data-id="${tgt.id}" class="close fas fa-times" style="font-size: small;"></i></div></div>`;
    filterElement = ChoosenFiltercontainer.lastChild;
  }
  filterElement.style.display = tgt.checked ? 'block' : 'none';
});
ChoosenFiltercontainer.addEventListener('click', (e) => {
  const tgt = e.target;
  if (tgt.matches('i.close')) {
    const filterId = tgt.dataset.id;
    document.getElementById(filterId).checked = false;
    tgt.closest('div.filter').style.display = 'none';
  }  
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" integrity="sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==" crossorigin="anonymous" referrerpolicy="no-referrer"
/>

<div id="ChoosenFiltercontainer">
  <!-- Selected filters will be displayed here -->
</div>

<div class="FilterDropdowns">
  <!-- Example checkboxes -->
  <label><input type="checkbox" id="filter1">Filter 1</label>
  <label><input type="checkbox" id="filter2">Filter 2</label>

</div>