从setTimeout 0取消keydown事件或在keydown中更正range.commonAncestorContainer

时间:2015-08-13 17:27:41

标签: javascript jquery range contenteditable rangy

我需要在keydown事件中获取range.commonAncestorContainer,以便了解用户是否在可信任的div中插入文本或单击html元素。

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

问题:在keydown中,commonAncestorContainer没有返回正确的对象。为了得到正确的对象我正在使用setTimeout(...,0),它给了我正确的值。但是,当我尝试取消该事件时,已经太晚了(?)而且我无法做到。

Here is the jsFiddle example

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();
}

当我们点击链接/类型时:

  • test()显示正在选择的正文

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

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

我怎么能:

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

OR

2)在没有任何settimeout的情况下找到在keydown中选择的正确元素?

0 个答案:

没有答案