[英]Error dynamically adding Materialize select input in Google Apps Script web app
I try to dynamically add extra Materialize "select"s to a custom form created with a Google Apps Script web app.我尝试将额外的 Materialize“选择”动态添加到使用 Google Apps 脚本 web 应用程序创建的自定义表单中。 Although the initial one displays OK, on adding extra (via the "Add Row" button) the new select has two sets of options.虽然最初的显示 OK,但在添加额外的(通过“添加行”按钮)时,新的 select 有两组选项。
Can anyone see what I am doing wrong?谁能看到我做错了什么?
Code.gs代码.gs
function doGet(e){
return HtmlService.createTemplateFromFile("Page").evaluate();
}
function include(filename){
return HtmlService.createHtmlOutputFromFile(filename).getContent();
}
Page.html页.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body onload="onLoad()">
<div class="container">
<div class="row">
<button class="btn waves-effect waves-light" id ="add-row-btn" name="action">Add Row</button>
</div>
<form id="invoice-form" name="invoice-form"></form>
</div>
<!-- template -->
<div style="display: none" data-type="template" id="row-template">
<div class="row">
<div class="input-field col s2">
<select id="HoursType" name="HoursType">
<option value="Hours Type" disabled selected name="Hours Type">Hours Type</option>
<option value="Indirect" name="Indirect">Indirect</option>
<option value="Direct" name="Direct">Direct</option>
</select>
</div>
</div> <!-- row -->
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<?!= include("Page-js"); ?>
</body>
</html>
Page.js.html Page.js.html
<script>
var selectorCount = 0
function onLoad() {
addRow()
document.getElementById("add-row-btn").addEventListener("click", addRow);
}
function addRow() {
var documentFragment = document.createDocumentFragment();
var temporaryNode = document.getElementById('row-template').cloneNode(true); //true for deep clone
documentFragment.appendChild(temporaryNode)
document.getElementById('invoice-form').appendChild(documentFragment)
var elements = document.querySelectorAll('select');
var element = elements[selectorCount++]
selector = M.FormSelect.init(element);
temporaryNode.style.display = "block"
delete documentFragment
}
</script>
About the issue of Although the initial one displays OK, on adding extra (via the "Add Row" button) the new select has two sets of options.
关于问题Although the initial one displays OK, on adding extra (via the "Add Row" button) the new select has two sets of options.
. . I think that the reason might be that the same id
is used in invoice-form
appended by appendChild(documentFragment)
.我认为原因可能是在appendChild(documentFragment)
附加的invoice-form
中使用了相同的id
。 So how about the following modification?那么下面的修改呢?
function addRow() {
var documentFragment = document.createDocumentFragment();
var temporaryNode = document.getElementById('row-template').cloneNode(true); //true for deep clone
documentFragment.appendChild(temporaryNode)
function addRow() {
var documentFragment = document.createDocumentFragment();
var temporaryNode = document.getElementById('row-template').cloneNode(true); //true for deep clone
temporaryNode.id = temporaryNode.id + selectorCount; // Added
documentFragment.appendChild(temporaryNode)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.