销毁并重新初始化 bootstrap-slider
Destroy and re-initialize a bootstrap-slider
我正在使用此处找到的 Bootstrap-滑块 - https://github.com/seiyria/bootstrap-slider,目前正在使用 v10(尽管我也尝试过使用 v11,但结果相同)。这是我的代码:
/* For better styling - this uses Bootstrap slider */
$('.bs_sliders').each(function () {
var id = '#' + $(this).attr('id');
if (typeof window[id] !== 'undefined') {
window[id].slider('destroy');
delete window[id];
}
// .on will only work with an ID based selector not class
window[id] = $(id).slider({
formatter: function (value) {
return value;
},
}).on('change', function (ev) {
$(this).closest('li').find('.rangeUpdate').val($(this).val());
$(this).closest('li').find('.continuing_eval').removeClass('continuing_eval');
autoSave();
})
})
基本上我试图销毁并重新初始化一个滑块(如果存在)。虽然它半工作我注意到(例如)我的范围是 0-100 它只会达到 10,即使输入如下:
<input type="text" name="54_slider" value="22" class="bs_sliders elRes" id="54_slider" data-slider-id="54_slider"
data-slider-min="0" data-slider-max="100" data-slider-step="1" data-slider-value="22"
data-slider-handle="custom"
data-slider-rangeHighlights='[{"start":25,"end":26,"class":"grey_line"},{"start":50,"end":51,"class":"grey_line"},{"start":75,"end":76,"class":"grey_line"}]' />
<input type="text" value="22" class="rangeUpdate" data-toggle="popover" data-trigger="manual"
data-content="The permitted value range is 0-100" style="--my-content:'Undefined';" />
此外,它也不会选择自定义元素(例如分隔线)。我怎样才能让它在重新初始化 bs-slider 时获取所有自定义元素和属性?
事实证明,解决方案是自己销毁它...我们所做的是克隆原始元素 - 获取其值,删除元素,重新附加克隆,然后在滑块上设置值。相当长篇大论,你会期望“销毁”来做到这一点,但它显然没有。
$('.bs_sliders').each(function(){
var id = $(this).attr('id');
// Detach and Reattach slider cloning the existing element
if (typeof my_sliders[id] !== 'undefined'){
delete my_sliders[id];
var setVal = $(this).attr('value');
// Parent of current element for new element
var our_parent = $(this).parents('.slide_slidecontainers');
// Rebuild the element
var new_elem = $(this).clone();
// Get rid of the actual input and rebuild it
$(this).remove();
$(our_parent).find('.slider').remove();
$(our_parent).append($(new_elem));
use_elem = $(new_elem);
// Simply Attach using the existing element
} else {
use_elem = $(this);
}
my_sliders[id] = $(use_elem).slider();
if (typeof setVal !== 'undefined'){
my_sliders[id].slider('setValue',setVal);
}
my_sliders[id].on('change',function(ev){
$(this).closest('li').find('.rangeUpdate').val($(this).val());
$(this).closest('li').find('.continuing_eval').removeClass('continuing_eval');
autoSave();
})
})
我正在使用此处找到的 Bootstrap-滑块 - https://github.com/seiyria/bootstrap-slider,目前正在使用 v10(尽管我也尝试过使用 v11,但结果相同)。这是我的代码:
/* For better styling - this uses Bootstrap slider */
$('.bs_sliders').each(function () {
var id = '#' + $(this).attr('id');
if (typeof window[id] !== 'undefined') {
window[id].slider('destroy');
delete window[id];
}
// .on will only work with an ID based selector not class
window[id] = $(id).slider({
formatter: function (value) {
return value;
},
}).on('change', function (ev) {
$(this).closest('li').find('.rangeUpdate').val($(this).val());
$(this).closest('li').find('.continuing_eval').removeClass('continuing_eval');
autoSave();
})
})
基本上我试图销毁并重新初始化一个滑块(如果存在)。虽然它半工作我注意到(例如)我的范围是 0-100 它只会达到 10,即使输入如下:
<input type="text" name="54_slider" value="22" class="bs_sliders elRes" id="54_slider" data-slider-id="54_slider"
data-slider-min="0" data-slider-max="100" data-slider-step="1" data-slider-value="22"
data-slider-handle="custom"
data-slider-rangeHighlights='[{"start":25,"end":26,"class":"grey_line"},{"start":50,"end":51,"class":"grey_line"},{"start":75,"end":76,"class":"grey_line"}]' />
<input type="text" value="22" class="rangeUpdate" data-toggle="popover" data-trigger="manual"
data-content="The permitted value range is 0-100" style="--my-content:'Undefined';" />
此外,它也不会选择自定义元素(例如分隔线)。我怎样才能让它在重新初始化 bs-slider 时获取所有自定义元素和属性?
事实证明,解决方案是自己销毁它...我们所做的是克隆原始元素 - 获取其值,删除元素,重新附加克隆,然后在滑块上设置值。相当长篇大论,你会期望“销毁”来做到这一点,但它显然没有。
$('.bs_sliders').each(function(){
var id = $(this).attr('id');
// Detach and Reattach slider cloning the existing element
if (typeof my_sliders[id] !== 'undefined'){
delete my_sliders[id];
var setVal = $(this).attr('value');
// Parent of current element for new element
var our_parent = $(this).parents('.slide_slidecontainers');
// Rebuild the element
var new_elem = $(this).clone();
// Get rid of the actual input and rebuild it
$(this).remove();
$(our_parent).find('.slider').remove();
$(our_parent).append($(new_elem));
use_elem = $(new_elem);
// Simply Attach using the existing element
} else {
use_elem = $(this);
}
my_sliders[id] = $(use_elem).slider();
if (typeof setVal !== 'undefined'){
my_sliders[id].slider('setValue',setVal);
}
my_sliders[id].on('change',function(ev){
$(this).closest('li').find('.rangeUpdate').val($(this).val());
$(this).closest('li').find('.continuing_eval').removeClass('continuing_eval');
autoSave();
})
})