在Textarea的keydown之前和之后是什么?

时间:2015-06-28 10:54:49

标签: javascript html textarea

我不想允许按(F1,F2..etc),表格键等功能键,也不要添加任何字符。

代码中的那个代码不能在我的网站上运行。



document.getElementById("code").addEventListener("keydown",function(e){
    var oldOne = this.value;
	var newOne = (this.value + String.fromCharCode(e.keyCode)).toLowerCase();
    if(oldOne==newOne){
        e.preventDefault();
    }
	document.getElementById('message').innerHTML = "Is it the same: "+(oldOne==newOne)+", Before: "+oldOne+", After: "+newOne;
})

<textarea id="code"></textarea>
<div id="message"></div>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:1)

因为超出可用字符范围[32, 126]的转换字符代码会生成"",而它看起来像一个空字符串,它会占用长度,并且不能像空格一样修剪,所以"apple" + "ctrl"的长度为6,而显示为"apple"时,最好使用

if (e.keyCode < 32 || e.keyCode > 126) {
  // This is not a valid char, do something to ignore
}

忽略那些特殊字符,而不是将其转换为字符串,追加到当前值,然后与oldValue进行比较。

答案 1 :(得分:1)

当你写作时

template<typename... Args>
void operator()(Args&&... args)
{
    for (auto const & listener : Listeners)
    {
        if (auto locked = std::get<0>(listener).lock())
            std::get<1>(listener)(std::forward<Args>(args)...);
    }       
}

然后你总是得到一个字符串,即使你按下你没有看到值的任何变化,String.fromCharCode(e.keyCode)得到的东西,键的字符串格式,它不是空白字符串,所以你总是在if。

中得到错误

您可以登记密钥代码,也可以在密钥后检查。

答案 2 :(得分:0)

keydown事件在您的角色被写入之前为您提供对象的状态。 `keyup事件在写完之后会给你对象的状态。

你可能想要这样做(fiddle):

document.getElementById("ta").addEventListener("keydown", function () {
    this.oldValue = this.value;
});
document.getElementById("ta").addEventListener("keyup",function(e){
    var oldOne = this.oldValue;
    var newOne = this.value;
    if(oldOne == newOne){
        e.preventDefault();
    }
    document.getElementById('message').innerHTML = "Is it the same: "+(oldOne==newOne)+", Before: "+oldOne+", After: "+newOne;
})