jQuery - 捕获选项卡选择事件

40

我是jQuery新手,正在尝试弄清楚如何捕获选项卡选择事件。使用jQuery 1.2.3和相应的jQuery UI选项卡(这不是我的选择,我无法控制)。这是一个嵌套选项卡,第一级div名称为tabs。这是我初始化选项卡的方式:

$(function() {
       $('#tabs ul').tabs();
});

$(document).ready(function(){
    $('#tabs ul').tabs('select', 0); 
}); 

我无法弄清楚如何捕获任何事件或属性(选定的选项卡,当选项卡被单击时等)。希望能得到任何帮助...

我尝试了以下方法:

$('#tabs ul').bind('tabsselect', function(event, ui) {
    selectedTab = ui.index;
    alert('selectedTab : ' + selectedTab);
});

              (OR)

$('#tabs').bind('tabsselect', function(event, ui) {

一直尝试却没有成功。

以下是标记代码:

<div id="tabs">
<UL>
    <LI><A href="#fragment-1"><SPAN>Tab1</SPAN></A></LI>
    <LI><A href="#fragment-2"><SPAN>Tab2</SPAN></A></LI>
    <LI><A href="#fragment-3"><SPAN>Tab3</SPAN></A></LI>
    <LI><A href="#fragment-4"><SPAN>Tab4</SPAN></A></LI>
</UL>

<DIV id=fragment-1>
<UL>
    <LI><A href="#fragment-1a"><SPAN>Sub-Tab1</SPAN></A></LI>
    <LI><A href="#fragment-1b"><SPAN>Sub-Tab2</SPAN></A></LI>
    <LI><A href="#fragment-1c"><SPAN>Sub-Tab3</SPAN></A></LI>
</UL>
</DIV>
.
.
.

</DIV>

这是一个 jQuery UI 的问题吗?如果是,请正确标记。 - Pablo Fernandez
7个回答

62

看起来旧版本的jquery ui不再支持选择事件。

这段代码将适用于新版本:

$('.selector').tabs({
                    activate: function(event ,ui){
                        //console.log(event);
                        console.log(ui.newTab.index());
                    }
});

3
在jQuery 1.9.x上,这对我有效。正是我所需要的,谢谢! - roberthuttinger
请使用 beforeActivate 作为替代。请参阅文档 http://jqueryui.com/upgrade-guide/1.9/#deprecated-select-event-renamed-to-beforeactivate - wal
@peter,具有讽刺意味的是,我正在使用旧版本的jQuery,而您的评论为我节省了一些严重的挫败感。谢谢! - rstackhouse
我希望这是这个问题的选定答案。谢谢。 - Zack Xu

44

正确捕获选项卡选择事件的方法是在初始化选项卡时 (您也可以在之后动态设置),将一个函数作为select选项的值进行设置,如下所示:

$('#tabs, #fragment-1').tabs({
  select: function(event, ui){
    // Do stuff here
  }
});

你可以在这里查看实际代码演示:http://jsfiddle.net/mZLDk/


编辑:通过你给我的链接,我已经为jQuery 1.2.3创建了一个测试环境,并带有jQuery UI 1.5(我想是这个版本)。一些东西显然从那时起发生了变化。没有一个单独的ui对象与原始的event对象分开。代码大致如下:

// Tab initialization
$('#container ul').tabs({
    select: function(event) {
        // You need Firebug or the developer tools on your browser open to see these
        console.log(event);
        // This will get you the index of the tab you selected
        console.log(event.options.selected);
        // And this will get you it's name
        console.log(event.tab.text);
    }
});

哎呀,如果有什么需要学习的,那就是维护遗留代码很难。欲了解更多,请查看jsfiddle:http://jsfiddle.net/qCfnL/1/


编辑: 对于使用较新版本jQuery的人,请尝试以下操作:

$("#tabs").tabs({
    activate: function (event, ui) {
        console.log(event);
    }
});

这在jsfiddle中非常好用,但是当我将它复制到我的代码中时,会出现“index为null或不是对象”的错误。你有什么想法吗? - Bob76
这太棒了,Yi。非常感谢你。我认为我永远也想不到这个。我尝试了一下fiddle,"options.selected"给出了先前选定的选项卡的索引。你知道有什么可以给出当前选定选项卡索引的方法吗?在IE6中似乎无法使用tab.text(对不起,这不是我的选择。公司政策 :))但是,我很高兴事件捕获现在可以工作了,如果什么都不行,我可能能够放置某种黑客来使其正常工作。 - Bob76
2
我认为使用“show”而不是“select”可能会有所帮助。谢谢。 - Bob76
1
顺便提一下:activate: 对我很有用。自从 JQueryUI-1.10 以后,select 事件已经不存在了! - Adriano
@Bob76 谢谢。如果需要对选项卡的内容执行某些操作,应使用“show”而不是“select”。 - leticia
显示剩余2条评论

6
这篇文章展示了一个完整的HTML文件,作为点击选项卡时触发代码运行的示例。使用.on()方法是jQuery推荐处理事件的方式。 jQuery开发历史 当用户点击选项卡时,可以通过给列表元素添加id来实现某些操作。
<li id="list">

接着引用ID。

$("#list").on("click", function() {
 alert("Tab Clicked!");
});

请确保您正在使用当前版本的jQuery API。您可以从Google引用jQuery API,链接在此处:

https://developers.google.com/speed/libraries/devguide#jquery

这是一个完整的Tab页的示例代码,当水平选项卡1被点击时会触发警报。

<!-- This HTML doc is modified from an example by:  -->
<!-- http://keith-wood.name/uiTabs.html#tabs-nested -->

<head>
<meta charset="utf-8">
<title>TabDemo</title>

<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/south-street/jquery-ui.css">

<style>
pre {
clear: none;
}
div.showCode {
margin-left: 8em;
}
.tabs {
margin-top: 0.5em;
}
.ui-tabs { 
padding: 0.2em; 
background: url(http://code.jquery.com/ui/1.8.23/themes/south-street/images/ui-bg_highlight-hard_100_f5f3e5_1x100.png) repeat-x scroll 50% top #F5F3E5; 
border-width: 1px; 
} 
.ui-tabs .ui-tabs-nav { 
padding-left: 0.2em; 
background: url(http://code.jquery.com/ui/1.8.23/themes/south-street/images/ui-bg_gloss-wave_100_ece8da_500x100.png) repeat-x scroll 50% 50% #ECE8DA; 
border: 1px solid #D4CCB0;
-moz-border-radius: 6px; 
-webkit-border-radius: 6px; 
border-radius: 6px; 
} 
.ui-tabs-nav .ui-state-active {
border-color: #D4CCB0;
}
.ui-tabs .ui-tabs-panel { 
background: transparent; 
border-width: 0px; 
}
.ui-tabs-panel p {
margin-top: 0em;
}
#minImage {
margin-left: 6.5em;
}
#minImage img {
padding: 2px;
border: 2px solid #448844;
vertical-align: bottom;
}

#tabs-nested > .ui-tabs-panel {
padding: 0em;
}
#tabs-nested-left {
position: relative;
padding-left: 6.5em;
}
#tabs-nested-left .ui-tabs-nav {
position: absolute;
left: 0.25em;
top: 0.25em;
bottom: 0.25em;
width: 6em;
padding: 0.2em 0 0.2em 0.2em;
}
#tabs-nested-left .ui-tabs-nav li {
right: 1px;
width: 100%;
border-right: none;
border-bottom-width: 1px !important;
-moz-border-radius: 4px 0px 0px 4px;
-webkit-border-radius: 4px 0px 0px 4px;
border-radius: 4px 0px 0px 4px;
overflow: hidden;
}
#tabs-nested-left .ui-tabs-nav li.ui-tabs-selected,
#tabs-nested-left .ui-tabs-nav li.ui-state-active {
border-right: 1px solid transparent;
}
#tabs-nested-left .ui-tabs-nav li a {
float: right;
width: 100%;
text-align: right;
}
#tabs-nested-left > div {
height: 10em;
overflow: auto;
}
</pre>

</style>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>

<script>
    $(function() {
    $('article.tabs').tabs();
    });
</script>

</head>
<body>
<header role="banner">
    <h1>jQuery UI Tabs Styling</h1>
</header>

<section>

<article id="tabs-nested" class="tabs">
<script>
    $(document).ready(function(){
    $("#ForClick").on("click", function() {
        alert("Tab Clicked!");
    });
    });
</script>
<ul>
    <li id="ForClick"><a href="#tabs-nested-1">First</a></li>
    <li><a href="#tabs-nested-2">Second</a></li>
    <li><a href="#tabs-nested-3">Third</a></li>
</ul>
<div id="tabs-nested-1">
    <article id="tabs-nested-left" class="tabs">
        <ul>
            <li><a href="#tabs-nested-left-1">First</a></li>
            <li><a href="#tabs-nested-left-2">Second</a></li>
            <li><a href="#tabs-nested-left-3">Third</a></li>
        </ul>
        <div id="tabs-nested-left-1">
            <p>Nested tabs, horizontal then vertical.</p>


<form action="/sign" method="post">
  <div><textarea name="content" rows="5" cols="100"></textarea></div>
  <div><input type="submit" value="Sign Guestbook"></div>
</form>
        </div>
        <div id="tabs-nested-left-2">
            <p>Nested Left Two</p>
        </div>
        <div id="tabs-nested-left-3">
            <p>Nested Left Three</p>
        </div>
    </article>
</div>
<div id="tabs-nested-2">
    <p>Tab Two Main</p>
</div>
<div id="tabs-nested-3">
    <p>Tab Three Main</p>
</div>
</article>

</section>

</body>
</html>

3

2

简单来说:

$("#tabs_div").tabs();
$("#tabs_div").on("click", "a.tab_a", function(){
    console.log("selected tab id: " + $(this).attr("href"));
    console.log("selected tab name: " + $(this).find("span").text());
});

但是您需要将类名称添加到名为“tab_a”的锚点中:
<div id="tabs">
<UL>
    <LI><A class="tab_a" href="#fragment-1"><SPAN>Tab1</SPAN></A></LI>
    <LI><A class="tab_a" href="#fragment-2"><SPAN>Tab2</SPAN></A></LI>
    <LI><A class="tab_a" href="#fragment-3"><SPAN>Tab3</SPAN></A></LI>
    <LI><A class="tab_a" href="#fragment-4"><SPAN>Tab4</SPAN></A></LI>
</UL>

<DIV id=fragment-1>
<UL>
    <LI><A class="tab_a" href="#fragment-1a"><SPAN>Sub-Tab1</SPAN></A></LI>
    <LI><A class="tab_a" href="#fragment-1b"><SPAN>Sub-Tab2</SPAN></A></LI>
    <LI><A class="tab_a" href="#fragment-1c"><SPAN>Sub-Tab3</SPAN></A></LI>
</UL>
</DIV>
.
.
</DIV>

最好使用事件委托的做法! - Aurovrata

2
据我所知,根据这里的文档:http://jqueryui.com/demos/tabs/#event-select,看起来你没有正确初始化它。演示说明需要一个主包装的<div>元素,其中包含表示选项卡的<ul>或可能是<ol>元素,然后是每个选项卡页面的元素(假定是<div><p>,如果我们使用HTML5,则可能是<section>)。然后在主<div>上调用$().tabs(),而不是<ul>元素。

之后,您可以轻松绑定到tabsselect事件。查看此fiddle以获取基本示例:

http://jsfiddle.net/KE96S/


-2

只需使用选项卡显示的 on click 事件即可。

$(document).on('shown.bs.tab', 'a[href="#tab"]', function (){
});

问题是关于Jquery UI选项卡,而不是BS选项卡。 - Vivek Vikranth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接