【问题标题】:How to dynamically create select options when using materialize css使用materialize css时如何动态创建选择选项
【发布时间】:2020-09-16 15:36:22
【问题描述】:

我正在回答我的问题,因为我能够解决其中的一部分,并且只需要在某些方面提供帮助。

除了<select> 元素之外,我能够动态填充表格的其余内容。

因为我正在使用 Materialize css,所以我在创建它时遇到了麻烦。

document.addEventListener('DOMContentLoaded', function(){


google.script.run.withSuccessHandler(getLeaveRosterData).loadRoster();
 var elems = document.querySelectorAll('select');
 var instances = M.FormSelect.init(elems);

});

let weeksArray = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];

dataArray.forEach(function(ele) 
{
  const tableRow = document.createElement("tr");

  var agentTD = document.createElement("td");
  agentTD.setAttribute("id", "agent"+ ele);
  var t = document.createTextNode(ele);
  agentTD.appendChild(t);

  var w1TD = document.createElement("td");
  w1TD.appendChild(createDropdown("w1-" + ele));

   // create td elements with unique ids
  var w2TD = document.createElement("td");
  w2TD.appendChild(createDropdown("w2-" + ele));

  tableRow.appendChild(agentTD);
  tableRow.appendChild(w1TD);
  tableRow.appendChild(w2TD);
  tbody.appendChild(tableRow);

});
function createDropdown(id) {
  //create a radio button
  var fragment = document.createDocumentFragment();
  var select = document.createElement('select');
  select.setAttribute("id", id);
  weeksArray.forEach(function (day) {
    select.options.add( new Option(day, day));
  });
  fragment.appendChild(select);
  return fragment;
}

我的选择元素是日期名称。[“星期日”、“星期一”、“星期二”、“星期三”、“星期四”、“星期五”、“星期六”]。欢迎提出任何建议。

【问题讨论】:

  • “我在创建它时遇到了麻烦”,具体问题是什么?
  • 它没有出现在表格中。
  • 您是否在动态添加选项后初始化选择?此外,对于如此小的有限、不变的选项列表 - 肯定更容易对它们进行硬编码?其实我想我不明白你的问题。
  • 是的,它已初始化。请检查我已经编辑了我的问题。我不想发布长代码行。

标签: javascript html materialize


【解决方案1】:

关于Materialize CSS neding“初始化”的说明:https://materializecss.com/select.html

初始化

您必须初始化选择元素,如下所示。此外,您需要单独调用页面生成的任何动态生成的选择元素。

  document.addEventListener('DOMContentLoaded', function() {
    var elems = document.querySelectorAll('select');
    var instances = M.FormSelect.init(elems, options);
  });

  // Or with jQuery

  $(document).ready(function(){
    $('select').formSelect();
  });

您可以使用上述代码批量执行所有操作,也可以单独针对每个添加的选择。


您发布的代码缺少一些使其可测试的参考,但我已经添加了这些,但基本上可以按原样执行您正在寻找的内容。您可以在此处运行此浏览器以确认选择列表已呈现。

let weeksArray = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"];

const dataArray = ['example 1', 'example 2'];
const tbody = document.querySelector('tbody');

dataArray.forEach(function(ele) 
{
  const tableRow = document.createElement("tr");

  var agentTD = document.createElement("td");
  agentTD.setAttribute("id", "agent"+ ele);
  var t = document.createTextNode(ele);
  agentTD.appendChild(t);

  var w1TD = document.createElement("td");
  w1TD.appendChild(createDropdown("w1-" + ele));

   // create td elements with unique ids
  var w2TD = document.createElement("td");
  w2TD.appendChild(createDropdown("w2-" + ele));

  tableRow.appendChild(agentTD);
  tableRow.appendChild(w1TD);
  tableRow.appendChild(w2TD);
  tbody.appendChild(tableRow);

});
function createDropdown(id) {
  //create a radio button
  var fragment = document.createDocumentFragment();
  var select = document.createElement('select');
  select.setAttribute("id", id);
  weeksArray.forEach(function (day) {
    select.options.add( new Option(day, day));
  });
  fragment.appendChild(select);
  return fragment;
}
<table>
  <tbody>
  </tbody>
</table>

【讨论】:

  • 当我不使用materialize css时它可以正常工作。但是如果你使用materialize css,它就会停止工作。
  • 参见materializecss.com/select.html,在这种情况下,您需要“初始化”您动态添加的选择。
  • 我已经初始化了这个,你可以在我的问题中看到。 var elems = document.querySelectorAll('select'); var instances = M.FormSelect.init(elems);
  • 这只发生在 dom 加载(初始页面加载)时。每次向页面添加新控件时都需要执行此操作。
  • 哦,真是个观察。你是对的非常感谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
相关资源
最近更新 更多