带有远程内容的jQuery UI选项卡,链接到当前页面并选中了选项卡

时间:2013-06-05 14:03:52

标签: javascript jquery ajax jquery-ui tabs

在以前版本的jQuery UI(< = 1.8)中,加载选项卡时,远程选项卡的链接将与本地链接交换。这使得可以在选项卡上集中点击(也就是在新浏览器选项卡中打开链接),并且它将选择选项卡深度链接到当前页面。这是我想要保持的行为。

旧标签:

<div id="tabs">
  <ul>
    <li><a href="some-ajax-content.php" title="section1">Content 1/a></li>
    <li><a href="some-other-ajax-content.php" title="section2">Content 2</a></li>
  </ul>
  <div id="section 1">Loading Content...</div>
  <div id="section 2">Loading Content...</div>
</div>

在调用$('#tabs')。tabs()之后,这将导致:

<div id="tabs">
  <ul>
    <li><a href="#section1" title="section1">Content 1/a></li>
    <li><a href="#section2" title="section2">Content 2</a></li>
  </ul>
  <div id="section 1">Loading Content...</div>
  <div id="section 2">Loading Content...</div>
</div>

新标签(UI&gt; = 1.9)

<div id="tabs">
  <ul>
    <li aria-controls="section1"><a href="some-ajax-content.php">Content 1/a></li>
    <li aria-controls="section1"><a href="some-other-ajax-content.php">Content 2</a></li>
  </ul>
  <div id="section 1">Loading Content...</div>
  <div id="section 2">Loading Content...</div>
</div>

调用$('#tabs')。tabs():

<div id="tabs">
  <ul>
    <li aria-controls="section1"><a href="some-ajax-content.php">Content 1/a></li>
    <li aria-controls="section1"><a href="some-other-ajax-content.php">Content 2</a></li>
  </ul>
  <div id="section 1">Loading Content...</div>
  <div id="section 2">Loading Content...</div>
</div>

调用$('#tabs')。tabs()后,不会交换href属性。这意味着,如果用户单击以在新选项卡中打开链接,则将直接加载ajax内容。正如我所期望的那样,ajax内容只是页面的一部分,不应该单独呈现在页面上。有没有一种简单的方法可以更改标记以恢复以前的行为?

感谢。

1 个答案:

答案 0 :(得分:1)

我被困在这一段时间了,我想出来了。

在JQuery UI 1.9之前,它转换为使用“#”来显示div,用于ajax加载的URL存储为数据对象

因此,对于JQuery UI&gt; = 1.9,我试图模仿相同的行为。 在JQuery&gt; = 1.9中,aria-controls属性用于为每个选项卡选择div关联。

以下对我有用。

$("#tabs").tabs({
    beforeActivate: function (event, ui) {
        //...do stuff
        var numOfTabs = $('#tabs ul li').size();
        //change href to use # instead of URL directly, stores URL as data object
        for (i=0; i<numOfTabs; i++) {
            $(ui.newTab).parent().find("li a").eq(i).data("href.tabs",$(ui.newTab).parent().find("li a").eq(i).attr('href'));
            $(ui.newTab).parent().find("li a").eq(i).attr('href', '#'+$(ui.newTab).parent().find("li").eq(i).attr('aria-controls'));
        }
        //...do stuff
    },
    activate: function (event, ui) {
        //...do stuff
        var numOfTabs = $('#tabs ul li').size();
        //use URL stored in data object as href
        for (i = 0; i < lenTabs; i++) {
            $(ui.newTab).parent().find("li a").eq(i).attr('href', $(ui.newTab).parent().find('a').eq(i).data("href.tabs"));
        }
        //...do stuff
    }
});