jquery.ui.accordion的修改(支持展开多个)
原文: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文档。
(function ($) {
$.widget('ui.multiAccordion', {
options: {
active: 0,
showAll: null,
hideAll: null,
_classes: {
accordion: 'ui-accordion ui-widget ui-helper-reset ui-accordion-icons',
h3: 'ui-accordion-header ui-helper-reset ui-state-default ui-corner-all',
div: 'ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom',
divActive: 'ui-accordion-content-active',
span: 'ui-icon ui-icon-triangle-1-e',
stateDefault: 'ui-state-default',
stateHover: 'ui-state-hover'
}
},
_create: function () {
var self = this,
options = self.options,
$this = self.element,
$h3 = $this.children('h3'),
$div = $this.children('div');
$this.addClass(options._classes.accordion);
$h3.each(function (index) {
var $this = $(this);
$this.addClass(options._classes.h3).prepend('<span class="{class}"></span>'.replace(/{class}/, options._classes.span));
if (self._isActive(index)) {
self._showTab($this)
}
}); // end h3 each
$this.children('div').each(function (index) {
var $this = $(this);
$this.addClass(options._classes.div);
}); // end each
$h3.bind('click', function (e) {
// preventing on click to navigate to the top of document
e.preventDefault();
var $this = $(this);
var ui = {
tab: $this,
content: $this.next('div')
};
self._trigger('click', null, ui);
if ($this.hasClass(options._classes.stateDefault)) {
self._showTab($this);
} else {
self._hideTab($this);
}
});
$h3.bind('mouseover', function () {
$(this).addClass(options._classes.stateHover);
});
$h3.bind('mouseout', function () {
$(this).removeClass(options._classes.stateHover);
});
// triggering initialized
self._trigger('init', null, $this);
},
// destroying the whole multi open widget
destroy: function () {
var self = this;
var $this = self.element;
var $h3 = $this.children('h3');
var $div = $this.children('div');
var options = self.options;
$this.children('h3').unbind('click mouseover mouseout');
$this.removeClass(options._classes.accordion);
$h3.removeClass(options._classes.h3).removeClass('ui-state-default ui-corner-all ui-state-active ui-corner-top').children('span').remove();
$div.removeClass(options._classes.div + ' ' + options._classes.divActive).show();
},
// private helper method that used to show tabs
_showTab: function ($this) {
var $span = $this.children('span.ui-icon');
var $div = $this.next();
var options = this.options;
$this.removeClass('ui-state-default ui-corner-all').addClass('ui-state-active ui-corner-top');
$span.removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s');
$div.slideDown('fast', function () {
$div.addClass(options._classes.divActive);
});
var ui = {
tab: $this,
content: $this.next('div')
}
this._trigger('tabShown', null, ui);
},
// private helper method that used to show tabs
_hideTab: function ($this) {
var $span = $this.children('span.ui-icon');
var $div = $this.next();
var options = this.options;
$this.removeClass('ui-state-active ui-corner-top').addClass('ui-state-default ui-corner-all');
$span.removeClass('ui-icon-triangle-1-s').addClass('ui-icon-triangle-1-e');
$div.slideUp('fast', function () {
$div.removeClass(options._classes.divActive);
});
var ui = {
tab: $this,
content: $this.next('div')
}
this._trigger('tabHidden', null, ui);
},
// helper method to determine wether passed parameter is an index of an active tab or not
_isActive: function (num) {
var options = this.options;
// if array
if (typeof options.active == "boolean" && !options.active) {
return false;
} else {
if (options.active.length != undefined) {
for (var i = 0; i < options.active.length; i++) {
if (options.active[i] == num)
return true;
}
} else {
return options.active == num;
}
}
return false;
},
// return object contain currently opened tabs
_getActiveTabs: function () {
var $this = this.element;
var ui = [];
$this.children('div').each(function (index) {
var $content = $(this);
if ($content.is(':visible')) {
//ui = ui ? ui : [];
ui.push({
index: index,
tab: $content.prev('h3'),
content: $content
});
}
});
return (ui.length == 0 ? undefined : ui);
},
getActiveTabs: function () {
var el = this.element;
var tabs = [];
el.children('div').each(function (index) {
if ($(this).is(':visible')) {
tabs.push(index);
}
});
return (tabs.length == 0 ? [-1] : tabs);
},
// setting array of active tabs
_setActiveTabs: function (tabs) {
var self = this;
var $this = this.element;
if (typeof tabs != 'undefined') {
$this.children('div').each(function (index) {
var $tab = $(this).prev('h3');
if (jQuery.inArray(index, tabs) != -1) {
self._showTab($tab);
} else {
self._hideTab($tab);
}
});
}
},
// active option passed by plugin, this method will read it and convert it into array of tab indexes
_generateTabsArrayFromOptions: function (tabOption) {
var tabs = [];
var self = this;
var $this = self.element;
var size = $this.children('h3').size();
if ($.type(tabOption) === 'array') {
return tabOption;
} else if ($.type(tabOption) === 'number') {
return [tabOption];
} else if ($.type(tabOption) === 'string') {
switch (tabOption.toLowerCase()) {
case 'all':
var size = $this.children('h3').size();
for (var n = 0; n < size; n++) {
tabs.push(n);
}
return tabs;
break;
case 'none':
tabs = [-1];
return tabs;
break;
default:
return undefined;
break;
}
}
},
// required method by jquery ui widget framework, used to provide the ability to pass options
// currently only active option is used here, may grow in the future
_setOption: function (option, value) {
$.Widget.prototype._setOption.apply(this, arguments);
var el = this.element;
switch (option) {
case 'active':
this._setActiveTabs(this._generateTabsArrayFromOptions(value));
break;
case 'getActiveTabs':
var el = this.element;
var tabs;
el.children('div').each(function (index) {
if ($(this).is(':visible')) {
tabs = tabs ? tabs : [];
tabs.push(index);
}
});
return (tabs.length == 0 ? [-1] : tabs);
break;
}
}
});
})(jQuery);

jquery.ui.accordion的修改(支持展开多个)的更多相关文章
- Jquery UI accordion手风琴菜单
最近学习jQuery,总结了一些心得. 1.引用 <script type="text/javascript" src=jquery.js></script> ...
- boostrap折叠,jquery ui accordion同时打开多个标签
http://caibaojian.com/bootstrap/javascript.html http://www.w3cschool.cc/jqueryui/example-accordion.h ...
- Touch Punch在移动设备上面增加jQuery UI的触摸支持|Jquery UI 支持移动端 触摸滑动等
jQuery UI是我们前台开发常用的UI前端类库,但是目前的jQuery UI用户界面类库在互动和widget上并不支持touch事件.这意味着你在桌面上设计的优雅的UI可能在触摸设备,例如,ipa ...
- 通过扩展jQuery UI Widget Factory实现手动调整Accordion高度
□ 实现Accordion高度一致 <head> <meta name="viewport" content="width=device-width&q ...
- JQUERY插件学习之jQuery UI
jQuery UI:http://jqueryui.com/ jQuery UI介绍: jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互 ...
- [转载]jQuery UI 使用
最近项目中使用了一些插件来做页面,这里把jQuery UI的使用分享出来,希望 对新手有帮助.文章结尾附源码下载. 1 jQuery UI 2 为我所用 2.1 Tabs 2. ...
- 关于jQuery UI 使用心得及技巧
1 jQuery UI 有时你仅仅是为了实现一个渐变的动画效果而不得不把javascrip 重新学习一遍然后书写大量代码.直到jQuery的出现,让开发人员从一大堆繁琐的js代码中解脱,取而代之几行j ...
- jQuery UI简单的讲解
我们先进入一下问答时间,你都知道多少呢? (1)什么是jQuery UI 呢? 解答:jQuery UI 是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互. ...
- jquery ui的css设计
jquery ui 是当前最强大的UI库之一,其两大卖点是对IE6的良好支持与换肤功能.为了构建avalon ui,今天起我将投入一部分精力来研究时下最流行的几个CSS框架.它是首当其冲. jquer ...
随机推荐
- VC 2005 解决方案的目录结构设置和管理
VC 2005 解决方案的目录结构设置和管理 Roger (roger2yi@gmail.com) 一个中等规模的解决方案通常都会包含多个项目,其中一些项目产出静态库,一些产出动态库,一些用于 ...
- C#的静态构造函数
“静态构造函数”典型应用于第一次使用类时的初始化工作,注意“第一次”,意思是它只执行一次. 有同学说了,类的初始化不是有构造函数嘛?我们回答:构造函数是每个实例被声明时都会执行的,它属于每一个实例,而 ...
- USACO inflate
全然背包,转化为0/1背包 dp[i, j] = max(dp[i-1, j], dp[i, j - minutes[i]] + points[i]) /* ID:kevin_s1 PROG:infl ...
- Python Challenge 第四题
这一题没有显示提示语,仅仅有一幅图片,图片也看不出什么名堂,于是直接查看源代码,源代码例如以下: <html> <head> <title>follow the c ...
- 学习算法-基数排序(radix sort)卡片分类(card sort) C++数组实现
基数排序称为卡片分类,这是一个比较早的时间越多,排名方法. 现代计算机出现之前,它已被用于排序老式打孔卡. 说下基数排序的思想.前面我有写一个桶式排序,基数排序的思想是桶式排序的推广. 桶式排序:ht ...
- Android SurfaceView实现静态于动态画图效果
本文是基于Android的SurfaceView的动态画图效果,实现静态和动态下的正弦波画图,可作为自己做图的简单参考,废话不多说,先上图, 静态效果: 动态效果: 比较简单,代码注释的也比较详细,易 ...
- MIPI CSI-2规范一——概述及层级
MIPI CSI-2规范一——概述及层级 CSI-2概述 CSI-2规范定义了发送者和接收者之间传输和控制接口的标准数据.数据传输接口(指CSI-2)是单向差分串行接口,传输数据和始终信号:接口的物理 ...
- ASP.NET - 后台获取按钮绑定的值CommandArgument
<asp:LinkButton runat="server" ID="resumelbtn" CommandArgument='<%# Eval(& ...
- 【linux】开发环境说明
欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...
- MapReduce/Hbase进阶提升(原理剖析、实战演练)
什么是MapReduce? MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归约)",和他们 ...