Javascript 在异步调用后确定preventDefault()与否-与preventDefault和StopRopAgation相反
使用此代码时:Javascript 在异步调用后确定preventDefault()与否-与preventDefault和StopRopAgation相反,javascript,asynchronous,preventdefault,event-bubbling,Javascript,Asynchronous,Preventdefault,Event Bubbling,使用此代码时: document.addEventListener("keydown", function(e) { if (e.keyCode == 9) { storage.get("items", function(obj) { // this is an asynchronous call if (some_condition(obj)) { e.preventDefault();
document.addEventListener("keydown", function(e) {
if (e.keyCode == 9)
{
storage.get("items", function(obj) { // this is an asynchronous call
if (some_condition(obj)) {
e.preventDefault();
e.stopPropagation();
}
});
}
}
如果some_condition
(取决于异步调用的结果)为True,e.preventDefault()代码>和e.stopPropagation()代码>将被执行太晚,因为存储.get
是异步的
什么选项可以决定在异步调用的结果之后是否调用preventDefault()?
我在考虑这个解决方案:
document.addEventListener("keydown", function(e) {
if (e.keyCode == 9)
{
e.preventDefault(); // always preventDefault and stopPropogation,
e.stopPropagation(); // we'll maybe restore it later
storage.get("items", function(obj) { // this is an asynchronous call
if (!some_condition) {
e.reenableDefault(); // contrary of preventDefault
e.restartPropagation(); // contrary of stopPropagation
}
});
}
}
但是显然没有e.restartPropagation()代码>功能
注意:我已经读过了,但这在这方面没有帮助。免责声明:这是一个黑客解决方案,实际上我没有使用它,因为它变得不必要有这种行为
我在一次点击事件中遇到了类似的问题。我的想法是,如果一个标志是真的,就要防止违约。如果我想要默认的事件行为,我将标志设置为true,并在元素上重新触发事件。处理该实例时(请记住跳过重新触发事件的逻辑),该标志将再次设置为false
我想您也可以在父元素上触发事件,而不是使用标志。如果需要,只需触发一个新事件即可(假设您无法直接调用事件应该实现的功能,但是您的应用程序在那里似乎设计得不好)。您可以在适当的时间间隔独立于用户输入轮询异步函数,并将其存储在可同步访问的上下文中,以同步检查事件处理程序中的条件。您想要执行的操作实际上是不可能的。您需要重新思考您正在尝试做什么。@DenysSéguret如何重新触发一个“看起来”像在textarea/contenteditable中触发的普通TAB键的“TAB”键?@PatrickRoberts我在想:独立地进行异步调用,并将结果填入一个变量(可从keypress eventlistener访问),但这需要频繁(每5秒)调用此异步函数,或者遇到未更新的内容。。。这看起来像是一个非最优的解决方案。你知道吗?