优化“标签”代码

时间:2014-05-22 16:06:33

标签: javascript jquery html css tabs

我已经实施了一个"标签"控制在两个不同的选项卡之间切换,非常自我解释。这是相关代码:

HTML

<div class="tabs margin-r">
  <div id="tab-1" class="tab">Tab 1</div>
  <div id="tab-2" class="tab">Tab 2</div>
</div>

JS

var tabs = {

  init: function() {
    // Initialize cookie
    if(readCookie("tab_cookie")==null) {
      $("#tab-1").addClass("current-tab");
    } else {
      $("#" + readCookie("tab_cookie")).addClass("current-tab");
    }
    // Handle click event
    $(".tab").click(tabs.switchTabs);
  },

  switchTabs: function() {
    $(this).siblings(".tab").removeClass("current-tab");
    $(this).addClass("current-tab");
    createCookie("tab_cookie", $(this).attr("id"));
  }
};

$(document).ready(tabs.init);

我希望优化此代码,并为多个标签提供支持,使其位于同一页面上。显然,在这里使用id会使多个标签变得困难,所以我希望改变这种实现方式。任何想法,最佳实践等?

2 个答案:

答案 0 :(得分:1)

而不是使用id,您可以使用data,例如:

<div data-tab="1" class="tab"></div>

这样你可以使用jQuery data()

来访问它
$(this).data('tab'); // returns string: 1

// Get tab id and defaults to 1 if null
var tab_id = readCookie("tab_cookie") || 1;

// Set current tab
$('[data-tab=' + tab_id + ']', '.tabs').addClass('current');

而不是将侦听器附加到每个标签。您可以通过将监听器附加到父级来delegate events

$('.tabs').on('click', '.tab', tabs.switchTabs);

如果您甚至想在已经创建DOM之后使用ajax添加更多选项卡,这也会给您带来好处。


如果页面中只有一个标签集,则无需使用siblings()

你可以这样写:

$(this).siblings(".tab").removeClass("current-tab");
$(this).addClass("current-tab");
像那样:

$('.current-tab').removeClass('current-tab');
$(this).addClass("current-tab");

如果您仍然需要使用siblings(),您仍然可以使用$(this).siblings('current-tab')仅选择需要更改的标签,而不是所有标签。

答案 1 :(得分:0)

那么你会遇到加载问题,因为如果你正在谈论将html文件缩小为一个html文件,你将不得不考虑缩小html或其他。然而,大约两年前,我试着做你现在正在做的事情,这变得一团糟。我得出的结论是,最好在选项卡中将每个单独的页面作为php会话运行,因此如果切换选项卡,其他会话将从您切换的选项卡关闭。但是对于您指定的内容,您可以将选项卡列为变量,并从那里开始