Javascript 如何在光标反应之前删除值
我用React创建了一款手机,无论您是按键还是使用键盘,它都会将数字存储在Javascript 如何在光标反应之前删除值,javascript,reactjs,cursor-position,Javascript,Reactjs,Cursor Position,我用React创建了一款手机,无论您是按键还是使用键盘,它都会将数字存储在输入中 手机工作正常,但按delete(删除)按钮或backspace(退格)键总是会删除链中的最后一个值 我需要按钮和退格键来删除光标位置之前的值。如果位置是3,我希望按钮消除链中的数字2,如果是5,则消除4。。。如何删除光标前的值 编辑: 感谢@Seba99,我解决了我的问题。这是最终代码: 我的手机组件: class Telefono extends Component { constructor(props
输入中
手机工作正常,但按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();}
非常感谢,对于不便之处,我深表歉意。我不知道我的解决方案是否是最好的解决方案,但我的代码可以工作。如果你认为你能做得更好,我很想知道。再次感谢