原文:jquery.ui.accordion的修改(支持展开多个)

背景:原jquery.ui.accordion插件,最多只能展开一个,不能展开多个,后来在网上找到了一个基于它的一个修改版(https://code.google.com/p/jquery-multi-open-accordion/),但使用后发现它给Array加了一个方法(Array.prototype.hasObject),这样就导致了一个问题:在其它页面使用js遍历一个数组的时候,发现此数组多了一个hasObject值。故做了下修改,希望写JS的prototype不要乱用!!!!!!!!!!!!!

修改版如下:

注:$('#multiOpenAccordion').multiAccordion("option", "active", "all");用set的方式写,all和none才会和效!此插件怎么用,请参考jquery UI文档。

  1. (function ($) {
  2.  
  3. $.widget('ui.multiAccordion', {
  4. options: {
  5. active: 0,
  6. showAll: null,
  7. hideAll: null,
  8. _classes: {
  9. accordion: 'ui-accordion ui-widget ui-helper-reset ui-accordion-icons',
  10. h3: 'ui-accordion-header ui-helper-reset ui-state-default ui-corner-all',
  11. div: 'ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom',
  12. divActive: 'ui-accordion-content-active',
  13. span: 'ui-icon ui-icon-triangle-1-e',
  14. stateDefault: 'ui-state-default',
  15. stateHover: 'ui-state-hover'
  16. }
  17. },
  18.  
  19. _create: function () {
  20. var self = this,
  21.  
  22. options = self.options,
  23.  
  24. $this = self.element,
  25.  
  26. $h3 = $this.children('h3'),
  27.  
  28. $div = $this.children('div');
  29.  
  30. $this.addClass(options._classes.accordion);
  31.  
  32. $h3.each(function (index) {
  33. var $this = $(this);
  34. $this.addClass(options._classes.h3).prepend('<span class="{class}"></span>'.replace(/{class}/, options._classes.span));
  35. if (self._isActive(index)) {
  36. self._showTab($this)
  37. }
  38. }); // end h3 each
  39.  
  40. $this.children('div').each(function (index) {
  41. var $this = $(this);
  42. $this.addClass(options._classes.div);
  43. }); // end each
  44.  
  45. $h3.bind('click', function (e) {
  46. // preventing on click to navigate to the top of document
  47. e.preventDefault();
  48. var $this = $(this);
  49. var ui = {
  50. tab: $this,
  51. content: $this.next('div')
  52. };
  53. self._trigger('click', null, ui);
  54. if ($this.hasClass(options._classes.stateDefault)) {
  55. self._showTab($this);
  56. } else {
  57. self._hideTab($this);
  58. }
  59. });
  60.  
  61. $h3.bind('mouseover', function () {
  62. $(this).addClass(options._classes.stateHover);
  63. });
  64.  
  65. $h3.bind('mouseout', function () {
  66. $(this).removeClass(options._classes.stateHover);
  67. });
  68.  
  69. // triggering initialized
  70. self._trigger('init', null, $this);
  71.  
  72. },
  73.  
  74. // destroying the whole multi open widget
  75. destroy: function () {
  76. var self = this;
  77. var $this = self.element;
  78. var $h3 = $this.children('h3');
  79. var $div = $this.children('div');
  80. var options = self.options;
  81. $this.children('h3').unbind('click mouseover mouseout');
  82. $this.removeClass(options._classes.accordion);
  83. $h3.removeClass(options._classes.h3).removeClass('ui-state-default ui-corner-all ui-state-active ui-corner-top').children('span').remove();
  84. $div.removeClass(options._classes.div + ' ' + options._classes.divActive).show();
  85. },
  86.  
  87. // private helper method that used to show tabs
  88. _showTab: function ($this) {
  89. var $span = $this.children('span.ui-icon');
  90. var $div = $this.next();
  91. var options = this.options;
  92. $this.removeClass('ui-state-default ui-corner-all').addClass('ui-state-active ui-corner-top');
  93. $span.removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
  94. $div.slideDown('fast', function () {
  95. $div.addClass(options._classes.divActive);
  96. });
  97. var ui = {
  98. tab: $this,
  99. content: $this.next('div')
  100. }
  101. this._trigger('tabShown', null, ui);
  102. },
  103.  
  104. // private helper method that used to show tabs
  105. _hideTab: function ($this) {
  106. var $span = $this.children('span.ui-icon');
  107. var $div = $this.next();
  108. var options = this.options;
  109. $this.removeClass('ui-state-active ui-corner-top').addClass('ui-state-default ui-corner-all');
  110. $span.removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
  111. $div.slideUp('fast', function () {
  112. $div.removeClass(options._classes.divActive);
  113. });
  114. var ui = {
  115. tab: $this,
  116. content: $this.next('div')
  117. }
  118. this._trigger('tabHidden', null, ui);
  119. },
  120.  
  121. // helper method to determine wether passed parameter is an index of an active tab or not
  122. _isActive: function (num) {
  123. var options = this.options;
  124. // if array
  125. if (typeof options.active == "boolean" && !options.active) {
  126. return false;
  127. } else {
  128. if (options.active.length != undefined) {
  129. for (var i = 0; i < options.active.length; i++) {
  130. if (options.active[i] == num)
  131. return true;
  132. }
  133. } else {
  134. return options.active == num;
  135. }
  136. }
  137. return false;
  138. },
  139.  
  140. // return object contain currently opened tabs
  141. _getActiveTabs: function () {
  142. var $this = this.element;
  143. var ui = [];
  144. $this.children('div').each(function (index) {
  145. var $content = $(this);
  146. if ($content.is(':visible')) {
  147. //ui = ui ? ui : [];
  148. ui.push({
  149. index: index,
  150. tab: $content.prev('h3'),
  151. content: $content
  152. });
  153. }
  154. });
  155. return (ui.length == 0 ? undefined : ui);
  156. },
  157.  
  158. getActiveTabs: function () {
  159. var el = this.element;
  160. var tabs = [];
  161. el.children('div').each(function (index) {
  162. if ($(this).is(':visible')) {
  163. tabs.push(index);
  164. }
  165. });
  166. return (tabs.length == 0 ? [-1] : tabs);
  167. },
  168.  
  169. // setting array of active tabs
  170. _setActiveTabs: function (tabs) {
  171. var self = this;
  172. var $this = this.element;
  173. if (typeof tabs != 'undefined') {
  174. $this.children('div').each(function (index) {
  175. var $tab = $(this).prev('h3');
  176. if (jQuery.inArray(index, tabs) != -1) {
  177. self._showTab($tab);
  178. } else {
  179. self._hideTab($tab);
  180. }
  181. });
  182. }
  183. },
  184.  
  185. // active option passed by plugin, this method will read it and convert it into array of tab indexes
  186. _generateTabsArrayFromOptions: function (tabOption) {
  187. var tabs = [];
  188. var self = this;
  189. var $this = self.element;
  190. var size = $this.children('h3').size();
  191. if ($.type(tabOption) === 'array') {
  192. return tabOption;
  193. } else if ($.type(tabOption) === 'number') {
  194. return [tabOption];
  195. } else if ($.type(tabOption) === 'string') {
  196. switch (tabOption.toLowerCase()) {
  197. case 'all':
  198. var size = $this.children('h3').size();
  199. for (var n = 0; n < size; n++) {
  200. tabs.push(n);
  201. }
  202. return tabs;
  203. break;
  204. case 'none':
  205. tabs = [-1];
  206. return tabs;
  207. break;
  208. default:
  209. return undefined;
  210. break;
  211. }
  212. }
  213. },
  214.  
  215. // required method by jquery ui widget framework, used to provide the ability to pass options
  216. // currently only active option is used here, may grow in the future
  217. _setOption: function (option, value) {
  218. $.Widget.prototype._setOption.apply(this, arguments);
  219. var el = this.element;
  220. switch (option) {
  221. case 'active':
  222. this._setActiveTabs(this._generateTabsArrayFromOptions(value));
  223. break;
  224. case 'getActiveTabs':
  225. var el = this.element;
  226. var tabs;
  227. el.children('div').each(function (index) {
  228. if ($(this).is(':visible')) {
  229. tabs = tabs ? tabs : [];
  230. tabs.push(index);
  231. }
  232. });
  233. return (tabs.length == 0 ? [-1] : tabs);
  234. break;
  235. }
  236. }
  237.  
  238. });
  239. })(jQuery);

 

jquery.ui.accordion的修改(支持展开多个)的更多相关文章

  1. Jquery UI accordion手风琴菜单

    最近学习jQuery,总结了一些心得. 1.引用 <script type="text/javascript" src=jquery.js></script> ...

  2. boostrap折叠,jquery ui accordion同时打开多个标签

    http://caibaojian.com/bootstrap/javascript.html http://www.w3cschool.cc/jqueryui/example-accordion.h ...

  3. Touch Punch在移动设备上面增加jQuery UI的触摸支持|Jquery UI 支持移动端 触摸滑动等

    jQuery UI是我们前台开发常用的UI前端类库,但是目前的jQuery UI用户界面类库在互动和widget上并不支持touch事件.这意味着你在桌面上设计的优雅的UI可能在触摸设备,例如,ipa ...

  4. 通过扩展jQuery UI Widget Factory实现手动调整Accordion高度

    □ 实现Accordion高度一致 <head> <meta name="viewport" content="width=device-width&q ...

  5. JQUERY插件学习之jQuery UI

    jQuery UI:http://jqueryui.com/ jQuery UI介绍: jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互 ...

  6. [转载]jQuery UI 使用

    最近项目中使用了一些插件来做页面,这里把jQuery UI的使用分享出来,希望 对新手有帮助.文章结尾附源码下载. 1     jQuery UI 2     为我所用 2.1     Tabs 2. ...

  7. 关于jQuery UI 使用心得及技巧

    1 jQuery UI 有时你仅仅是为了实现一个渐变的动画效果而不得不把javascrip 重新学习一遍然后书写大量代码.直到jQuery的出现,让开发人员从一大堆繁琐的js代码中解脱,取而代之几行j ...

  8. jQuery UI简单的讲解

    我们先进入一下问答时间,你都知道多少呢? (1)什么是jQuery UI 呢? 解答:jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互. ...

  9. jquery ui的css设计

    jquery ui 是当前最强大的UI库之一,其两大卖点是对IE6的良好支持与换肤功能.为了构建avalon ui,今天起我将投入一部分精力来研究时下最流行的几个CSS框架.它是首当其冲. jquer ...

随机推荐

  1. linux命令:scp

    有时候ftp被禁用了, 就用scp替代; 命令行: scp from to_user@to_ip:dir_to/file_name 执行该命令之后,按照提示输入to_host的登陆密码即可. scp ...

  2. C++ 需要返回值的函数却没有返回值的情况 单例模式

    昨天在看前些天写的代码,发现一个错误. #include <iostream> using namespace std; class singleton { public: static ...

  3. TinkPHP+WAMP

    1.下载wamp 我下载的是php5.5版本:根据你自身的需要嘛 http://www.wampserver.com/ 2.下载thinkphp 我下载的版本是3.2 http://www.think ...

  4. xcode6 中增加SDWebImage/SDWebImageDownloaderOperation.m报错解决方法

    报错报错:Use of undeclared identifier '_executing' / '_finished': 解决方法例如以下:

  5. .NET常见面试题

    面试题 1  什么是 CTS.CLS 和CLR 公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库. 通用类型系统(CTS)包含在微软公司提交的 CLI ...

  6. CodeForces 370C. Mittens

    C. Mittens time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  7. span设置固定宽度

    <span> 标签是被用来组合文档中的行内元素.相信对一般的网页设计师来讲是非常熟悉的朋友了,使用相当频繁,但我们往往很少对SPAN设定样式,一般也没什么必要,大多数都留给DIV老朋友了. ...

  8. 基于visual Studio2013解决面试题之0202上下排

     题目

  9. Eclipse无提示的解决办法 和 内容辅助技巧

    Eclipse无提示的解决办法 和 内容辅助技巧 一.若发现内容辅助失效没有提示 下面是解决办法,现贴出来与大家共享:       1.菜单window->Preferences->Jav ...

  10. Ext JS4百强应用:设置textfield的悬浮提示信息 --第8强

    在Extjs4中有时候我们需要textfield的提示信息,但是我们发现textfield并没有这样的配置项. 这时候我们就要另想方法:我们需要在鼠标悬停在textfield组件的时候进行信息的提示, ...