0

我有一种情况,我需要拦截每一个被按下到 contentEditable div 的键。但是当按键事件发生时,如果我这样做了,

document.getElementById("divEditor").innerHTML

我无法获取全文(没有按下最后一个字符)

此外,连续按键不会触发 keyup 事件。我该怎么做才能拥有一个具有全部价值的关键事件?

4

3 回答 3

1

keyup是唯一可以看到按键后状态的事件。

一种方法是keydown在按键后捕获并设置超时以进行一些处理:

input.onkeydown= function() {
    setTimeout(function() {
        // do something
    }, 1);
};

但是,如果也可以在没有按键的情况下进行编辑(通常是通过拖放和菜单项,如剪切和粘贴),那么再多的检查按键事件也无济于事。相反,您必须简单地轮询状态以查看它是否已更改。您可以使用 onkeyup 处理程序或 onkeydown 超时来备份它,以使特定案例更新更快。

var oldstate= input.value;
function checkState() {
    if (input.value!=oldstate) {
        // do something
        oldstate= input.value;
    }
}
setInterval(checkState, 1000);
input.onkeyup= checkState;

(为了简单起见,这使用了一个输入元素,但同样适用于 contentEditable。)

于 2009-10-02T12:21:08.787 回答
0

似乎最好的方法是拥有一个 INPUT 字段 ( position:absolute; left:-1000px) 并将所有 3 个事件 ( keydown keypress keyup) 添加到其中。

现在您可以使用此输入字段的值,CTRL + Z工作并且您可以粘贴值。

您所要做的就是将焦点设置到输入字段。

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;
于 2009-10-02T12:32:22.620 回答
0

怎么样onblur()?您将需要两个功能,您的按键功能,然后在焦点离开文本框时调用 onblur() 。这应该使您可以访问文本的其余部分。

于 2009-10-02T12:36:34.967 回答