Javascript 如何在光标反应之前删除值

Javascript 如何在光标反应之前删除值,javascript,reactjs,cursor-position,Javascript,Reactjs,Cursor Position,我用React创建了一款手机,无论您是按键还是使用键盘,它都会将数字存储在输入中 手机工作正常,但按delete(删除)按钮或backspace(退格)键总是会删除链中的最后一个值 我需要按钮和退格键来删除光标位置之前的值。如果位置是3,我希望按钮消除链中的数字2,如果是5,则消除4。。。如何删除光标前的值 编辑: 感谢@Seba99,我解决了我的问题。这是最终代码: 我的手机组件: class Telefono extends Component { constructor(props

我用React创建了一款手机,无论您是按键还是使用键盘,它都会将数字存储在
输入中

手机工作正常,但按delete(删除)按钮或backspace(退格)键总是会删除链中的最后一个值

我需要按钮和退格键来删除光标位置之前的值。如果位置是3,我希望按钮消除链中的数字2,如果是5,则消除4。。。如何删除光标前的值

编辑: 感谢@Seba99,我解决了我的问题。这是最终代码:

我的手机组件:

class Telefono extends Component {
    constructor(props) {
        super(props);
        this.state = {
            numberClicked: '',
            inputContent: [],
            currentKey: '',
        };
        this.deleteClickNumber = this.deleteClickNumber.bind(this);
    }

    deletePrevNumber(){
        var string = this.state.inputContent.split("");
        var ctl = document.getElementById('inputTelephone');
        var startPos = ctl.selectionStart;
        var endPos = ctl.selectionEnd;
        string.splice((startPos - 1), 1);
        this.setState({
            inputContent: string.join(''),
            numberClicked: string.join(''),
        })
    }

    deleteClickNumber(evObject){
        this.change = setTimeout(() => {
            this.setState({
                addClickedBottoms: '',
            })
        }, 300)
        this.setState({
            currentKey: evObject.keyCode
        });
        if(this.state.addClickedBottoms === ''){
            this.setState({
                addClickedBottoms: 'clicked',
            })            
        }

        if (this.state.inputContent !== ''){
            this.deletePrevNumber();
        }  
    }


    render(){
        return(
            <div className="pad sb-content">
                <div className="dial-pad">
                    <div className="phoneString">
                        <input type="text" ref="inputTelephone" value={this.state.inputContent.toString()} onChange={this.handleKeyPress} onKeyDown={this.handleKeyDown}/>
                    </div>
                    <div className="digits">
                        <Numbers 
                            numbers={this.state.numbers} 
                            letters={this.state.letters}
                            addClicked={this.state.addClicked}  
                            updateNumber={this.updateNumber}
                            addClickedBottoms={this.state.addClickedBottoms}
                            deleteClickNumber={this.deleteClickNumber}
                        />
                    </div>

                    <div className="digits">
                        <div className="dig call"><Icon icon="telefono" className='ico-telefono'/><span>LLAMAR</span></div>
                    </div>
                </div>
            </div>
        );
    }
}
class Telefono扩展组件{
建造师(道具){
超级(道具);
此.state={
编号已单击:“”,
输入内容:[],
currentKey:“”,
};
this.deleteClickNumber=this.deleteClickNumber.bind(this);
}
deletePrevNumber(){
var string=this.state.inputContent.split(“”);
var ctl=document.getElementById('InputElephone');
var startPos=ctl.selectionStart;
var endPos=ctl.selectionEnd;
串.拼接((startPos-1),1);
这是我的国家({
inputContent:string.join(“”),
numberClicked:string.join(“”),
})
}
删除ClickNumber(evObject){
this.change=setTimeout(()=>{
这是我的国家({
添加单击的底部:“”,
})
}, 300)
这是我的国家({
currentKey:evObject.keyCode
});
如果(this.state.addClickedBottoms==''){
这是我的国家({
addClickedBottoms:“单击”,
})            
}
如果(this.state.inputContent!=''){
这个.deletePrevNumber();
}  
}
render(){
返回(
美洲驼马
);
}
}
这是“我的数字”组件中的“删除”按钮

<div onClick={this.props.deleteClickNumber}>
  <Icon icon="borrar" className='ico-borrar'/>
</div>``

``

非常感谢您的帮助

这是因为
切片(0,-1)
总是删除数组中的最后一个元素

截至:

class Telefono extends Component {
    constructor(props) {
        super(props);
        this.state = {
            numberClicked: '',
            inputContent: [],
            currentKey: '',
        };
        this.deleteClickNumber = this.deleteClickNumber.bind(this);
    }

    deletePrevNumber(){
        var string = this.state.inputContent.split("");
        var ctl = document.getElementById('inputTelephone');
        var startPos = ctl.selectionStart;
        var endPos = ctl.selectionEnd;
        string.splice((startPos - 1), 1);
        this.setState({
            inputContent: string.join(''),
            numberClicked: string.join(''),
        })
    }

    deleteClickNumber(evObject){
        this.change = setTimeout(() => {
            this.setState({
                addClickedBottoms: '',
            })
        }, 300)
        this.setState({
            currentKey: evObject.keyCode
        });
        if(this.state.addClickedBottoms === ''){
            this.setState({
                addClickedBottoms: 'clicked',
            })            
        }

        if (this.state.inputContent !== ''){
            this.deletePrevNumber();
        }  
    }


    render(){
        return(
            <div className="pad sb-content">
                <div className="dial-pad">
                    <div className="phoneString">
                        <input type="text" ref="inputTelephone" value={this.state.inputContent.toString()} onChange={this.handleKeyPress} onKeyDown={this.handleKeyDown}/>
                    </div>
                    <div className="digits">
                        <Numbers 
                            numbers={this.state.numbers} 
                            letters={this.state.letters}
                            addClicked={this.state.addClicked}  
                            updateNumber={this.updateNumber}
                            addClickedBottoms={this.state.addClickedBottoms}
                            deleteClickNumber={this.deleteClickNumber}
                        />
                    </div>

                    <div className="digits">
                        <div className="dig call"><Icon icon="telefono" className='ico-telefono'/><span>LLAMAR</span></div>
                    </div>
                </div>
            </div>
        );
    }
}
可以使用负索引,表示从序列末尾的偏移量。切片(2,-1)通过序列中倒数第二个元素提取第三个元素

您应该查看删除所选索引中所需元素数量的:

this.state.inputContent.splice(IndexOfTheCursor, 1);
this.setState({
     inputContent: this.state.inputContent
})

您好,抱歉回复时间太长。我已经用您的更改更新了代码,但出现以下错误:this.state.inputContent.splice不是一个函数好吧,好吧,至少您知道自己在做什么吗?我的代码不应该只是复制/粘贴到您的项目中,它需要一些修改。。。为了用正确的值设置我调用的参数的值,
IndexOfTheCursor
,我试着理解你在做什么。我认为它不起作用,因为“拼接”需要数组而不是字符串。。。我修改了它,但我仍然没有检测到该函数的索引,它给出了未定义的。现在如果我单击删除整个数组,而不是只有一个elementinputContent是字符串?那么为什么要这样初始化呢
inputContent:[]
,然后在呈现中转换它:
this.state.inputContent.toString()
,在
deletePrevNumber
函数中执行奇怪的操作
var string=[this.state.inputContent]。。。您可以决定,但在整个代码中保持该变量的类型相同!顺便说一句,由于您没有在此处将其传递给调用,所以该函数的索引仍然未定义:
if(this.state.inputContent!=''{this.deletePrevNumber();}
非常感谢,对于不便之处,我深表歉意。我不知道我的解决方案是否是最好的解决方案,但我的代码可以工作。如果你认为你能做得更好,我很想知道。再次感谢