Sweetalert: A tecla Tab não funciona após abrir dois Sweet Alert Modals em uma linha

Criado em 15 out. 2014  ·  20Comentários  ·  Fonte: t4t5/sweetalert

Olá,

Parece que quando a caixa de diálogo SweetAlert abre outra depois de concluída, a tecla tab para de funcionar, todas as outras teclas estão corretas.

Você pode recriar isso usando o exemplo em http://tristanedwards.me/sweetalert.

Este especificamente:

swal({      title: "Are you sure?",   
            text: "Your will not be able to recover this imaginary file!",   
            type:  "warning",   
            showCancelButton: true,   
            confirmButtonColor: "#DD6B55",   
            confirmButtonText: "Yes, delete it!",   
            cancelButtonText: "No, cancel plx!",   
            closeOnConfirm: false,   
            closeOnCancel: false }, 
            function(isConfirm){  
                 if (isConfirm) {     
                 swal("Deleted!", "Your imaginary file has been deleted.", "success");  
                 } else {     
                 swal("Cancelled", "Your imaginary file is safe :)", "error");   
                 } });

Acredito que ele esteja copiando a manipulação de pressionamento de tecla do modal anterior, especificamente na função closeModal (), esta parte:

 // Reset the page to its previous state
    window.onkeydown = previousWindowKeyDown;
    document.onclick = previousDocumentClick;
    if (previousActiveElement) {
      previousActiveElement.focus();
    }

Talvez seja simplesmente focar no modal anterior e registrar de volta seu keydown e onclick?

help wanted

Comentários muito úteis

Para implementar a correção por @jayquest sem alterar a biblioteca, usei o seguinte código:

var previousWindowKeyDown = window.onkeydown;
swal ({
título: 'Tem certeza?',
closeOnConfirm: false,
closeOnCancel: false
}, function (isConfirm) {
window.onkeydown = previousWindowKeyDown;
if (isConfirm) {
swal ('Excluído!', 'Seu arquivo imaginário foi excluído.', 'sucesso');
} outro {
swal ('Cancelado', 'Seu arquivo imaginário está seguro :)', 'erro');
}
});

Todos 20 comentários

A partir desse exemplo, eu realmente não consigo ver se o que você está dizendo é verdade,
Porque a tecla 'tab' apenas se move entre os botões,
quando eu obtenho o segundo modal, tenho apenas um botão, então não importa o quanto você pressione o botão guia, ele sempre permanecerá nele, é um único botão que possui.

Desculpe, não deixei isso claro!

Sim, é tabulação no modelo, mas depois de fechar o segundo modal, você perde a capacidade de navegar na página da web com a tecla tab (não há modais na tela, apenas a página da web).

Tentei consertar jack126guy / sweetalert @ issue127 . Parece funcionar na medida em que o foco retorna para o botão na página.

No entanto, isso revela outro problema: você ainda não pode tabular para outro botão e, quando pressiona Enter para mostrar o alerta novamente, as coisas ficam estranhas.

Sim, tentei uma correção semelhante à sua, mas com uma variável global de janela para ter certeza de que é um elemento do site diferente de SweetAlert, ela focaliza o elemento no documento, mas a tecla Tab ainda não está funcionando.

O que parece ter corrigido por agora é a remoção de stopEventPropagation (e) na cláusula if (keycode == 9) no método handleKeyDown . Mas estou supondo que existem outros efeitos colaterais para isso ...

Eu mostraria um commit, mas fiz algumas outras alterações na biblioteca que outros podem não querer.

Portanto, caso alguém queira uma correção temporária para esse bug, aqui está um repositório que criei neste projeto: https://github.com/heero-yuy/sweetalert.git

Ele funciona 100% para todos os meus projetos até agora, mas não o testei extensivamente para ter certeza de que minhas alterações não quebraram nenhuma outra funcionalidade.

Consertei inserindo as duas linhas de código acima no início da função sweetAlert ou swal na linha 215, não sei se é a melhor solução, mas está funcionando para mim.

/*
 * Global sweetAlert function
 */
var sweetAlert, swal;

sweetAlert = swal = function() {

    if(previousWindowKeyDown !== undefined && window.onkeydown !== previousWindowKeyDown)`
        window.onkeydown = previousWindowKeyDown;

: +1:. Isso deve ter alguma prioridade.

A correção de @jayquest parece funcionar.

Para implementar a correção por @jayquest sem alterar a biblioteca, usei o seguinte código:

var previousWindowKeyDown = window.onkeydown;
swal ({
título: 'Tem certeza?',
closeOnConfirm: false,
closeOnCancel: false
}, function (isConfirm) {
window.onkeydown = previousWindowKeyDown;
if (isConfirm) {
swal ('Excluído!', 'Seu arquivo imaginário foi excluído.', 'sucesso');
} outro {
swal ('Cancelado', 'Seu arquivo imaginário está seguro :)', 'erro');
}
});

Para expandir a correção de

(function (){

    var _swal = window.swal;

    window.swal = function(){

        var previousWindowKeyDown = window.onkeydown;

        _swal.apply(this, Array.prototype.slice.call(arguments, 0));

        window.onkeydown = previousWindowKeyDown;

    };

})();

Também posso confirmar este bug e a solução alternativa acima também funciona bem! : +1:

Sim, a solução alternativa de @JustinWinthers funciona bem!

no entanto, parece falhar usando as teclas de escape e enter na caixa de diálogo

A solução alternativa de @amoralidad funcionou para mim. Obrigado!

obrigado @jayquest ... @ t4t5 corrija isso no branch master!

Acabei de enviar uma solicitação de pull com minha solução. https://github.com/t4t5/sweetalert/pull/547

@JustinWinthers , usar seu código quebra o type: 'input' . Ao tentar clicar no botão "Cancelar" para fechar a caixa de diálogo, aparece swal.showInputError is not a function .

Por exemplo, vá para http://clubcare.no/dashboard e toque em Glemt passord (esqueci a senha)

Remover sua função faz com que funcione novamente. Alguma ideia de como se livrar desse comportamento? Obrigado!

@jayquest Obrigado por corrigir este problema.

Olá @JustinWinthers

Tentei sua sugestão para corrigir esse problema de tabulação após a abertura do SweetAlert. Ele corrigiu o problema, no entanto, comecei a receber esse erro quando tento fechar o Sweetalert usando swal.close(); quando o botão cancel é clicado:

swal.close is not a function

Isso é semelhante ao que @EduardJS disse acima. Existe uma maneira de fazê-los funcionar? Acho que chegamos muito perto, mas devido a esse erro, tive que remover seu código sugerido. Qualquer ajuda será ótima.

Felicidades,
Neel.

A solução mais simples possível com base na solução alternativa de @JustinWinthers que consegui encontrar (sem modificar a biblioteca), é conectar apenas a função swal.close e definir window.onkeydown para o window.onkeydown manipulador de eventos

(function (){
    var close = window.swal.close;
    var previousWindowKeyDown = window.onkeydown;
    window.swal.close = function() {
        close();
        window.onkeydown = previousWindowKeyDown;
    };
})();

ou no meu caso ainda mais simples:

(function (){
    var close = window.swal.close;
    window.swal.close = function() {
        close();
        window.onkeydown = null;
    };
})();

Com esta solução alternativa, agora também é possível usar as teclas Enter e Escape na caixa de diálogo.

As mensagens de erro mencionadas por @ Mr-Anonymous e @EduardJS também não ocorrem mais.

@kosst Perfect. Muito obrigado por compartilhar isso. Tentei seu código e funciona perfeitamente. Muito obrigado!!

Felicidades,
Neel.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

yrshaikh picture yrshaikh  ·  4Comentários

waldyrious picture waldyrious  ·  5Comentários

voodoo6 picture voodoo6  ·  4Comentários

blackrosezy picture blackrosezy  ·  6Comentários

fracz picture fracz  ·  4Comentários