我正在克隆一组Materialize form元素,包括几个select、一个时间选择器和一个带有按钮单击事件的文本区域。当前代码使用计数器来递增的id和标签。正如预期的那样,这适用于基本输入,如文本区域,但对于像选择或选取器这样的项,Materialize动态地在多个元素上使用散列ID注入自己的JS,而不是骰子。如何正确克隆选择器和选取器才能正常工作?
我已经尝试在Chrome的开发控制台中手动更改克隆的in (查看匹配的散列),看看是否至少可以触发selects或picker,但仍然无法工作,没有错误。只有初始块起作用。我在想,如果我至少可以让元素触发,我就可以编写一些代码来针对选择器或单独选择。我不确定我是不是想多了。
我有一种笨拙的方法,那就是在html中创建块的最大数量,而不是克隆,隐藏除第一个之外的所有块,然后手动更新ID,然后显示每次点击按钮的次数。它们都是这样工作的,但它当然不是干的,我必须与状态打交道。
下面是我的克隆尝试代码:
HTML:
<div class="container">
<div id="mealRequests" class="row">
<!-- Meal Request #1 -->
<div class="input-field col s12 meal-request-block">
<div class="row ">
<div class="input-field col s12 m6">
<select id="mealType01">
<option value="" disabled selected>Choose your option</option>
<option value="Breakfast">Breakfast</option>
<option value="Lunch">Lunch</option>
<option value="Snack">Snack</option>
<option value="Cocktail">Cocktail</option>
</select>
<label for="mealType01">Meal type</label>
</div>
<div class="input-field col s12 m6">
<input id="consumptionTime01" type="text" class="timepicker" autocomplete="off" placeholder="09:00 AM">
<label for="consumptionTime01">Consumption time</label>
</div>
</div>
<div class="row">
<div class="input-field col s12">
<select id="vendorChoice01">
<option value="" disabled selected>Choose your option</option>
<option value="Dig Inn">Dig Inn</option>
<option value="Pret">Pret</option>
<option value="Au Bon Pain">Au Bon Pain</option>
</select>
<label for="vendorChoice01">Vendor</label>
</div>
</div>
<div class="row">
<div class="input-field col s12">
<textarea id="menuRequest01" class="materialize-textarea" placeholder="Farmers plate"></textarea>
<label for="menuRequest01">Menu selections</label>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col s12">
<button id="addMealRequestBtn" class="btn-text"><i class="material-icons">+</i> Add another meal request</button>
</div>
</div>
</div>JS:
// Initialize Materialize's select and datepicker
$('select').formSelect();
$('.timepicker').timepicker();
// Add click handler for meal requests
var addMealRequest = function () {
var $row = $('.meal-request-block').parent(),
$template = $('.meal-request-block:first').clone(),
counter = 1, // used for incrementing input IDs
limit = 2; // sets a max limit on the total number of clones
$('#addMealRequestBtn').on('click', function(e) {
e.preventDefault();
var $totalCount = $('.meal-request-block').length;
counter++;
if ($totalCount < limit) {
$template.clone().find('.timepicker-modal, select, input, textarea').each(function () {
//set id to store the updated section number
var newId = this.id + counter;
//update for label
$(this).next().attr('for', newId).addClass('active');
//update id
this.id = newId;
}).end()
.appendTo($row);
}
});
};
addMealRequest();CSS:
.input-field div.error {
position: relative;
top: -.25rem;
left: 0rem;
font-size: 0.8rem;
color: red;
transform: translateY(0%);
}
.meal-request-block {
background-color: #f0f0f0;
padding: 24px!important;
}
.btn-text {
background: none;
border: none;
cursor: pointer;
font-weight: 600;
opacity: 1;
padding: 0;
transition: all .25s ease;
&:focus {
background: transparent;
}
&:hover {
opacity: .75;
}
}和一支基本的笔:https://codepen.io/anon/pen/GLzEvw
以下是Materialize注入它的JS后的代码示例:
选择:
<div class="input-field col s12 m6">
<div class="select-wrapper">
<input class="select-dropdown dropdown-trigger" type="text" readonly="true" data-target="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a074">
<ul id="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a074" class="dropdown-content select-dropdown" tabindex="0">
<li class="disabled selected" id="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a0740" tabindex="0"><span>Choose your option</span></li>
<li id="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a0741" tabindex="0"><span>Breakfast</span></li>
<li id="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a0742" tabindex="0"><span>Lunch</span></li>
<li id="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a0743" tabindex="0"><span>Snack</span></li>
<li id="select-options-db214a65-6ab6-0918-fd05-e3c7cc84a0744" tabindex="0"><span>Cocktail</span></li>
</ul>
<svg class="caret" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M7 10l5 5 5-5z"></path>
<path d="M0 0h24v24H0z" fill="none"></path>
</svg>
<select id="mealType01" tabindex="-1">
<option value="" disabled="" selected="">Choose your option</option>
<option value="Breakfast">Breakfast</option>
<option value="Lunch">Lunch</option>
<option value="Snack">Snack</option>
<option value="Cocktail">Cocktail</option>
</select>
</div>
<label for="mealType01">Meal type</label>
</div>时间选择器:
<div class="input-field col s12 m6">
<div class="modal timepicker-modal" id="modal-1bc17566-dd57-4454-0735-057dc30e2263" tabindex="0" style="z-index: 1003; display: none; opacity: 0; top: 4%; transform: scaleX(0.8) scaleY(0.8);">
<div class="modal-content timepicker-container">
<div class="timepicker-digital-display">
<div class="timepicker-text-container">
<div class="timepicker-display-column"><span class="timepicker-span-hours">12</span>:<span class="timepicker-span-minutes text-primary">30</span></div>
<div class="timepicker-display-column timepicker-display-am-pm">
<div class="timepicker-span-am-pm">
<div class="am-btn">AM</div>
<div class="pm-btn text-primary">PM</div>
</div>
</div>
</div>
</div>
<div class="timepicker-analog-display">
<div class="timepicker-plate">
<div class="timepicker-canvas">
<svg class="timepicker-svg" width="270" height="270">
<g transform="translate(135,135)">
<line x1="0" y1="0" x2="1.0409497792752502e-14" y2="85"></line>
<circle class="timepicker-canvas-bg" r="20" cx="1.2858791391047208e-14" cy="105"></circle>
<circle class="timepicker-canvas-bearing" cx="0" cy="0" r="4"></circle>
</g>
</svg>
</div>
<div class="timepicker-dial timepicker-hours timepicker-dial-out" style="visibility: hidden;">
<div class="timepicker-tick" style="left: 167.5px; top: 24.0673px;">1</div>
<div class="timepicker-tick" style="left: 205.933px; top: 62.5px;">2</div>
<div class="timepicker-tick" style="left: 220px; top: 115px;">3</div>
<div class="timepicker-tick" style="left: 205.933px; top: 167.5px;">4</div>
<div class="timepicker-tick" style="left: 167.5px; top: 205.933px;">5</div>
<div class="timepicker-tick" style="left: 115px; top: 220px;">6</div>
<div class="timepicker-tick" style="left: 62.5px; top: 205.933px;">7</div>
<div class="timepicker-tick" style="left: 24.0673px; top: 167.5px;">8</div>
<div class="timepicker-tick" style="left: 10px; top: 115px;">9</div>
<div class="timepicker-tick" style="left: 24.0673px; top: 62.5px;">10</div>
<div class="timepicker-tick" style="left: 62.5px; top: 24.0673px;">11</div>
<div class="timepicker-tick" style="left: 115px; top: 10px;">12</div>
</div>
<div class="timepicker-dial timepicker-minutes" style="visibility: visible;">
<div class="timepicker-tick" style="left: 115px; top: 10px;">00</div>
<div class="timepicker-tick" style="left: 167.5px; top: 24.0673px;">05</div>
<div class="timepicker-tick" style="left: 205.933px; top: 62.5px;">10</div>
<div class="timepicker-tick" style="left: 220px; top: 115px;">15</div>
<div class="timepicker-tick" style="left: 205.933px; top: 167.5px;">20</div>
<div class="timepicker-tick" style="left: 167.5px; top: 205.933px;">25</div>
<div class="timepicker-tick" style="left: 115px; top: 220px;">30</div>
<div class="timepicker-tick" style="left: 62.5px; top: 205.933px;">35</div>
<div class="timepicker-tick" style="left: 24.0673px; top: 167.5px;">40</div>
<div class="timepicker-tick" style="left: 10px; top: 115px;">45</div>
<div class="timepicker-tick" style="left: 24.0673px; top: 62.5px;">50</div>
<div class="timepicker-tick" style="left: 62.5px; top: 24.0673px;">55</div>
</div>
</div>
<div class="timepicker-footer">
<button class="btn-flat timepicker-clear waves-effect" style="visibility: hidden;" type="button" tabindex="3">Clear</button>
<div class="confirmation-btns"><button class="btn-flat timepicker-close waves-effect" type="button" tabindex="3">Cancel</button><button class="btn-flat timepicker-close waves-effect" type="button" tabindex="3">Ok</button></div>
</div>
</div>
</div>
</div>
<input id="consumptionTime01" type="text" class="timepicker" autocomplete="off" placeholder="09:00 AM">
<label for="consumptionTime01" class="active">Consumption time</label>
</div>总而言之,我如何克隆选择器和选取器才能使它们真正工作?正确定位他们的ID吗?利用Materialize的API以某种方式做到这一点?到目前为止,我只是在全局初始化select和time选择器。
发布于 2019-04-27 07:23:36
我有一种感觉,您的事件处理程序并没有附加到动态创建(克隆)的元素上。
Normally, any event handlers bound to the original element are not copied to the clone.
看一下这个post
我想把这作为一个评论,但我目前不能发表评论。
发布于 2021-11-12 13:52:34
我知道这是一个老问题,但我刚刚遇到了一个类似的问题。
我解决这个问题的方法是在进行克隆之前用instance.destroy()销毁所有的select实例,然后在克隆块并将其插入到DOM之后重新初始化select。
您可以在这里看到工作的jsFiddle:https://jsfiddle.net/AJLeonardi/szt1enob/53/
https://stackoverflow.com/questions/55874246
复制相似问题