/** * backdrop-guard.js -- rede de seguranca para o overlay escuro (.modal-backdrop) * que fica preso na tela. * * Causa: run() usa $.ajax({async:false}) e chama aguarde.showAguarde() no * beforeSend + hideAguarde() no always. Como a thread fica bloqueada, o show e o * hide do modal do Bootstrap acontecem dentro do mesmo tick e a transicao CSS * nunca roda ate o fim -- o callback que remove o backdrop e descartado. Em * chamadas encadeadas (run dentro do callback de outro run) os backdrops ainda * se empilham, deixando a tela escura. Como o modal "Aguarde" e data-backdrop * static, clicar nele nao fecha nada e so o F5 resolve. * * Este arquivo NAO altera o JS legado: apenas observa e limpa backdrops orfaos * (isto e, quando nao ha nenhum modal realmente visivel). Se houver modal * aberto de verdade, o comportamento atual do Bootstrap e preservado. */ (function ($) { 'use strict'; if (!$) { return; } var DELAY_TRANSICAO = 350; // .modal.fade do Bootstrap 3 leva 300ms function modalVisivel() { var achou = false; $('.modal').each(function () { if ($(this).css('display') === 'block' && $(this).height() > 0) { achou = true; return false; } }); return achou; } /** * Remove backdrops que sobraram. Com modal aberto, mantem apenas um backdrop * (os extras vem dos shows empilhados) e nao mexe em mais nada. */ function limpaBackdrop() { var $backdrops = $('.modal-backdrop'); if (modalVisivel()) { if ($backdrops.length > 1) { $backdrops.slice(0, $backdrops.length - 1).remove(); return true; } return false; } if (!$backdrops.length && !$('body').hasClass('modal-open')) { return false; } $backdrops.remove(); $('body').removeClass('modal-open').css('padding-right', ''); return true; } function limpaComAtraso() { window.setTimeout(limpaBackdrop, DELAY_TRANSICAO); } // Exposto para o codigo legado poder chamar direto quando precisar. window.limpaBackdropTravado = limpaBackdrop; $(function () { // 1) Clicar no overlay preso tira ele da frente. // Com modal aberto de verdade, quem decide continua sendo o Bootstrap. $(document).on('click', '.modal-backdrop', function () { limpaBackdrop(); }); // 2) Esc tambem serve de escape. $(document).on('keydown', function (e) { if (e.which === 27) { limpaComAtraso(); } }); // 3) Depois que o Bootstrap termina de fechar um modal. $(document).on('hidden.bs.modal', limpaComAtraso); // 4) Quando todo o trafego ajax da pagina termina -- pega o caso do // run() sincrono encadeado, que e onde o overlay costuma travar. $(document).ajaxStop(limpaComAtraso); }); })(window.jQuery);