Materialise Init 正在禁用其他 Select 下拉菜单

Materialize Init is disabling other Select dropdown menus

我在使用 Materialize 时遇到一个问题,并且正在向我的页面动态添加新的 Select 菜单。当我初始化第一组 Select 时,它们工作正常。如果我添加第二组并初始化同一组,则前一组将停止工作。我已经尝试解决这个问题几个小时了,但我不确定我的错误在哪里。

表单是添加 Select 菜单的地方。 当我添加第一组选择时,它工作正常。如果我添加第二组,第一组停止工作,我不确定为什么。

function addMesocycle() {
    var form = document.querySelector("#mesocycleForm");
    var name = "Mesocycle " + mesocycleIndex;

    var content = 
    `
        <p>${name}</p>
        <label style="color: rgb(46, 46, 46);">Fase:</label>
        <select id="${"fase" + mesocycleIndex}">
            <option value='Option1' selected>Option1</option>
            <option value='Option2'>Option2</option>
            <option value='Option3'>Option3</option>
            <option value='Option4'>Option4</option>
        </select>
        <br>
        <label style="color: rgb(46, 46, 46);">Período:</label>
        <select id="${"period" + mesocycleIndex}">
            <option value='Option1'>Option1</option>
            <option value='Option2'>Option2</option>
            <option value='Option3'>Option3</option>
            <option value='Option4'>Option4</option>
        </select>
        <br>
    `;

    form.innerHTML += content;

    var faseID = "#fase" + mesocycleIndex;
    var periodID = "#period" + mesocycleIndex;

    var ids = [faseID, periodID];

    var elems = document.querySelectorAll(ids);
    M.FormSelect.init(elems);
    
    mesocycleIndex++;
}
<form id="mesocycleForm"></form>

这是代码笔:https://codepen.io/JoaoBM/pen/MWJdLEB

我不确定是什么导致之前的 Select 被禁用。如果你能帮助我,我将不胜感激。提前致谢。

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
</head>

<body>
    <form id="mesocycleForm"></form>
    <button onClick="addMesocycle()">Add</button>
</body>
<script>
    var mesocycleIndex = 1;

    function addMesocycle() {
        var form = document.querySelector("#mesocycleForm");
        var name = "Mesocycle " + mesocycleIndex;
        var content =
            `
        <p>${name}</p>
        <label style="color: rgb(46, 46, 46);">Fase:</label>
        <select id="fase${mesocycleIndex}" class="face">
            <option value='Option1' selected>Option1</option>
            <option value='Option2'>Option2</option>
            <option value='Option3'>Option3</option>
            <option value='Option4'>Option4</option>
        </select>
        <br>
        <label style="color: rgb(46, 46, 46);">Período:</label>
        <select id="period${mesocycleIndex}" class="period">
            <option value='Option1'>Option1</option>
            <option value='Option2'>Option2</option>
            <option value='Option3'>Option3</option>
            <option value='Option4'>Option4</option>
        </select>
        <br>
    `;

        form.innerHTML += content;
        // var faseID = "#fase" + mesocycleIndex;
        // var periodID = "#period" + mesocycleIndex;
        // var ids = [faseID, periodID];
        var ids = ['.face', '.period'];
        var elems = document.querySelectorAll(ids);

        M.FormSelect.init(elems);
        mesocycleIndex++;
    }
</script>

</html>

我为以后好奇的人找到了解决方案。

我在 Materialise 的 Github 问题上发布了这个问题,并被告知

”避免使用innerHTML,因为select元素的内部状态会丢失。不使用innerHTML,可以使用insertAdjacentHTML。例如:

form.insertAdjacentHTML('beforeend', content);

IMO,这不是 materializecss 的错误。"

您可以在此处找到 Github 问题:https://github.com/materializecss/materialize/issues/124

这是最后的代码块,使用了@ΑΓΡΙΑ ΠΕΣΤΡΟΦΑ 的部分答案(这样可以更整洁):

var mesocycleIndex = 1;

function addMesocycle() {
  var form = document.querySelector("#mesocycleForm");
  var name = "Mesocycle " + mesocycleIndex;

  var content =
    `
      <p>${name}</p>
      
      <label style="color: rgb(46, 46, 46);">Fase:</label>
      <select id="fase${mesocycleIndex}" class="fase">
        <option value='Option1'>Option1</option>
        <option value='Option2'>Option2</option>
        <option value='Option3'>Option3</option>
        <option value='Option4'>Option4</option>
      </select>

      <br>

      <label style="color: rgb(46, 46, 46);">Período:</label>
      <select id="period${mesocycleIndex}" class="period">
        <option value='Option1'>Option1</option>
        <option value='Option2'>Option2</option>
        <option value='Option3'>Option3</option>
        <option value='Option4'>Option4</option>
      </select>

      <br>
    `;

  form.insertAdjacentHTML('beforeend', content);

  var ids = ['.fase', '.period'];

  var elems = document.querySelectorAll(ids);

  M.FormSelect.init(elems);

  mesocycleIndex++;
}

你可以在这里看到它的工作:https://codepen.io/JoaoBM/pen/RwpbXRZ

希望这对以后遇到与我相同问题的人有所帮助。