/** * @file 导航栏组件 * @name Navigator * @desc ../gmu/_examples/widget/navigator/tab.html * 导航栏组件 * @import core/zepto.ui.js */ (function ($, undefined) { /** * @name navigator * @grammar navigator(options) ⇒ self * @grammar $.ui.navigator([el [,options]]) ⇒ self * @desc * **Options** * - ''container'' {Selector|Zepto}: (可选)父容器,渲染的元素,默认值:document.body * - ''content'' {Array}: (必选)导航tab项的内容,支持fix的元素(设置pos)及自定义属性(设置attr){text:\'\',url:\'\',pos:\'\',attr:{a:\'\',b:\'\'}} * - ''defTab'' {Number}: (可选, 默认:0)默认选中的导航tab项的索引,若为默认选中固定tab,则索引值在原来tabs.length上加1,默认值:0 * - ''beforetabselect'' {Function}: (可选)tab选中前的事件,可阻止tab选中 * - ''tabselect'' {Function}: (可选)tab选中时的事件 * * **setup方式html规则** * *
* *
*
* **full setup方式html规则** * *
* *
*
* **Demo** * * ../gmu/_examples/widget/navigator/tab.html * */ var tmpl = '<% for (var i=0, len=left.length; i' + '<%=left[i].text%>' + '<% } %>' + '' + '<% for (var i=0, len=right.length; i' + '<%=right[i].text%>' + '<% } %>'; $.ui.define("navigator", { _data: { container: "", content: [], defTab: 0, beforetabselect: null, tabselect: null }, _create: function () { var me = this, data = me._data, $el = me.root(), container = $(data.container || document.body).get(0), tabObj = {left: [],mid: [],right: []},html; $.each(data.content, function () { //组合数据 tabObj[this.pos ? this.pos : 'mid'].push(this); }); html = $.parseTpl(tmpl, tabObj) //解析数据模板 if ($el) { $el.append(html); (!$el.parent().length || container !== document.body) && $el.appendTo(container); } else { me.root($("
").append(html)).appendTo(container); } }, _setup: function (fullMode) { var me = this, data = me._data, defTab = data.defTab, $el = me.root(); if (!fullMode) { $el.children('a').addClass('ui-navigator-fix'); //smart模式针对内容添加样式 $el.children('ul').addClass('ui-navigator-list'); } $el.find('a').each(function (i) { defTab === 0 ? $(this).hasClass('cur') && (data.defTab = i) : $(this).removeClass('cur'); //处理同时defTab和写cur class的情况 }); }, _init: function () { var me = this, data = me._data, $el = me.root(), content = data.content, $tabList = $el.find('a'); //包括fix的tab和可滑动的tab $tabList.each(function (i) { this.index = i; content.length && content[i].attr && $(this).attr(content[i].attr); //添加自己定义属性 }); data._$tabList = $tabList; data._lastIndex = -1; $el.addClass('ui-navigator').on('click', $.proxy(me._switchTabHandler, me)); me.switchTo(data.defTab, true); //设置默认选中的tab }, _switchTabHandler: function (e) { var me = this, target = e.target; $(target).closest('a').get(0) && me.switchTo(target.index, false, e); return me; }, /** * @name switchTo * @desc 切换到某个tab * @grammar switchTo() ⇒ self * @example * $('#nav').navigator('switchTo', 1); //setup模式 * var nav = $.ui.navigator(opts); //render模式 * nav.switchTo(1); */ switchTo: function (index, isDef, e) { var me = this, data = me._data, lastIndex = data._lastIndex, $tabList = data._$tabList, beforeSelectEvent = $.Event('beforetabselect'); me.trigger(beforeSelectEvent, [$tabList[index]]); if (beforeSelectEvent.defaultPrevented) { //阻止默认事件 e && e.preventDefault(); //若是程序调switchTo,则直接return,若点击调用则preventDefault return me; }; //点击同一个tab,若是程序调switchTo,则直接return,若点击调用则preventDefault if (lastIndex == index) { e && e.preventDefault(); return me; } //当选中的是同一个tab时,直接返回 lastIndex >= 0 && $tabList.eq(lastIndex).removeClass("cur"); //修改样式放在跳转后边 $tabList.eq(index).addClass("cur"); data._lastIndex = index; return me.trigger('tabselect', [$tabList.get(index), index]); }, /** * @name getCurTab * @desc 切换到某个tab * @grammar getCurTab() ⇒ tab obj * @example * $('#nav').navigator('getCurTab'); //setup模式 * var nav = $.ui.navigator(opts); //render模式 * nav.getCurTab(); //返回当前tab信息,包括index和当前tab elem */ getCurTab: function () { var me = this, data = me._data, lastIndex = data._lastIndex; return { index: lastIndex, info: data._$tabList[lastIndex] } } }); })(Zepto);