不久之前做一个项目时,我发现了一件非常蛋疼的事:一个页面上有几个Tab切换效果,最多的时候会有4个,(类似于网易首页),但我对批量重用函数实在是没经验,从没写过,于是我的解决办法是复制一个tab函数,如果有4个就得复制4次,但这几个函数功能是完全相同的.这让我相当不满意,因为这本来是可以避免的事,正常情况下应该是写一个函数,然后在有第2个需要调用的时候

var t=new Tabs($('tab1'));

一下就行了.

这几天有幸来到了博客园,看到了很多高手的文章,所以琢磨着自己写一个可以重用的Tab类.但在后期碰到了百思不得其解的问题,特来求指导.先给出代码:

        var $=function(id){return (typeof id == "Object") ? id : document.getElementById(id);};var $$=function(tag,elm){return elm.getElementsByTagName(tag);};var $C=function(cn,tag,elm){if(!tag) tag='*';var ts = $$(tag,elm);var classArr = [];var filter = new RegExp("(^|\\s)"+cn+"(\\s|$)");for(var i=0,l=ts.length;i<l;i++){if(filter.test(ts[i].className)){classArr.push(ts[i]);}}return classArr;}var cutover=function(arr,cur,c1,c0){for(var i=0,l=arr.length;i<l;i++){arr[i].className = (i ==cur) ? c1 : c0;}}var addEvent = function (elm, evType, fn, useCapture) {if (elm.addEventListener) {elm.addEventListener(evType, fn, useCapture);//DOM2.0return true;}else {var r = elm.attachEvent('on' + evType, fn);//IE5+return r;}}var Tabs = function (elm){//用传入的选项代替默认选项for(var r in arguments[1]){this.items[r] = arguments[1][r];}//alert(this.items.elm.innerHTML);this.tabhd = $C(this.items.cnhd,this.items.hdtag,elm)[0];this.tabtag = this.tabhd.children;this.tabbd = $C(this.items.cnbd,this.items.bdtag,elm)[0];this.tabcon = this.tabbd.children;if(this.tabtag.length != this.tabcon.length) {alert('Tab标签个数与内容个数不匹配');return true;}//添加切换事件this.ini(this);}//修改对象的原型prototype,将函数加在里面,可以实现N个对象都共用一个方法,避免资源浪费Tabs.prototype = {items:{//默认选项hdtag:'DIV',cnhd:'tabhd',cntag:'cur',cntagno:'',bdtag:'DIV',cnbd:'tabbd',bdcur:'cur',bdno:'no'//最后一个元素后的,一定要去掉,不然IE会报错},ini:function(o){for(var i=0,l=o.tabtag.length;i<l;i++){/**/o.tabtag[i].go = i;o.tabtag[i].onmouseover = function(){cutover(o.tabtag,this.go,o.items.cntag,o.items.cntagno);cutover(o.tabcon,this.go,o.items.bdcur,o.items.bdno);}}},run:function(t){this.time = t;}};

本来刚开始一切正常,但在加切换事件时(代码中的ini函数),在tabtag[i].onmouseover上的function内无法访问到this.tabtag等对象,提示this.tabtag为undefined.原因估计是因为此时的this被指向了onmouseover本身,而不是本来的Tabs了.

我也试过几种解决办法,比如把this.tabtag之类的重定义为var tabtag形式的,但这样一来所有prototype内的函数都不能访问tabtag了,比上面的情况更郁闷.

所以只有把ini设为带参数的函数,然后在调用的时候把Tabs当成this传过去,就成了现在这样子.但感觉很别扭,肯定有更好的解决办法的.我还是对照着cloudgamer大人的一个例子写的,但奇怪的他的例子能行我的就不行,小弟表示真的非常困惑.

现在的情况是,这函数的确可用,而且可重用,但就是有一个别扭的ini函数在里面,非常不爽

求路过看过的高手指点小弟两招吧,怎么才能让Tabs里的所有this不论层级都指向Tabs本身呢?我以上的代码有什么不对之处呢?

转载于:https://www.cnblogs.com/lixlib/archive/2011/03/17/tabs-class-js-lixlib.html

一个Tab切换类,求指导相关推荐

  1. javascript tab切换类LixTabs最新版

    javascript Tab切换类LixTabs,更新至0.5版: 受snandy的"读jquery"系列的启发,改进了代码,现在调用LixTabs时不用加new了.即可以这样写: ...

  2. [vue] 使用vue写一个tab切换

    [vue] 使用vue写一个tab切换 v-for循环,利用下标和v-show显示`<div id="app"><ul class="tabs" ...

  3. 本篇文章使用vue结合element-ui开发tab切换vue的不同组件,每一个tab切换的都是一个新的组件。

    本篇文章使用vue结合element-ui开发tab切换vue的不同组件,每一个tab切换的都是一个新的组件. 1.vue如何使用element-ui 上一篇文章已经分享了如何在vue中使用eleme ...

  4. 每一个tab切换的都是一个新的组件刷新

    <template><el-tabs v-model="activeName" style="padding-left: 5px;" @tab ...

  5. HTML简单的自定义属性制作tab切换

    今天做淘宝页面时候碰到一个tab切换 如下图所示: 当我鼠标移到第一个tab时候 那个小三角形在第一个tab项里 移到第二个时候 就到了第二个里面  这种效果 我这里用了个小技巧 就是在HTML中自定 ...

  6. HTML第三次作业——Tab切换和轮播图

    第一题:完全模仿京东首页的每日特价专栏制作一个Tab切换效果,除了图片大小和图片具体内容不一样外,其它部分要求高仿,即内容部分也要求高仿,即也是由图片和文字的组合构成,最左边也是一张图片. 效果图:代 ...

  7. jquery+bootstrap实现tab切换, 每次切换时都请求数据, 点击提交分别向不同的地址提交数据...

    今天一个朋友叫帮做一个tab切换, 每一个tab内容区域都是从后台取出的数据, 这些数据要用表格的形式显示处理, 并且表格的内容区域可以修改, 如下所示: 例子查看请演示查看. 截图如图所示: 实现步 ...

  8. bootstrap tabale 点击_jquery+bootstrap实现tab切换, 每次切换时都请求数据, 点击提交分别向不同的地址提交数据...

    今天一个朋友叫帮做一个tab切换, 每一个tab内容区域都是从后台取出的数据, 这些数据要用表格的形式显示处理, 并且表格的内容区域可以修改, 如下所示: 例子查看请演示查看. 截图如图所示: 实现步 ...

  9. js+css实例超漂亮tab切换选项卡代码

    效果图: 代码:切换效果,要点击才能实现. js+css实例超漂亮tab切换选项卡代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...

最新文章

  1. iOS开发之autoLayout constraint
  2. python27安装-linux安装python2.7
  3. 《Spark与Hadoop大数据分析》——1.2 大数据科学以及Hadoop和Spark在其中承担的角色...
  4. 成功解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra
  5. iOS开发--UITableView
  6. 打破网络沉闷---QQ强制聊天工具再度现身!
  7. python tkinter库Entry控件Text控件
  8. ubuntu中安装caffe docker 镜像【不用自己配环境,一键搞定,快速进入caffe学习】
  9. python爬虫从入门到放弃-【爬虫】python爬虫从入门到放弃
  10. 大学生计算机竞赛试题,大学生计算机基础知识竞赛题库_大学生计算机基础知识竞赛试题附答案.docx...
  11. java opts xmn_tomcat设置JAVA_OPTS
  12. 10大H5前端ui框架,ui让你开发不愁
  13. boost | 线程与并发(一)atomic
  14. 【工艺】 CNC(数控机床)加工工艺
  15. Python包pretty_errors
  16. php 正则 标点符号,js正则匹配中文标点符号
  17. 好书推荐 | 2020 年读过的这些好书,建议收藏!
  18. go vender 的环境搭建和使用
  19. Excel:一步搞定平均分 妙用TRIMMEAN函数(转)
  20. google AdView

热门文章

  1. 手把手让你实现开源企业级web高并发解决方案
  2. 1. Pandas 导入导出数据
  3. Vue源码学习 - 组件化(三) 合并配置
  4. Chromium的GPU进程启动过程分析
  5. 一起学习C语言:C语言发展历程以及定制学习计划
  6. Tomcat启动报A child container failed during start问题解决
  7. Tomcat报错系统找不到指定的路径
  8. db与redis一致性解决策略:延时双删
  9. centos挂载光驱设备
  10. 大电流dcdc降压芯片20a_关于LED驱动电源那些常见的十款经典LED驱动芯片