我需要在keydown事件中获取range.commonAncestorContainer,以便了解用户是否在可信任的div中插入文本或单击html元素。
根据键或当前选择,可能必须防止keydown事件。
问题:在keydown中,commonAncestorContainer没有返回正确的对象。为了得到正确的对象我正在使用setTimeout(...,0),它给了我正确的值。但是,当我尝试取消该事件时,已经太晚了(?)而且我无法做到。
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中选择的正确元素?