navigator.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * @file 导航栏组件
  3. * @name Navigator
  4. * @desc <qrcode align="right" title="Live Demo">../gmu/_examples/widget/navigator/tab.html</qrcode>
  5. * 导航栏组件
  6. * @import core/zepto.ui.js
  7. */
  8. (function ($, undefined) {
  9. /**
  10. * @name navigator
  11. * @grammar navigator(options) ⇒ self
  12. * @grammar $.ui.navigator([el [,options]]) ⇒ self
  13. * @desc
  14. * **Options**
  15. * - ''container'' {Selector|Zepto}: (可选)父容器,渲染的元素,默认值:document.body
  16. * - ''content'' {Array}: (必选)导航tab项的内容,支持fix的元素(设置pos)及自定义属性(设置attr){text:\'\',url:\'\',pos:\'\',attr:{a:\'\',b:\'\'}}
  17. * - ''defTab'' {Number}: (可选, 默认:0)默认选中的导航tab项的索引,若为默认选中固定tab,则索引值在原来tabs.length上加1,默认值:0
  18. * - ''beforetabselect'' {Function}: (可选)tab选中前的事件,可阻止tab选中
  19. * - ''tabselect'' {Function}: (可选)tab选中时的事件
  20. *
  21. * **setup方式html规则**
  22. * <code type="html">
  23. * <div>
  24. * <ul>
  25. * <li><a href="#test1">首页</a></li>
  26. * <li><a href="javascript:;">电影</a></li>
  27. * <li><a class="cur" href="javascript:;">电视剧</a></li>
  28. * </ul>
  29. * </div>
  30. * </code>
  31. * **full setup方式html规则**
  32. * <code type="html">
  33. * <div class="ui-navigator"> <!--需将所有的class都写全,在网速较慢时先展示-->
  34. * <ul class="ui-navigator-list">
  35. * <li><a href="#test1">首页</a></li>
  36. * <li><a href="javascript:;">电影</a></li>
  37. * <li><a class="cur" href="javascript:;">电视剧</a></li>
  38. * </ul>
  39. * </div>
  40. * </code>
  41. * **Demo**
  42. * <codepreview href="../gmu/_examples/widget/navigator/tab.html">
  43. * ../gmu/_examples/widget/navigator/tab.html
  44. * </codepreview>
  45. */
  46. var tmpl = '<% for (var i=0, len=left.length; i<len; i++) { %>'
  47. + '<a href="<%=left[i].url%>" class="ui-navigator-fix ui-navigator-fixleft"><%=left[i].text%></a>'
  48. + '<% } %>'
  49. + '<ul class="ui-navigator-list">'
  50. + '<% for (var i=0, len=mid.length; i<len; i++) { %>'
  51. + '<li><a href="<%=mid[i].url%>"><%=mid[i].text%></a></li>'
  52. + '<% } %></ul>'
  53. + '<% for (var i=0, len=right.length; i<len; i++) { %>'
  54. + '<a href="<%=right[i].url%>" class="ui-navigator-fix ui-navigator-fixright"><%=right[i].text%></a>'
  55. + '<% } %>';
  56. $.ui.define("navigator", {
  57. _data: {
  58. container: "",
  59. content: [],
  60. defTab: 0,
  61. beforetabselect: null,
  62. tabselect: null
  63. },
  64. _create: function () {
  65. var me = this,
  66. data = me._data,
  67. $el = me.root(),
  68. container = $(data.container || document.body).get(0),
  69. tabObj = {left: [],mid: [],right: []},html;
  70. $.each(data.content, function () { //组合数据
  71. tabObj[this.pos ? this.pos : 'mid'].push(this);
  72. });
  73. html = $.parseTpl(tmpl, tabObj) //解析数据模板
  74. if ($el) {
  75. $el.append(html);
  76. (!$el.parent().length || container !== document.body) && $el.appendTo(container);
  77. } else {
  78. me.root($("<div></div>").append(html)).appendTo(container);
  79. }
  80. },
  81. _setup: function (fullMode) {
  82. var me = this,
  83. data = me._data,
  84. defTab = data.defTab,
  85. $el = me.root();
  86. if (!fullMode) {
  87. $el.children('a').addClass('ui-navigator-fix'); //smart模式针对内容添加样式
  88. $el.children('ul').addClass('ui-navigator-list');
  89. }
  90. $el.find('a').each(function (i) {
  91. defTab === 0 ? $(this).hasClass('cur') && (data.defTab = i) : $(this).removeClass('cur'); //处理同时defTab和写cur class的情况
  92. });
  93. },
  94. _init: function () {
  95. var me = this,
  96. data = me._data,
  97. $el = me.root(),
  98. content = data.content,
  99. $tabList = $el.find('a'); //包括fix的tab和可滑动的tab
  100. $tabList.each(function (i) {
  101. this.index = i;
  102. content.length && content[i].attr && $(this).attr(content[i].attr); //添加自己定义属性
  103. });
  104. data._$tabList = $tabList;
  105. data._lastIndex = -1;
  106. $el.addClass('ui-navigator').on('click', $.proxy(me._switchTabHandler, me));
  107. me.switchTo(data.defTab, true); //设置默认选中的tab
  108. },
  109. _switchTabHandler: function (e) {
  110. var me = this,
  111. target = e.target;
  112. $(target).closest('a').get(0) && me.switchTo(target.index, false, e);
  113. return me;
  114. },
  115. /**
  116. * @name switchTo
  117. * @desc 切换到某个tab
  118. * @grammar switchTo() ⇒ self
  119. * @example
  120. * $('#nav').navigator('switchTo', 1); //setup模式
  121. * var nav = $.ui.navigator(opts); //render模式
  122. * nav.switchTo(1);
  123. */
  124. switchTo: function (index, isDef, e) {
  125. var me = this,
  126. data = me._data,
  127. lastIndex = data._lastIndex,
  128. $tabList = data._$tabList,
  129. beforeSelectEvent = $.Event('beforetabselect');
  130. me.trigger(beforeSelectEvent, [$tabList[index]]);
  131. if (beforeSelectEvent.defaultPrevented) { //阻止默认事件
  132. e && e.preventDefault(); //若是程序调switchTo,则直接return,若点击调用则preventDefault
  133. return me;
  134. };
  135. //点击同一个tab,若是程序调switchTo,则直接return,若点击调用则preventDefault
  136. if (lastIndex == index) {
  137. e && e.preventDefault();
  138. return me;
  139. } //当选中的是同一个tab时,直接返回
  140. lastIndex >= 0 && $tabList.eq(lastIndex).removeClass("cur"); //修改样式放在跳转后边
  141. $tabList.eq(index).addClass("cur");
  142. data._lastIndex = index;
  143. return me.trigger('tabselect', [$tabList.get(index), index]);
  144. },
  145. /**
  146. * @name getCurTab
  147. * @desc 切换到某个tab
  148. * @grammar getCurTab() ⇒ tab obj
  149. * @example
  150. * $('#nav').navigator('getCurTab'); //setup模式
  151. * var nav = $.ui.navigator(opts); //render模式
  152. * nav.getCurTab(); //返回当前tab信息,包括index和当前tab elem
  153. */
  154. getCurTab: function () {
  155. var me = this,
  156. data = me._data,
  157. lastIndex = data._lastIndex;
  158. return {
  159. index: lastIndex,
  160. info: data._$tabList[lastIndex]
  161. }
  162. }
  163. });
  164. })(Zepto);