泪痕0v0 2022-05-12 08:57 采纳率: 0%
浏览 38
已结题

关于js中bind()方法的使用问题

html代码:

img

js代码如下:

class Tab{
    constructor(id){
        // that = this
        this.main = document.querySelector(id)
        this.lis = this.main.querySelectorAll('li')
        this.sections = this.main.querySelectorAll('section')
        this.add = this.main.querySelector('.tabadd')
        
        this.ul = this.main.querySelector('.fisrstnav ul:first-child')
        this.fsection = this.main.querySelector('.tabscon')
        this.init()
    }
    init(){
        this.updateNode()
        this.add.addEventListener('click', this.addTab.bind(this.add,this))
        for(let i = 0; i < this.lis.length; i++){
            this.lis[i].index = i
            this.lis[i].addEventListener('click', this.toggleTab.bind(this.lis[i],this))
            this.remove[i].addEventListener('click', this.removeTab.bind(this.remove[i],this))
            this.spans[i].addEventListener('dblclick', this.editTab)
            this.sections[i].addEventListener('dblclick', 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('.fisrstnav li span:first-child')
    }
    //切换
    toggleTab(that){
        that.clearclass()
        this.className = 'liactive'
        that.sections[this.index].className = 'conactive'
    }
    clearclass(){
        for(let i = 0; i < this.lis.length; i++){
            this.lis[i].className = ''
            this.sections[i].className = ''
        }
    }
    //添加
    addTab(that){
        that.clearclass()
        let li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>'
        let section = '<section class="conactive">测试1</section>'
        that.ul.insertAdjacentHTML('beforeend',li)
        that.fsection.insertAdjacentHTML('beforeend',section)
        that.init()
    }
    //删除
    removeTab(that,e){
        e.stopPropagation()
        let index = this.parentNode.index
        that.lis[index].remove()
        that.sections[index].remove()
        that.init()
        //当我们删除非选定状态的tab时,原来的选定状态不变
        if(document.querySelector('.liactive')){
            return
        }
        //删除选定状态的tab后,前一个处于选定状态
        index--
        //方法一
        // if(index >= 0){
        //     that.lis[index].click()
        // }
        //方法二
        that.lis[index] && that.lis[index].click()
    }
    //修改
    editTab(){
        let str = this.innerHTML
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()  //双击禁止选定状态
        this.innerHTML = '<input type="text">'
        let input = this.children[0]
        input.value = str
        input.select()
        input.addEventListener('blur',function() {
            this.parentNode.innerHTML = this.value
        })
        input.addEventListener('keyup',function(e) {
            if(e.key === 'Enter'){
                this.blur()
            }
        })
    }
}
let tab = new Tab('#tab')

当我前面使用bind()方法改变this指向时,我发现removeTab(that,e)中的that和e调换位置时,会报以下错误:

img


若要调换位置,应如何解决这个错误

  • 写回答

2条回答 默认 最新

  • Heerey525 前端领域新星创作者 2022-05-12 10:57
    关注

    参数是跟位置来的,不是和名字,也就是that,e调换了位置,两者就变成了对方

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月18日
  • 创建了问题 5月12日

悬赏问题

  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥100 关于lm339比较电路出现的问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败
  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线