我有一种情况需要拦截被压入contentEditable div的每个键。但是当按键事件发生时,如果我这样做,
document.getElementById("divEditor").innerHTML
我无法获得全文(没有按下最后一个字符)
此外,连续按键不会触发keyup事件。如果有一个具有全部价值的关键事件,我该怎么办?
答案 0 :(得分:1)
keyup
是唯一可以看到后按键状态的事件。
一种方法是捕获keydown
并设置超时以在按键后进行一些处理:
input.onkeydown= function() {
setTimeout(function() {
// do something
}, 1);
};
但是,如果还可以在没有按键的情况下进行编辑(通常是通过拖放和剪切和粘贴等菜单项),对关键事件的检查数量也无济于事。相反,您必须简单地轮询状态以查看它是否已更改。您可以使用onkeyup处理程序或onkeydown timeout来备份它,以便更快地更新特定的案例。
var oldstate= input.value;
function checkState() {
if (input.value!=oldstate) {
// do something
oldstate= input.value;
}
}
setInterval(checkState, 1000);
input.onkeyup= checkState;
(为简单起见,它使用输入元素,但同样适用于contentEditable。)
答案 1 :(得分:0)
似乎最好的方法是拥有一个INPUT字段(position:absolute; left:-1000px
)并将所有3个事件(keydown keypress keyup
)添加到其中。
现在您可以使用此输入字段的值,CTRL + Z
有效,您可以粘贴值。
所有你需要做的就是将setFocus设置为输入字段。
var user_action = function ()
{
document.getElementById("divEditor").innerHTML = document.getElementById("myhiddenInput").value;
};
document.getElementById("myhiddenInput").onchange = user_action;
document.getElementById("myhiddenInput").onkeydown = user_action;
document.getElementById("myhiddenInput").onkeyup = user_action;
document.getElementById("myhiddenInput").onkeypress = user_action;
document.getElementById("divEditor").onclick = document.getElementById("myhiddenInput").focus;
答案 2 :(得分:0)
onblur()
怎么样?您需要两个功能,按键功能,然后在焦点离开文本框时调用onblur()。这可以让您访问文本的其余部分。