Решите, если warnDefault () или нет после асинхронного вызова - вопреки предотвращению и остановке пропуска - PullRequest
0 голосов
/ 29 июня 2018

При использовании этого кода:

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(); будут выполнены слишком поздно , поскольку storage.get является асинхронным.

Какую опцию можно решить, следует ли вызывать warnDefault () после результата асинхронного вызова?

Я думал об этом решении:

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

Примечание: я уже прочитал Как включить event.preventDefault? , но это не помогло в этом контексте.

1 Ответ

0 голосов
/ 29 июня 2018

Отказ от ответственности: это хакерское решение, и я фактически не использовал его, потому что стало ненужным иметь такое поведение.

У меня была похожая проблема с событием клика. Я думал, чтобы предотвратить дефолт, если флаг верен. Если мне нужно поведение события по умолчанию, я устанавливаю флаг в true и запускаю событие в элементе. Когда этот экземпляр обрабатывается (не забудьте пропустить логику, которая инициирует событие), флаг снова устанавливается в значение false.

Вместо флага, я полагаю, вы также можете вызвать событие для родительского элемента.

...