我正在使用可汗学院的网页来制作一个 javascript 项目(您可以看到 here )。我提出这个问题是因为我不知道这个问题是由于 javascript 的微妙之处还是由于可汗学院的系统造成的。
以下是问题的描述:
var keyPressed = function() {
if (keyCode === BACKSPACE) {
debug(textBuffer.length);
debug(textBuffer);
textBuffer = textBuffer.slice(0,-1);
}
};
本质上,只要我按退格键,就会运行此代码。当我第一次调用代码时,它工作正常;最后一个字符已从我的全局变量 textBuffer
中删除。但是,对此代码的任何后续调用对我的 textBuffer
字符串没有任何作用,除非 textBuffer
在调用之间发生了更改。通过使用 debug
语句,我注意到字符串长度似乎太大了。
我希望我已经提供了足够的详细信息,以便有人能够找出问题所在。有人知道这是怎么回事吗?
编辑:这是问题的根源:虽然 keyPressed
正确注册了退格键,但还有另一个名为 keyTyped
的函数添加了一个不可见的 '\b'
字符插入字符串中。这就是字符串看起来只有 2 个字符但长度为 3 的原因。
最佳答案
当您按下退格键时,keyTyped
和 keyPressed
函数都会被执行。首先执行 keyPressed
,删除一个字符,然后执行 keyTyped
,并向字符串添加一个字符,即 backspace character .
在 JavaScript 中,这个退格字符实际上有一个字符串转义字符:'\b'
。
要解决您的问题,请在 keyTyped
函数中处理退格键,并且不要让它将 toString
值附加到 textBuffer
.
var keyTyped = function() {
if (key.toString() === '\n') {
parse();
textBuffer = "";
}
if (key.toString() === '\b') {
textBuffer = textBuffer.slice(0, -1);
} else {
textBuffer = textBuffer + key.toString();
}
};
关于javascript - JS String 的长度为 n,但只有 n-1 个字符。使用 str = str.slice(0,-1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40966675/