Javascript 从setTimeout 0或正确范围中取消keydown事件。keydown中的commonAncestorContainer

Javascript 从setTimeout 0或正确范围中取消keydown事件。keydown中的commonAncestorContainer,javascript,jquery,range,contenteditable,rangy,Javascript,Jquery,Range,Contenteditable,Rangy,我需要在keydown事件中获取range.commonAncestorContainer,以确定用户是否在contenteditable div中的html元素中插入文本或单击 根据按键或当前选择,可能必须防止按键按下事件 问题:在向下键中,commonAncestorContainer没有返回正确的对象。为了得到正确的对象,我使用了setTimeout(…,0),它给了我正确的值。然而,当我试图取消活动时,已经太晚了(?),我无法这样做 单击链接/键入时: test()显示所选的主体,该

我需要在keydown事件中获取range.commonAncestorContainer,以确定用户是否在contenteditable div中的html元素中插入文本或单击

根据按键或当前选择,可能必须防止按键按下事件

问题:在向下键中,commonAncestorContainer没有返回正确的对象。为了得到正确的对象,我使用了setTimeout(…,0),它给了我正确的值。然而,当我试图取消活动时,已经太晚了(?),我无法这样做

单击链接/键入时:

  • test()显示所选的主体,该主体是错误的

  • testTimeout()显示选择的正确元素,但事件未被取消(超时内的代码在其余元素之后运行)

  • testTimeoutDeferred()以正确的顺序显示事件,但仍无法取消键控

我怎样才能:

1)处理所选元素后取消事件?


2)在没有任何设置超时的情况下,在按键下找到所选的正确元素?

我不确定您想做什么。什么是预期的行为?我试图检测插入符号是否在链接中。如果它位于链接内,则必须取消按键关闭事件。不允许在链接内使用密钥。类似的东西?是的,谢谢,这就是我要找的。现在我试图将链接作为一个块来处理。我已经用方向键跳过了这个块,并使用了退格键,但我仍然在努力使用删除键。您对按下delete键时如何检测插入符号的位置有何建议?此时,它会逐个删除每个字符。它应该像backspace一样删除整个元素。我不知道你想做什么。什么是预期的行为?我试图检测插入符号是否在链接中。如果它位于链接内,则必须取消按键关闭事件。不允许在链接内使用密钥。类似的东西?是的,谢谢,这就是我要找的。现在我试图将链接作为一个块来处理。我已经用方向键跳过了这个块,并使用了退格键,但我仍然在努力使用删除键。您对按下delete键时如何检测插入符号的位置有何建议?此时,它会逐个删除每个字符。它应该像backspace一样删除整个元素。在这里拉小提琴:
function testTimeoutDeferred() {
    var def = $.Deferred();
    setTimeout(function() {
        var sel = window.getSelection();
        if (sel.rangeCount > 0) {
            var range = sel.getRangeAt(0);
            var parentElement = range.commonAncestorContainer;
            if (parentElement.nodeType === 3) {
                parentElement = parentElement.parentNode;
            }

            var $element = $(parentElement);

            console.log("element inside timeout with deferred - not resolved yet")
            console.log($element)

            def.resolve(true);
        }
    }, 500);
    return def.promise();
}