










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





设置表单里面的value文字内容为选定状态:
input.select(); //设置文本框里面的文字处于选定状态
var that; //保留类Tab中的this指针class Tab {constructor(id) {//获取元素that = this;this.main = document.querySelector(id);this.add = this.main.querySelector(".tabadd");// li 的父元素this.ul = this.main.querySelector(".firstnav ul:first-child");this.fsection = this.main.querySelector(".tabscon");this.init();}// 初始化功能-包含1.重新获取元素 2.给元素重新绑定事件init() {this.updateNode();//init 初始化操纵 让相关的元素 绑定事件this.add.onclick = this.addTab;for (var i = 0; i < this.lis.length; i++) {this.lis[i].index = i;this.lis[i].onclick = this.toggleTab;this.remove[i].onclick = this.removeTab;this.spans[i].ondblclick = this.editTab;this.sections[i].ondblclick = this.editTab;}}// 因为我们动态添加元素 需要重新获取对应的元素updateNode() {this.lis = this.main.querySelectorAll("li");this.sections = this.main.querySelectorAll("section");this.remove = this.main.querySelectorAll(".icon-guanbi");this.spans = this.main.querySelectorAll(".firstnav li span:first-child");}// 切换功能toggleTab() {that.clearClass();this.className = "liactive";that.sections[this.index].className = "conactive";}// 清除所有li和section的类clearClass() {for (var i = 0; i < this.lis.length; i++) {this.lis[i].className = "";this.sections[i].className = "";}}// 添加功能// 类中的函数 谁调用函数中的this指针就指向谁,因为addTab函数 是由添加按钮对象进行调用的,// 所以该函数中的this 指向的是add按钮addTab() {console.log(this); //<div class="tabadd"><span>+</span></div>that.clearClass();// (1) 创建li元素和section元素var random = Math.random();var li ='<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';var section = '<section class="conactive">' + random + "</section>";// (2) 把这两个元素追加到对应的父元素里面that.ul.insertAdjacentHTML("beforeend", li);that.fsection.insertAdjacentHTML("beforeend", section);that.init(); //重新初始化}// 删除功能removeTab(e) {// console.log(this);e.stopPropagation(); // 阻止冒泡 防止触发li 的切换点击事件// 获取删除当前对应的li的下标var index = this.parentNode.index;// console.log(index);// 根据索引号删除对应的li和section remove() 方法可以直接删除指定的元素that.lis[index].remove();that.sections[index].remove();that.init();// 当我们删除的不是选中状态的li的时候 原来的选中状态li保持不变if (document.querySelector(".liactive")) return;// 当我们删除了选中状态的这个li的时候 就让它的前一个li 处于选定状态index--;// 手动调用我们的点击事件 不需要鼠标触发that.lis[index] && that.lis[index].click();}// 修改功能editTab() {var str = this.innerHTML;//双击禁止选定文字window.getSelection? window.getSelection().removeAllRanges(): document.selection.empty();this.innerHTML = '<input type="text" />';var input = this.children[0];input.value = str;input.select(); //设置文本框里面的文字处于选定状态// 当我们离开文本框 就把文本框里面的值给spaninput.onblur = function () {this.parentNode.innerHTML = this.value;};// 按下回车也可以把文本框里面的值给spaninput.onkeyup = function (e) {if (e.keyCode === 13) {this.blur();}};}}new Tab("#tab");
