YUI实现的Tab切换

2009年02月15日 | 6,166 次浏览 | 标签: , , | 4条评论  

YUI自带了一个TabView,尽管很强大,但在实际使用中,常常无法满足多变的需求。Tab切换应该不依赖于Javascript生成,也不要对HTML结构进行约束,能给设计人员和前端开发最大的灵活性,同时利于SEO。原理:一个tab对象分为控制部分(trigger),内容部分(sheet)。当trigger被触发时,显示对应的sheet。

以前大树写过一个TabControl的代码,经过两年的使用依旧很靠谱,说明当初这个思路还是比较符合实际需求的。这里我改成了基于YUI的版本,看起来更清晰一些。先访问测试页面查看效果,完整javascript代码在这里

注意:改成实际代码时,请将Tab类放在某个命名空间下,不要直接暴露在全局空间中。

1:使用
以下是常用的html结构,但不限于此。

  • t1
  • t2
  • t3
s1
s2
s3

对应的javascript代码如下,四种初始化方法都是可以的。

// 1
var tab = new Tab($D.get('t').getElementsByTagName('li'), $D.get('s').getElementsByTagName('div'));
// 2
var tab = new Tab(['t1','t2', 't3'],['s1','s2', 's3']);
// 3
var tab = new Tab(['t1','t2','t3'],['s1','s2','s3'],{ triggerEvent:'mouseover',slideEnabled:true});
// 4
var tab = new Tab();
tab.add('t1', 's1');
tab.add('t2', 's2');
tab.add('t3', 's3');
tab.config['triggerEvent'] = 'mouseover';
tab.config['slideEnabled'] = true;
tab.onShow.subscribe(function(t, a){ ... });
tab.init();

2:扩展
已经实现自动切换功能(默认关闭),另外可以通过onShow自定义事件扩展,也可以在原代码基础上添加更多的自定义事件。

相关文章

评论(4)

  1. 明城 发表于2009年03月10日 11:04 pm

    看了下代码,很不错哦,有几个小建议

    1,给 mouseover 事件加个延时,防止用户树胶经过时误触发
    2,既然用 YUI,可以参考使用 namespaces、later 以及其他 YUI 的些属性
    3,接上 2 的,tab 扔到闭包外面我差点以为是故意全局变量,但实际上它的作用域是 window.Tab 不适合组件开发
    4,结构个人感觉有点臃肿,虽然问题不大 :^)

  2. Pan 发表于2009年03月11日 10:59 pm

    @明城
    1. 这个有空应该加上
    2.3. 因为本身不复杂,所以只使用了一些辅助函数和customEvent。我在文中已经说了“注意:改成实际代码时,请将Tab类放在某个命名空间下,不要直接暴露在全局空间中。”,这个代码是个示例,实际使用的时候Tab不会是全局变量的。
    4. 代码肯定还可以改进的,但是使用中还没出什么大问题,所以也没有必要提前优化。

    多谢建议:)

  3. lanqy 发表于2009年03月29日 11:52 pm

    我在研究饭否http://fanfou.com/finder这个页面的时候,也曾看到过这个代码,原来是你写的

    呵呵

  4. 嗰個人 发表于2009年06月15日 5:14 pm

    可以不局限 HTML 結構——這個好。
    但,要如何結合YUI 3 來用呢?
    YUI3本身就可以Y.get(idname)了。

Trackbacks(2)

  • 2010/04/09 - 一个js的tab切换

    [...] 看了此文(YUI实现的Tab 切换),有感而发,写了一个tab切换的函数,做学习之用。原生js实现,因为框架不好玩。 [...]

  • 2010/08/30 - 第十一期web标准交流会总结 | 潘魏增

    [...] 然后是来自新浪的阿当分享了他对tab选项卡的实践和思考过程。tab是前端开发用得最多的功能组件之一,抽象过程虽然简单,但写好并不容易。因为之前我对tab也有一些经验和想法,在阿当的QA环节,我分享了自己对tab的抽象过程和实现原理。之后来自遨游的赵锦江、百度的月影、百度的rank都对这个主题进行了补充,讨论非常精彩。 [...]

发表评论

最受欢迎

评论最多