01-js类和实例/tab栏切换案例 - 图1
    01-js类和实例/tab栏切换案例 - 图2
    01-js类和实例/tab栏切换案例 - 图3
    01-js类和实例/tab栏切换案例 - 图4
    01-js类和实例/tab栏切换案例 - 图5
    01-js类和实例/tab栏切换案例 - 图6
    01-js类和实例/tab栏切换案例 - 图7
    01-js类和实例/tab栏切换案例 - 图8
    01-js类和实例/tab栏切换案例 - 图9
    01-js类和实例/tab栏切换案例 - 图10
    image.png

    1. 在ES6中类没有变量提升,所以必须先定义类,才可以通过类实例化对象
      2. 类里面 添加this的变量为实例变量,不添加this的变量为类的静态变量
      3. 类里面的constructor函数中的this 指向实例对象,类中的方法函数中的this指针,指向了方法的调用者!

    image.png
    image.png
    image.png
    image.png
    image.png
    设置表单里面的value文字内容为选定状态:
    input.select(); //设置文本框里面的文字处于选定状态

    1. var that; //保留类Tab中的this指针
    2. class Tab {
    3. constructor(id) {
    4. //获取元素
    5. that = this;
    6. this.main = document.querySelector(id);
    7. this.add = this.main.querySelector(".tabadd");
    8. // li 的父元素
    9. this.ul = this.main.querySelector(".firstnav ul:first-child");
    10. this.fsection = this.main.querySelector(".tabscon");
    11. this.init();
    12. }
    13. // 初始化功能-包含1.重新获取元素 2.给元素重新绑定事件
    14. init() {
    15. this.updateNode();
    16. //init 初始化操纵 让相关的元素 绑定事件
    17. this.add.onclick = this.addTab;
    18. for (var i = 0; i < this.lis.length; i++) {
    19. this.lis[i].index = i;
    20. this.lis[i].onclick = this.toggleTab;
    21. this.remove[i].onclick = this.removeTab;
    22. this.spans[i].ondblclick = this.editTab;
    23. this.sections[i].ondblclick = this.editTab;
    24. }
    25. }
    26. // 因为我们动态添加元素 需要重新获取对应的元素
    27. updateNode() {
    28. this.lis = this.main.querySelectorAll("li");
    29. this.sections = this.main.querySelectorAll("section");
    30. this.remove = this.main.querySelectorAll(".icon-guanbi");
    31. this.spans = this.main.querySelectorAll(".firstnav li span:first-child");
    32. }
    33. // 切换功能
    34. toggleTab() {
    35. that.clearClass();
    36. this.className = "liactive";
    37. that.sections[this.index].className = "conactive";
    38. }
    39. // 清除所有li和section的类
    40. clearClass() {
    41. for (var i = 0; i < this.lis.length; i++) {
    42. this.lis[i].className = "";
    43. this.sections[i].className = "";
    44. }
    45. }
    46. // 添加功能
    47. // 类中的函数 谁调用函数中的this指针就指向谁,因为addTab函数 是由添加按钮对象进行调用的,
    48. // 所以该函数中的this 指向的是add按钮
    49. addTab() {
    50. console.log(this); //<div class="tabadd"><span>+</span></div>
    51. that.clearClass();
    52. // (1) 创建li元素和section元素
    53. var random = Math.random();
    54. var li =
    55. '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';
    56. var section = '<section class="conactive">' + random + "</section>";
    57. // (2) 把这两个元素追加到对应的父元素里面
    58. that.ul.insertAdjacentHTML("beforeend", li);
    59. that.fsection.insertAdjacentHTML("beforeend", section);
    60. that.init(); //重新初始化
    61. }
    62. // 删除功能
    63. removeTab(e) {
    64. // console.log(this);
    65. e.stopPropagation(); // 阻止冒泡 防止触发li 的切换点击事件
    66. // 获取删除当前对应的li的下标
    67. var index = this.parentNode.index;
    68. // console.log(index);
    69. // 根据索引号删除对应的li和section remove() 方法可以直接删除指定的元素
    70. that.lis[index].remove();
    71. that.sections[index].remove();
    72. that.init();
    73. // 当我们删除的不是选中状态的li的时候 原来的选中状态li保持不变
    74. if (document.querySelector(".liactive")) return;
    75. // 当我们删除了选中状态的这个li的时候 就让它的前一个li 处于选定状态
    76. index--;
    77. // 手动调用我们的点击事件 不需要鼠标触发
    78. that.lis[index] && that.lis[index].click();
    79. }
    80. // 修改功能
    81. editTab() {
    82. var str = this.innerHTML;
    83. //双击禁止选定文字
    84. window.getSelection
    85. ? window.getSelection().removeAllRanges()
    86. : document.selection.empty();
    87. this.innerHTML = '<input type="text" />';
    88. var input = this.children[0];
    89. input.value = str;
    90. input.select(); //设置文本框里面的文字处于选定状态
    91. // 当我们离开文本框 就把文本框里面的值给span
    92. input.onblur = function () {
    93. this.parentNode.innerHTML = this.value;
    94. };
    95. // 按下回车也可以把文本框里面的值给span
    96. input.onkeyup = function (e) {
    97. if (e.keyCode === 13) {
    98. this.blur();
    99. }
    100. };
    101. }
    102. }
    103. new Tab("#tab");