【问题标题】:jQuery, Bootstrap click to remove tabjQuery,Bootstrap 单击以删除选项卡
【发布时间】:2015-03-23 04:46:46
【问题描述】:

我已经构建了一些功能来允许用户添加和删除选项卡。 “添加”功能按我的意愿工作,只会有 5 个选项卡可见,其余的将出现在下拉列表中。 jsfiddle

我在添加“删除”功能时遇到了一些问题。选项卡已正确删除,但现在解决问题:

  1. 如果我添加了超过 6 个选项卡(例如 12 个)并单击按钮以删除当前选定的选项卡(有效),则在第一个下拉元素上设置了 '.active' 类使其不可点击?我尝试了以下方法:

    $('.dropdown ul #tab6').parent().removeClass('active');

  2. 我也不确定如何在删除标签时更新标签上的数字。例如,我有 Device [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 并且我删除了 Device/tab 9 我怎样才能让标签仍然按顺序读取([1 , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 而不是 [1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12])?李>
  3. 如果第 2 点是处理此问题的正确方法,有什么意见吗?

我真的坚持这一点,所以任何帮助将不胜感激。

编辑:

我已经意识到标签的 ID 并不重要,只要它们是唯一的。我已经更新了fiddle,它添加了一个简单的 .each() 来更新选项卡选择中的文本。

当我从下拉列表中删除标签时,我仍然遇到第一个下拉列表被选中的问题,有人可以帮忙吗?

【问题讨论】:

  • 1) 删除设备按钮功能是正确的。 2) 每次删除后必须更改设备编号。
  • 是的,同意,但每次删除后更改数字只有在它是最后一个被删除的设备时才有效:请参阅jsfiddle.net/mcneela86/qjnnuerd
  • 他不是这个意思。我想他试图说。如果您有 [1 2 3 4] 并且您删除了 3,则必须遍历 3 之后的每个元素并在这种情况下将它们递减 4 到 3。您可以通过保留已删除元素的索引并设置 for 循环来做到这一点这将对 j>=i 生效
  • 嗯,好的,我会尝试并回复:-) 谢谢

标签: jquery twitter-bootstrap tabs jtmpl


【解决方案1】:

另一种方式。它应该是你要找的。​​p>

HTML(稍作修改)

<script id="tabTemp" type="text/x-jquery-tmpl"> 
    <div class='tab-pane' id='tab${device}'>
        This is device number <span class="dev-nr"></span>
        <p>Random string (to see tabs difference): <b>${randomStr}</b></p>
        <div>
            <a href="#" class="btn btn-danger btn-remove btnRmv">Remove device</a>
        </div>
    </div>
</script>
<script id="navTemp" type="text/x-jquery-tmpl"> 
    <li class="li-tab-toggle">
        <a href="#tab${device}" class="tab-toggle" data-toggle="tab">
            Device <span class="dev-nr"></span>
        </a>
    </li>
</script>
<script id="dropTemp" type="text/x-jquery-tmpl"> 
    <li class="dropdown">
        <a href="#" data-toggle="dropdown" class="dropdown-toggle">
            More Devices <b class="caret"></b>
        </a>
        <ul class="dropdown-menu" id="drop"></ul>
    </li>
</script>

<a href="#" class="btn btn-primary" id="btnAdd">Add device</a>
<ul class="nav nav-tabs" id="tabs">
    <li class="li-tab-toggle active"><a class="tab-toggle" href="#tab1" data-toggle="tab">Device 1</a></li>
</ul>
<div class="tab-content">
    <div class="tab-pane active" id="tab1">Device 1 content</div>
</div>

脚本:

var maxTabs = 4, index = 1;

$('#btnAdd').click(function(e){
    e.preventDefault();
    index++;
    $('.tab-toggle').length !== maxTabs || 
        $('#tabs').append($.tmpl(dropTemp))
        .find('#drop').append($('.li-tab-toggle:last').removeClass('active'));

    $.tmpl(navTemp, {"device" : index}).insertAfter('.li-tab-toggle:last');
    $.tmpl(tabTemp, {"device" : index}).appendTo('.tab-content');
    $('.li-tab-toggle:last a').tab('show');
    updateTabs();
});

$(document).on('click', '.btnRmv', function(e){
    var tabs = $('.li-tab-toggle').length,
        nav = $('.li-tab-toggle.active');

    nav.parent('#tabs').find('#drop li:first').insertBefore('#tabs .dropdown');
    tabs !== maxTabs+1 || $('#drop li').insertBefore('#tabs .dropdown').siblings('.dropdown').remove();

    $('a', nav.is('li:last') ? nav.prev() : nav.next()).tab('show');
    nav.add($('a', nav).attr('href')).remove();
    updateTabs();
});

function updateTabs(){
    for(var i=0; i < $('.tab-toggle').length; i++){
        $('.tab-toggle:eq('+i+') .dev-nr, .tab-pane:eq('+i+') .dev-nr').text(i+1);
    }
}

Demo

还有一点beautified version

【讨论】:

  • 你是个传奇,这真的很好用。 “Edie Johnny”的回答效果不错,但这个是最好的。有 2 个完整的工作示例。
【解决方案2】:

对于您的第一个问题:您需要将data-toggle="tab" 添加到您的第一个选项卡以使其可点击。

要在删除某些选项卡时更新选项卡,您可以在单击删除选项卡按钮时使用一些 eachs:

// Set a controller to see when 'each' comes to the dropdown menu
var dropdown = false;
// For each #tabs li a...
$('#tabs li a').each(function(index){
    // Test if the 'a' has a dropdown-toggle class
    if($(this).hasClass('dropdown-toggle')) {
        // It's in the dropdown, set the controller to true
        dropdown = true;
        return true;
    } else {
        // If the 'a' has not a dropdown-toggle class, just update
        // with index+1 (because index starts with 0)
        // Also check if the dropdown is false
        if(!dropdown) {
            $(this).attr('href','#tab'+(index + 1)).html('Device ' + (index+1));
        } else {
            // If dropdown is true, we just have to plus 'index'
            // because if not, dropdown menu will start with tab 7
            // instead of 6
            $(this).attr('href','#tab'+(index)).html('Tab ' + (index));
        }
    }
});
// Don't forget to update your 'nextTab' var
nextTab = 0;
$('#tabs li a').each(function(index) {
    nextTab = nextTab + 1;
});
// Update the tab-pane too.
$('.tab-content .tab-pane').each(function(index){
    $(this).attr('id','tab' + (index+1)).html('This is device number ' + (index+1) + '<div><a href="#" class="btn btn-primary btn-remove" id="btnRmv">Remove device</a></div>');
});

我也更新了删除按钮部分:

// REMOVE TAB TAB
if (nextTab < 6) {
    $('.nav-tabs li.active').remove();
} else if(nextTab > 6) {
    $('.nav-tabs li.active .dropdown-menu li.active').remove();
    // Check if there's tabs inside the dropdown, if not,
    // remove the dropdown.
    if(!$(".dropdown-menu").find("li").length) {
        $('.dropdown').remove();
    }
}

这是分叉的jsFiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多