【发布时间】:2014-10-28 12:02:22
【问题描述】:
我使用以下脚本来拥有多个 jQuery UI 滑块,它们的总和是:Combined total for multiple jQuery-UI Sliders
现在我想在页面加载时从一个滑块开始,单击按钮后我想添加另一个应该包含在计算中的滑块。但不幸的是,在我的方法中,当我添加一个新滑块时,第一个滑块的值是NaN,当我尝试移动它时,我收到以下错误Uncaught TypeError: Cannot read property 'addClass' of undefined。
当我从一开始就包含多个滑块时(通过 PHP),它可以正常工作。
这里是html结构:
<div class="form-group taskType">
<label for="TaskType32" class="col-sm-4 control-label">Aufgaben Art</label>
<div class="col-sm-8">
<select class="form-control" id="TaskType32" name="type[]">
<optgroup label="DESIGN">
<option value="photoshop">PHOTOSHOP</option>
<option value="recherche">RECHERCHE</option>
</optgroup>
</select>
<div class="rangeSliderContainer">
<div class="slider">100</div>
<span class="value">100</span>%
</div>
<input type="hidden" class="hiddenPercentage" name="percentage[]" value="100">
</div>
</div>
这是我的方法:
1.) 我先克隆元素
clonedTaskAdd = $('.createfinishedTask .taskType').clone();
2.) 然后我初始化滑块函数
manageSliders();
function manageSliders() {
var sliders = $(".rangeSliderContainer .slider");
var availableTotal = 100;
sliders.each(function() {
var init_value = parseInt($(this).text());
$(this).siblings('.value').text(init_value);
$(this).empty().slider({
value: init_value,
min: 0,
max: availableTotal,
range: "max",
step: 2,
animate: 0,
slide: function(event, ui) {
// Update display to current value
$(this).siblings('.value').text(ui.value);
$(this).parent().next('.hiddenPercentage').val(ui.value);
// Get current total
var total = 0;
sliders.not(this).each(function() {
total += $(this).slider("option", "value");
});
// Need to do this because apparently jQ UI
// does not update value until this event completes
total += ui.value;
var delta = availableTotal - total;
// Update each slider
sliders.not(this).each(function() {
var t = $(this),
value = t.slider("option", "value");
var new_value = value + (delta/2);
if (new_value < 0 || ui.value == 100)
new_value = 0;
if (new_value > 100)
new_value = 100;
t.siblings('.value').text(new_value);
t.slider('value', new_value);
t.parent().next('.hiddenPercentage').val(new_value);
});
}
});
});
}
3.) 在按钮单击时,我更改克隆的值并附加它
$('.createfinishedTask').on('click', '.rangeTrigger', function(e) {
e.preventDefault();
addSlider();
});
function addSlider() {
clonedTaskAdd.find('.slider, .value').text('0');
clonedTaskAdd.find('.hiddenPercentage').val('0');
clonedTaskAdd.find('.slider').slider();
$('.createfinishedTask .taskType').last().after(clonedTaskAdd);
manageSliders();
}
所以问题发生在我在addSlider() 函数中调用最后一个manageSliders(); 之后。但我不知道如何将新添加的滑块包含在总计算中。
如果您需要更多信息,请随时询问。谢谢!
【问题讨论】:
-
初步观察是您正在克隆具有 ID 的元素(例如
id="TaskType32")。 ID 在页面上必须是唯一的(jQuery 只会找到第一个)。您需要重新编写要克隆的 HTML 以适应此规则。 -
@TrueBlueAussie 感谢您的回答,但这不是问题所在。即使我删除了 ID,问题仍然存在。
-
这只是一个观察,并不打算回答主要问题。有这么多代码,可能会出现多个问题,你真的应该把它们都放在一个 JSFiddle 中:)
-
问:您是否为每个副本克隆克隆?否则,您最终会在随后的
after调用中移动原始克隆元素。 -
不,我不会为每个副本都克隆它。我只是在准备好文档时克隆它一次。问题已经从第一个动态添加的元素开始。是的,我知道很难找到有这么多代码的东西,我只是想也许这是我明显遗漏的东西。我现在没有太多时间,明天我会尝试创建一个小提琴。感谢您的努力!
标签: jquery html jquery-ui clone uislider