Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在异步调用后确定preventDefault()与否-与preventDefault和StopRopAgation相反_Javascript_Asynchronous_Preventdefault_Event Bubbling - Fatal编程技术网

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秒)调用此异步函数,或者遇到未更新的内容。。。这看起来像是一个非最优的解决方案。你知道吗?