javascript面向对象系列讲解之Tab切换实战



javascript面向对象系列讲解之Tab切换实战。声明:为了方便大家学习和查看,所以特意控制了文章的篇幅,将面向对象写成了多篇连续博文的方式,也方便大家根据自己具体情况进行选择性的学习。

在上一篇文章当中,我们讲解了混合模式的书写方法,解释了如何使用new去解决这种工厂模式的缺陷,如何利用原型解决“方法”的重复创建。本文我将以Tab切换为实例,为大家讲解如何一步步将自己的代码修改为面向对象的代码。

进行基本结构和样式搭建:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <meta charset=”UTF-8″>
  5. <title>面向对象-独行冰海</title>
  6. <style>
  7. .tit span{
  8. float: left;
  9. width: 100px;
  10. background: #ccf;
  11. }
  12. .tit .select{
  13. background: #99f;
  14. }
  15. .con div{
  16. display: none;
  17. width: 300px;
  18. height: 200px;
  19. background: #cfc;
  20. }
  21. .con .show{
  22. display: block;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div id=’tabTit’>
  28. <span class=’select’>1</span>
  29. <span>2</span>
  30. <span>3</span>
  31. </div>
  32. <div class=’con’ id=’tabCon’>
  33. <div class=’show’>1</div>
  34. <div>2</div>
  35. <div>3</div>
  36. </div>
  37. </body>
  38. <script>
  39. var tabTit = document.getElementById(‘tabTit’).getElementsByTagName(‘span’);
  40. var tabCon = document.getElementById(‘tabCon’).getElementsByTagName(‘div’);
  41. for (var i = 0; i < tabTit.length; i++) {
  42. tabTit[i].index = i;
  43. tabTit[i].onclick = function(){
  44. for (var i = 0; i < tabTit.length; i++) {
  45. tabTit[i].className = ”;
  46. tabCon[i].className = ”;
  47. };
  48. this.className = ‘select’;
  49. tabCon[this.index].className = ‘show’;
  50. }
  51. };
  52. </script>
  53. </html>

第一步,不要出现函数中嵌套着函数,将函数提取出来(注意,上面用了不同于自己之前书写的tab的一种写法,为每个元素创建了一个属性index,存储索引值)

拆分后:

  1. <script>
  2. var tabTit = document.getElementById(‘tabTit’).getElementsByTagName(‘span’);
  3. var tabCon = document.getElementById(‘tabCon’).getElementsByTagName(‘div’);
  4. for (var i = 0; i < tabTit.length; i++) {
  5. tabTit[i].index = i;
  6. tabTit[i].onclick = tabFun;
  7. };
  8. function tabFun(){
  9. for (var i = 0; i < tabTit.length; i++) {
  10. tabTit[i].className = ”;
  11. tabCon[i].className = ”;
  12. };
  13. this.className = ‘select’;
  14. tabCon[this.index].className = ‘show’;
  15. }
  16. </script>


第2步,创建构造函数、函数变方法、变量变属性、设置基本参数:

  1. /*
  2. *
  3. * 创建构造函数
  4. *
  5. */
  6. function TabSwitch(titId, titEle, conId, conEle){
  7. this.tabTit = document.getElementById(titId).getElementsByTagName(titEle);
  8. this.tabCon = document.getElementById(conId).getElementsByTagName(conEle);
  9. for (var i = 0; i < this.tabTit.length; i++) {
  10. this.tabTit[i].index = i;
  11. this.tabTit[i].onclick = this.tabFun;
  12. }
  13. }
  14. TabSwitch.prototype.tabFun = function(){
  15. // 在这里,this指向发生了变化
  16. for (var i = 0; i < this.tabTit.length; i++) {
  17. this.tabTit[i].className = ”;
  18. this.tabCon[i].className = ”;
  19. };
  20. this.tabTit[i].className = ‘select’;
  21. this.tabCon[this.tabTit[i].index].className = ‘show’;
  22. }
  23. new TabSwitch(‘tabTit’, ‘span’, ‘tabCon’, ‘div’);

第3步,修改调用方法,防止this指向有误,将方法提取到外部,利用原型进行书写,同时注意参数的传递:

  1. function TabSwitch(titId, titEle, conId, conEle){
  2. var _this = this;
  3. this.tabTit = document.getElementById(titId).getElementsByTagName(titEle);
  4. this.tabCon = document.getElementById(conId).getElementsByTagName(conEle);
  5. for (var i = 0; i < this.tabTit.length; i++) {
  6. this.tabTit[i].index = i;
  7. this.tabTit[i].onclick = function(){
  8. // 调用的应当是tabSwitch的方法
  9. // 传递的应该是被点击的这个元素
  10. _this.tabFun(this);
  11. }
  12. }
  13. }
  14. TabSwitch.prototype.tabFun = function(objTab){
  15. for (var i = 0; i < this.tabTit.length; i++) {
  16. this.tabTit[i].className = ”;
  17. this.tabCon[i].className = ”;
  18. };
  19. objTab.className = ‘select’;
  20. this.tabCon[objTab.index].className = ‘show’;
  21. }
  22. new TabSwitch(‘tabTit’, ‘span’, ‘tabCon’, ‘div’);

到此为止,我们的tab切换的面向对象代码已经构建完成了,当然如果使用了不同的结构,tab切换具体的内容也要进行相应的调整。个人比较推荐的结构如下:

  1. <div id=’tabTit’>
  2. <span class=’select’>1</span>
  3. <span>2</span>
  4. <span>3</span>
  5. </div>
  6. <div class=’con’ id=’tabCon’>
  7. <div class=’show’>1</div>
  8. <div>2</div>
  9. <div>3</div>
  10. </div>

这样的基本结构,我们可以直接使用children(在获取标签的时候),而不需要进行4个参数的传递,只需要传递tabTit和tabCon即可。这样也更有利于我们代码的扩展性和重用性。

在下一篇文章当中,我将继续为大家讲解面向对象的基本知识,将采用拖拽作为实例进行面向对象的讲解,之所以使用拖拽,目的在于给大家介绍一下面向对象中的“继承”的基本知识和用法。请关注下一篇文章——面向对象系列——拖拽(继承知识)实战