一个简单oop的changeTab
好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件。以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想写了这个功能。
这里有两个文件change.js 和test.html,内容有注释,就直接上代码了。
js代码:
/*********查询节点是否包含某个样式*******/
var hasClass = function(tag, clsName) {
var arr = tag.className.split(/\s+/);
for (var i = 0; i < arr.length; i++) {
if (arr[i] == clsName) {
return true;
}
};
return false;
}
/*********扩展getElementsByClassName函数(兼容IE低版本)*********/
if (!document.getElementsByClassName) {
document.getElementsByClassName = function(cls) {
var nodeArr = [];
var nodes = document.getElementsByTagName('*');
if (nodes && nodes.length > 0) {
for (var i = 0; i < nodes.length; i++) {
if (hasClass(nodes[i], cls)) {
nodeArr.push(nodes[i]);
}
};
}
return nodeArr;
}
} var changeTab = function(option) {
// body...
this.Init.apply(this, arguments);
} changeTab.prototype = {
/********参数的初始化********/
Init: function() {
var arr = Array.prototype.slice.call(arguments);
this.option = arr[0] || {
inittab: 0, //设置选中的tab索引
tab: '', //tab的className
tabclass: '', //tab点击之后的样式
container: '' //div的className
}; },
/*************函数执行**************/
render: function() {
///获取要操作的tab和div
this.tabs = document.getElementsByClassName(this.option.tab);
this.contents = document.getElementsByClassName(this.option.container);
if (this.tabs.length == 0 || this.contents.length == 0) {
return;
}
if (this.tabs.length != this.contents.length) {
return;
}
var that = this; ///由于闭包要用到此函数的参数,作用域不一致,所以要用that指向当前的函数
////设置初始显示的tab和div内容
this.contents[this.option.inittab].style.display = 'block';
this.tabs[this.option.inittab].className = that.option.tab + ' ' + that.option.tabclass;
for (var i = 0; i < this.tabs.length; i++) {
/////闭包
(function(num) {
that.tabs[num].onclick = function() {
for (var k = 0; k < that.contents.length; k++) {
///隐藏所有div和去除所有tab样式
that.contents[k].style.display = 'none';
that.tabs[k].className = that.option.tab;
};
///显示和设置当前点击的tab和div内容
this.className = that.option.tab + ' ' + that.option.tabclass;
that.contents[num].style.display = 'block';
}
})(i);
}
},
/*************为函数扩展功能**************/
extend: function(obj) {
if (obj && Object.prototype.toString.call(obj) == "[object Object]") {
for (prop in obj) {
this[prop] = obj[prop];
}
}
}
}
html代码:
<html>
<style type="text/css">
.current { background-color: red; }
.dv { background-color: green; width: 200px; height: 200px; }
</style>
<head>
<script type="text/javascript" src="change.js"></script>
<script type="text/javascript">
window.onload=function () { // body...
var tb=new changeTab( { inittab: 0, tab:'sp', tabclass:'current', container:'dv' });
tb.render();
}
</script>
</head>
<body> <div>
<span class="sp" >111</span>
<span class="sp">222</span>
<span class="sp">333</span>
</div>
<div id="">
<div class="dv" style="display: none; ">dv1</div>
<div class="dv" style="display: none; ">dv2</div>
<div class="dv" style="display: none; ">dv3</div>
<div>
</body>
</html>
由于页面设计能力有限,所以就写了比较简单的样式。大家主要看一下功能,有什么问题或者建议可以直接q我。
一个简单oop的changeTab的更多相关文章
- 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)
一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面
前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...
- 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...
- 如何开发一个简单的HTML5 Canvas 小游戏
原文:How to make a simple HTML5 Canvas game 想要快速上手HTML5 Canvas小游戏开发?下面通过一个例子来进行手把手教学.(如果你怀疑我的资历, A Wiz ...
- CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...
- CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator
CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...
- 应用OpenMP的一个简单的设计模式
小喵的唠叨话:最近很久没写博客了,一是因为之前写的LSoftmax后馈一直没有成功,所以在等作者的源码.二是最近没什么想写的东西.前两天,在预处理图片的时候,发现处理200w张图片,跑了一晚上也才处理 ...
随机推荐
- 数据库插入数据返回当前主键ID值方法
当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用.我们通常的做法有如下几种: 1. 先 select max(id) +1 ,然后将+1后的值作为主键插入数据库: 2. ...
- .Net语言 APP开发平台——Smobiler学习日志:如何快速实现地图定位时的地点微调功能
Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 二.地点微调代码 VB: Dim ...
- solr添加多个core
在D:\solr\solr_web\solrhome文件夹下: 1)创建core0文件夹 2)复制D:\solr\solr_web\solrhome\configsets\basic_configs/ ...
- 深入理解 RESTful Api 架构
转自https://mengkang.net/620.html 一些常见的误解 不要以为 RESTful Api 就是设计得像便于 SEO 的伪静态,例如一个 Api 的 URL 类似于 http: ...
- 图片的赖加载(lazyLoad)
懒加载的意义(在线demo预览) 尽管很多公司的网页都有一些限制,比如页面的最大的图片大小不得大于50k,也有很多图片优化工具fis3.gulp等等,但是如果图片太多还是会影响页面的加载速度,快则几十 ...
- Hadoop学习日志- install hadoop
资料来源 : http://www.tutorialspoint.com/hadoop/hadoop_enviornment_setup.htm Hadoop 安装 创建新用户 $ su passwo ...
- Oracle研究专题:Oracle系统安装与配置
最近开始研究Oracle数据库,盖因公司的系统要么Oracle要么是mysql吧. 作为一个IT工作者,没有碰过Oracle是一件很匪夷所思得事情. 想到过去几年,乃至接触IT行业开始就只有玩过sql ...
- 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY
转载自: 数据库管理工具GUI - PremiumSoft Navicat Premium Enterprise 11.2.15 x86/x64 KEY Navicat Premium(数据库管理工具 ...
- java socket传送一个结构体给用C++编写的服务器解析的问题
另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组.解决方法:c++/c socket 在发送结构体的时候其实发送的也是字 ...
- 数据备份的OSS接口
最近在做一个新的项目,从RDS备份到OSS,进行数据备份以及后续的还原.这边对阿里云的OSS数据上传接口进行说明,先做下笔记先简单介绍下OSS: ①Object 在OSS中,用户操作的基本数据单元是O ...