一个选项卡的进化史

很久以前因为看别人的js选项卡代码从而步入javascript的美丽大门,现在我也小小的写一个小的教程,但愿能帮助道对js困惑的朋友。

一、结构

使用合理的HTML结构是javascript UI组件优雅的最重要条件之一,这里使用dl、dt、dd构建选项卡结构(js罗浮宫讨论成果,见司徒正美:jquery tabs插件)


以下为引用的内容:

<dl class="artTabs">
<dt id="tabs"><a href="#tabContent1" class="select">link1</a> <a href="#tabContent2">link2</a> <a href="#tabContent3">link3</a></dt>
<dd id="tabContent1" style="display:block">tabContent1</dd>
<dd id="tabContent2">tabContent2</dd>
<dd id="tabContent3">tabContent3</dd>
</dl>

选项卡按钮的锚点都指向内容,这样在脚本与样式失效的情况下仍然能够进行基本的跳转。

二、编写核心javascript代码

接下来就是js编写。使用事件代理机制可以更加高效的处理业务,无需循环遍历操作去给每个按钮绑定事件,也能节省内存:


以下为引用的内容:

// 参数:选项卡按钮外包裹元素, 按钮选中的样式, 初始化选中的按钮索引值(以0开始)
var artTabs = function (bar, className, index) {
var gid = function (id) {return document.getElementById(id)},
buttons = bar.getElementsByTagName('a'),
selectButton = buttons[index],
showContent = gid(selectButton.href.split('#')[1]);

bar.onclick = function (event) {
event = event || window.event;
var target = event.target || event.srcElement;

if (target.nodeName.toLowerCase() === 'a') {
showContent.style.display = 'none';
showContent = gid(target.href.split('#')[1]);
showContent.style.display = 'block';
selectButton.className = '';
selectButton = target;
target.className = className;
return false;
};
};
};

是不是很小巧?以上代码压缩后貌似只有351字节:


以下为引用的内容:

var artTabs=function(b,c,i,a){var g=function(x){return document.getElementById(x)},s=b.getElementsByTagName('a'),n=s[i],o=g(n.href.split('#')[1]);b.onclick=function(e){e=e||window.e;a=e.target||e.srcElement;if(a.nodeName.toLowerCase()==='a'){o.style.display='none';o=g(a.href.split('#')[1]);o.style.display='block';n.className='';n=a;a.className=c;return false}}}

调用范例:artTabs(document.getElementById(‘tabs’), ‘select’, 0);

查看演示:artTabs1.html

三、优化接口

是否发现这个刚出炉的选项卡参数有点麻烦?如果要支持鼠标靠近触发怎么办?或者点击选项卡的时候要采用ajax加载填充内容要如何处理回调函数?

显然我们前面的API设计并不能优雅的处理这些需求,我们改用字面量的方式传入参数,增加一些新接口,如:


以下为引用的内容:

var artTabs = function (bar, config) {
var gid = function (id) {return document.getElementById(id)};

config = config || {};
var bar = typeof bar === 'string' ? gid(bar) : bar,
className = config.className || 'select',
callback = config.callback || function () {},
isMouseover = config.isMouseover,

buttons = bar.getElementsByTagName('a'),
selectButton = buttons[
config.index ||
function () {
var ret = 0;
for (i = 0; i < buttons.length; i++) {
if (buttons[i].className === className) ret = i;
};
return ret;
}()
],
showContent = gid(selectButton.href.split('#')[1]),
fn = function (event) {
event = event || window.event;
var target = event.target || event.srcElement;

if (target.nodeName.toLowerCase() === 'a') {
showContent.style.display = 'none';
showContent = gid(target.href.split('#')[1]);
showContent.style.display = 'block';
selectButton.className = '';
selectButton = target;
target.className = className;
target.focus();
callback(selectButton, showContent);
return false;
};
};

if (isMouseover) bar.onmouseover = fn;
bar.onclick = fn;// click事件至少能保证手持设备可以使用
};

调用范例:artTabs(‘tabs’);

查看演示:artTabs2.html

四、扩展

原生代码执行效率往往会比框架高,当然我们还是可以很简单写几行代码为jQuery献身,成为其插件:


以下为引用的内容:

jQuery.fn.artTabs = function (config) {
return this.each(function () {
artTabs(this, config);
});
};

调用范例:jQuery(‘.artTabs > dt’).artTabs();

查看演示:artTabs3.html

以上实现了选项卡最基本的功能,如果需要可以连选项卡HTML结构都封装进去、历史记录支持、URL记忆支持、Ajax数据加载支持等……

时间: 2024-09-27 09:54:50

一个选项卡的进化史的相关文章

怎么在Excel2003菜单栏自定义一个选项卡

  怎么在Excel2003菜单栏自定义一个选项卡          ①启动Excel2003,单击菜单栏--工具--自定义. ②在自定义界面,我们单击命令标签,在类别中选择新菜单,鼠标左键按住新菜单,拖放到菜单栏中. ③拖进去之后,单击更改所选内容,重新定义选项名称. ④与上述步骤相似,我们下面把一些常用的操作拖放到新菜单的子菜单中去,这样就实现了我们的目的.

纯手工写的一个选项卡切换

下面这个标签是关键所在,共有5个参数,来赋予切换的功能. <input type="hidden" id="kp_OtherRegional" value="nav,li,cardarea,item,current_tab" /> 首先演示一下功能. 以下是HTML网页特效代码,点击运行按钮可查看效果: [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行] 已经封装好了的,如果你要使用,就把其中的js做成外部文件.实现,只需

一个js封装的不错的选项卡效果代码_javascript技巧

复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title> 选项卡效果 www.jb51.net</title&

java的setlayout(null),选项卡组件不显示

问题描述 java的setlayout(null),选项卡组件不显示 我这里有一个继承jpanel的类 其中setlayout(null),我添加了一个跑马灯的组件和一个选项卡组件,并且我都用了setbounds,可是我的跑马灯能够正常显示而选项卡不能显示如果把setlayout删除则跑马灯和选项卡都能显示出来,可是这时候的位置是固定的无法进行修改我把代码拷贝一下请大神们修改一下,谢谢 package gui.logon; import gui.frame.SystemFrame; import

Firebug技巧:脚本调试,选项卡和CSS调试

脚本调试 第一步:设置中断(鼠标左键点击) 第二步:输入中断条件(可选功能,鼠标右键点击红点) 第三步:触发中断(当符合条件是,中断被触发) 出现中断后,我们可以看到在右边出现了这样一个选项卡[监控.堆栈.断点]

Chrome浏览器打不开网站或打开网站慢的一个解决方法

Chrome浏览器的一个默认设置,有时会导致一些网站打不开或者打开速度慢. 单击Chrome浏览器地址栏右侧的三个小点,"设置"→"显示高级设置"→"隐私设置",其中的"保护您和您的设备不受危险网站的侵害"这个选项默认是开启的,如下图: 选中了"保护您和您的设备不受危险网站的侵害"这个选项,会有一部分网页打不开或者打开慢的现象出现. 现在有很多种杀毒软件,并且都是免费的.如今,杀毒软件已经成为免费的公共基础

Ajax改造,第3部分:用jQuery、Ajax选项卡和照片carousel改进现有的站点

Ajax 技术已经改变了大型商用 Web 应用程序的面貌,但是许多小型 Web 站点不具备重新构建整个用户界面所需的资源.新特性应该能够解决现实的界面问题并改进用户体验,以此证明它们的价值.本系列讲解如何用开放源码的客户端库逐步改进用户界面.在本期中,学习如何使用 DHTML 和 Ajax 把缓慢.混乱.烦人的产品细节页面改造成快速优雅的页面.我们将采用渐进式改进方法,从而确保所有用户代理仍然能够访问您的站点. 关于本文 本文讲解用 Ajax 技术改进一个 Web 1.0 购物站点的步骤.可以

[JAVA100例]015、选项卡

import javax.swing.JTabbedPane; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JFrame; /** * <p>Title: 选项卡演示</p> * <p>Description: 这里是一个选项卡演示,点击不同的卡片,显示的内容不同</p> * <p>Co

如何在IE9中快速切换到指定的选项卡页面

当我们在IE9窗口中同时打开大量的选项卡页面后,如何可以快速切换到最后一个选项卡页呢?方法很简单,我们只要使用快捷键"Ctrl"+"9"就可以了.另外使用快捷键"Ctrl"+"1~8"还可以快速切换至第1~8个选项卡.对于习惯于使用键盘进行操作的用户,这个组合键就非常有用了. 除了上面的方法,还可以使用"Ctrl"+"Q"快捷键打开"快速导航选项卡"功能对标签页进行控