我为用户显示提醒,直到货件密度超过某个值。当页面加载时,会运行一个处理所有这些计算的函数(如果用户正在加载某些东西而不是从头开始),如果密度小于X,则显示崩溃,否则它将被隐藏。
问题是,在已经隐藏/显示的元素上调用.collapse('hide')或.collapse('show')会导致它执行相反的操作。
我将警报定义为:
<div class="row spacer-bottom collapse in" id="cubicCapacityWarn">
<div class="span8 offset1">
<div class="alert alert-error">
<h4><strong>Cubic Capacity Warning!</strong></h4>
Shipment Total PCF less than 6, you may be assessed Cubic Capacity surcharges!
</div>
</div>
</div>
处理所有这些的jQuery:
function updateTotals() {
var total_weight, total_volume, total_density;
total_weight = 0;
total_volume = 0;
total_density = 0;
$('#units').find('table.unit').each(function(index){
var weight, volume, density;
weight = 0;
volume = 0;
density = 0;
volume = parseFloat($(this).find('.unit_cube').text(), 10);
$(this).find('tbody.products tr').each(function(pIndex){
weight += parseFloat($(this).find('.weight').text(), 10);
});
density = weight / volume;
density = density.toFixed(2);
$(this).find('.unit_density').text(density);
total_weight += (weight * parseInt($(this).find('.unit_num_of').text(), 10));
total_volume += (volume * parseInt($(this).find('.unit_num_of').text(), 10));
});
total_density = total_weight / total_volume;
$('#total_weight').text(total_weight.toFixed(2));
$('#total_volume').text(total_volume.toFixed(2));
if(isNaN(total_density.toFixed(2))) {
$('#total_density').text("0.00").trigger('change');
} else {
$('#total_density').text(total_density.toFixed(2)).trigger('change');
}
}
$('#cubicCapacityWarn').collapse({toggle: false})
$('#cubicCapacityWarn').on('shown', function(event){
event.stopPropagation();
return false;
});
$('#cubicCapacityWarn').on('hidden', function(event){
alert('hidden')
event.stopPropagation();
return false;
});
$('#total_density').change(function(){
if(parseFloat($(this).text()) < 6) {
$('#cubicCapacityWarn').collapse('show');
alert('show')
} else {
$('#cubicCapacityWarn').collapse('hide');
}
});
updateTotals();
我想通过在调用.collapse('show'|'hide')之前测试它是否已经崩溃来解决这个问题,但我不知道怎么做。如果对这个问题有一个更优雅的解决方案,我很乐意听到它。
此外,我在此处发现此问题If the first call to collapse is hide the collapsable will show instead似乎相关,但我添加了$('#...').collapse({toggle: false});
但没有效果。
答案 0 :(得分:5)
我使用它来确定元素collapseTwo是否已关闭,然后打开它。当然,也是相反的方式。
if ($('#collapseTwo').attr('aria-expanded') == "false") {$('#collapseTwo').collapse('show');}
答案 1 :(得分:1)
另一种选择:检查它是否缺少.in
类。
if(!$('#collapseTwo').hasClass('collapse in')){
$('#collapseTwo').collapse('show');
}
答案 2 :(得分:1)
我知道这是一篇较旧的文章,但我也一直停留在该文章上。因此,在bootstrap 4.1中,我使用它来检查手风琴的状态:
var isVisible = $('#collapseOne').is( ":visible" );
alert(isVisible);
和另一种方法,如果要检查是否隐藏:
var isVisible = $('#collapseOne').is( ":hidden" );
alert(isVisible);
答案 3 :(得分:0)
以下似乎工作正常,但我希望看到更好的答案或解决方案,我正在做的事情感觉很糟糕,可能会让大多数jQ开发人员感到畏缩。
基本上,我现在在updateTotals()函数中显示/隐藏警报。我改变了使用在崩溃之后发生的显示/隐藏事件,现在正在使用那些在崩溃之前触发的事件。我测试看崩溃的高度是否是我期望的那样我将要做的事情(如果我是关于它的显示但高度是> 0,它必须已经显示)并且如果它失败了这个健全性检查我return false
似乎要取消事件从触发(我希望)或类似的东西,因为目前,除非有一个我没有测试的情况,这是有效的正如它应该。试图在显示时显示警报不会隐藏它,反之亦然。
function updateTotals() {
var total_weight, total_volume, total_density;
total_weight = 0;
total_volume = 0;
total_density = 0;
$('#units').find('table.unit').each(function(index){
var weight, volume, density;
weight = 0;
volume = 0;
density = 0;
volume = parseFloat($(this).find('.unit_cube').text(), 10);
$(this).find('tbody.products tr').each(function(pIndex){
weight += parseFloat($(this).find('.weight').text(), 10);
});
density = weight / volume;
density = density.toFixed(2);
$(this).find('.unit_density').text(density);
total_weight += (weight * parseInt($(this).find('.unit_num_of').text(), 10));
total_volume += (volume * parseInt($(this).find('.unit_num_of').text(), 10));
});
total_density = total_weight / total_volume;
$('#total_weight').text(total_weight.toFixed(2));
$('#total_volume').text(total_volume.toFixed(2));
if(isNaN(total_density.toFixed(2))) {
$('#total_density').text("0.00").trigger('change');
} else {
$('#total_density').text(total_density.toFixed(2)).trigger('change');
}
if((total_density.toFixed(2) < 6) || isNaN(total_density.toFixed(2))) {
$('#cubicCapacityWarn').collapse('show');
} else {
$('#cubicCapacityWarn').collapse('hide');
}
}
$('#cubicCapacityWarn').collapse({toggle: false})
$('#cubicCapacityWarn').on('show', function(event){
if($(this).height() > 0) {
return false;
}
console.log('shown');
event.stopPropagation();
});
$('#cubicCapacityWarn').on('hide', function(event){
if($(this).height() == 0) {
return false;
}
console.log('hidden');
event.stopPropagation();
});