动态添加 bootstrap 个选项卡,包括事件触发机制
Add bootstrap tabs dynamically including the events firing mechanism
使用 Bootstrap 3,我正在使用此 post 中建议的方式动态创建一些选项卡:
Add / Remove Tabs Dynamically in Bootstrap - Make created tab active.
除了事件触发机制之外,它的效果还不错。
例如,当单击静态预定义的选项卡时,会触发 shown.bs.tab
事件,但对于任何动态创建的选项卡都不是这种情况。
你可以在这个 fiddle 上试一试,这个 fiddle 改编自上面提出的那个 post
https://jsfiddle.net/HotPheel/v6be62c4/4/
HTML
<div class="container">
<ul class="nav nav-tabs">
<li class="active"><a href="#contact_01" data-toggle="tab">Joe Smith</a><span>x</span></li>
<li><a href="#contact_02" data-toggle="tab">Molly Lewis</a><span>x</span> </li>
<li><a href="#" class="add-contact" data-toggle="tab">+ Add Contact</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="contact_01">Contact Form: Joe Smith</div>
<div class="tab-pane" id="contact_02">Contact Form: Molly Lewis</div>
</div>
JS
$(".nav-tabs").on("click", "a", function(e){
e.preventDefault();
$(this).tab('show');
})
.on("click", "span", function () {
var anchor = $(this).siblings('a');
$(anchor.attr('href')).remove();
$(this).parent().remove();
$(".nav-tabs li").children('a').first().click();
});
$('.add-contact').click(function(e) {
e.preventDefault();
var id = $(".nav-tabs").children().length; //think about it ;)
$(this).closest('li').before('<li><a href="#contact_'+id+'">New Tab</a><span>x</span></li>');
$('.tab-content').append('<div class="tab-pane" id="contact_'+id+'">Contact Form: New Contact '+id+'</div>');});
$('a[data-toggle="tab"]')
.on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href");
alert('clicked on tab' + target);
})
CSS
.container {margin-top: 10px;}
.nav-tabs > li {position:relative;}
.nav-tabs > li > a {display:inline-block;}
.nav-tabs > li > span {
display:none;
cursor:pointer;
position:absolute;
right: 6px;
top: 8px;
color: red;}
.nav-tabs > li:hover > span {display: inline-block;}
关于动态创建 bootstrap 保留事件的选项卡的方法有什么想法吗?
非常感谢您的帮助。
有两个问题我可以确定,如果得到解决将实施一个可行的解决方案:
首先,您当前的代码不会在添加新选项卡/div 的逻辑中将 data-toggle="tab"
添加到新的 <li>
。所以我将其更新为:
$(this).closest('li').before('<li><a href="#contact_'+id+'" data-toggle="tab">New Tab</a><span>x</span></li>');
其次,根据其他线程,例如this one,正确的事件处理逻辑应该是这样挂钩它:
$(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) {
var target = $(e.target).attr("href");
alert('clicked on tab' + target);
})
更新 fiddle:https://jsfiddle.net/RobinMackenzie/ym9enL5p/4/
希望对您有所帮助。
使用 Bootstrap 3,我正在使用此 post 中建议的方式动态创建一些选项卡: Add / Remove Tabs Dynamically in Bootstrap - Make created tab active.
除了事件触发机制之外,它的效果还不错。
例如,当单击静态预定义的选项卡时,会触发 shown.bs.tab
事件,但对于任何动态创建的选项卡都不是这种情况。
你可以在这个 fiddle 上试一试,这个 fiddle 改编自上面提出的那个 post https://jsfiddle.net/HotPheel/v6be62c4/4/
HTML
<div class="container">
<ul class="nav nav-tabs">
<li class="active"><a href="#contact_01" data-toggle="tab">Joe Smith</a><span>x</span></li>
<li><a href="#contact_02" data-toggle="tab">Molly Lewis</a><span>x</span> </li>
<li><a href="#" class="add-contact" data-toggle="tab">+ Add Contact</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="contact_01">Contact Form: Joe Smith</div>
<div class="tab-pane" id="contact_02">Contact Form: Molly Lewis</div>
</div>
JS
$(".nav-tabs").on("click", "a", function(e){
e.preventDefault();
$(this).tab('show');
})
.on("click", "span", function () {
var anchor = $(this).siblings('a');
$(anchor.attr('href')).remove();
$(this).parent().remove();
$(".nav-tabs li").children('a').first().click();
});
$('.add-contact').click(function(e) {
e.preventDefault();
var id = $(".nav-tabs").children().length; //think about it ;)
$(this).closest('li').before('<li><a href="#contact_'+id+'">New Tab</a><span>x</span></li>');
$('.tab-content').append('<div class="tab-pane" id="contact_'+id+'">Contact Form: New Contact '+id+'</div>');});
$('a[data-toggle="tab"]')
.on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href");
alert('clicked on tab' + target);
})
CSS
.container {margin-top: 10px;}
.nav-tabs > li {position:relative;}
.nav-tabs > li > a {display:inline-block;}
.nav-tabs > li > span {
display:none;
cursor:pointer;
position:absolute;
right: 6px;
top: 8px;
color: red;}
.nav-tabs > li:hover > span {display: inline-block;}
关于动态创建 bootstrap 保留事件的选项卡的方法有什么想法吗?
非常感谢您的帮助。
有两个问题我可以确定,如果得到解决将实施一个可行的解决方案:
首先,您当前的代码不会在添加新选项卡/div 的逻辑中将 data-toggle="tab"
添加到新的 <li>
。所以我将其更新为:
$(this).closest('li').before('<li><a href="#contact_'+id+'" data-toggle="tab">New Tab</a><span>x</span></li>');
其次,根据其他线程,例如this one,正确的事件处理逻辑应该是这样挂钩它:
$(document).on('shown.bs.tab', 'a[data-toggle="tab"]', function (e) {
var target = $(e.target).attr("href");
alert('clicked on tab' + target);
})
更新 fiddle:https://jsfiddle.net/RobinMackenzie/ym9enL5p/4/
希望对您有所帮助。