Como fechar alertas automaticamente usando o Twitter Bootstrap

90

Estou usando o framework CSS de bootstrap do Twitter (o que é fantástico). Para algumas mensagens aos usuários, estou exibindo-as usando os alertas Javascript JS e CSS.

Para os interessados, ele pode ser encontrado aqui: http://getbootstrap.com/javascript/#alerts

Meu problema é este; depois de exibir um alerta para um usuário, gostaria que ele desaparecesse após algum intervalo de tempo. Com base nos documentos do Twitter e no código que examinei, parece que não está incluído:

  • Minha primeira pergunta é um pedido de confirmação de que isso NÃO está incluído no Bootstrap
  • Em segundo lugar, como posso alcançar esse comportamento?
Mario Zigliotto
fonte
Dê uma olhada aqui stackoverflow.com/questions/23101966/… essa é a melhor resposta que encontrei
Andres,

Respostas:

108

Chamar window.setTimeout(function, delay)permitirá que você faça isso. Aqui está um exemplo que fecha automaticamente o alerta 2 segundos (ou 2.000 milissegundos) depois de ser exibido.

$(".alert-message").alert();
window.setTimeout(function() { $(".alert-message").alert('close'); }, 2000);

Se você quiser envolvê-lo em uma função bacana, você pode fazer isso.

function createAutoClosingAlert(selector, delay) {
   var alert = $(selector).alert();
   window.setTimeout(function() { alert.alert('close') }, delay);
}

Então você pode usá-lo assim ...

createAutoClosingAlert(".alert-message", 2000);

Tenho certeza de que existem maneiras mais elegantes de fazer isso.

Jessegavin
fonte
Ei jesse, obrigado! o setTimeout funciona e eu irei selecioná-lo como uma solução válida, mas parece que o comportamento deve de fato ser incluído como TK Kocheran declarou (e registrado).
Mario Zigliotto,
Eu olhei para o código de bootstrap do Twitter e não vi nenhum suporte para alertas de fechamento automático.
jessegavin
Sim - estou esperando a resposta de TK porque a partir de sua mensagem aqui parece que a funcionalidade de fechamento automático deveria estar lá e não está - mas o relatório de bug no github não faz referência a isso.
Mario Zigliotto,
Sim, eles não alegam ser capazes de fechar alertas automaticamente, apenas podem fechá-los programaticamente com o plugin jQuery fornecido. ou seja $('#myAlert').alert('close'), não funciona como anunciado.
Naftuli Kay,
Você pode querer estender jQuery e despachar esse método fora do objeto, como: $('#my_fancy_alert').createAutoClosingAlert(2000). Você só precisa passar $(this).remove()ou $(this).alert('close')em setTimeoutretorno.
aL3xa
99

Eu também não consegui fazer funcionar com o alerta. ('Fechar').

No entanto, estou usando isso e funciona muito bem! O alerta desaparecerá após 5 segundos e, uma vez removido, o conteúdo abaixo dele deslizará para sua posição natural.

window.setTimeout(function() {
    $(".alert-message").fadeTo(500, 0).slideUp(500, function(){
        $(this).remove(); 
    });
}, 5000);
moogboy
fonte
Definitivamente, uma ótima solução. O alerta desaparece muito bem após o curto intervalo. Parece muito profissional.
Matt Setter
Trabalhando rápido e muito bem.
Mohamed Anis Dahmani
1
Ele precisa ser chamado sempre que o alerta é exibido ou funciona automaticamente para todos os alertas com classe .alert-message? Tendo problemas, a classe no meu alerta BS3 é alert alert-danger alert-block, então eu deveria usar .alert, alert-dangerou o nome completo da classe na função de tempo limite?
raffian
@raffian Coloque assim: $(".alert-message,.alert-danger,.alert-info")e assim por diante. Você tem que descobrir se quer isso em todo o seu site ou não. Se você quiser em todas as páginas, por exemplo, na folha do Laravel você pode usar algo como @include ('scripts-alerts') ou @yield ('alerts'). Você tem que descobrir ou fazer uma pergunta específica no stackoverflow e não aqui ...
Pathros
1
A melhor maneira de fazer isso. Deve ser marcada como a resposta correta @Mario Zigliotto, pois outros elementos deslizam lentamente e não mudam de posição imediatamente. Isso parece muito mais bonito e profissional.
Torsten Barthel
4

Eu tive o mesmo problema ao tentar lidar com alertas popping e atenuá-los. Procurei em vários lugares e descobri que essa era a minha solução. Adicionar e remover a classe 'in' corrigiu meu problema.

window.setTimeout(function() { // hide alert message
    $("#alert_message").removeClass('in'); 

}, 5000);

Ao usar .remove () e, da mesma forma, a solução .alert ('close'), parecia que encontrei um problema com o alerta sendo removido do documento, portanto, se eu quisesse usar o mesmo alerta div novamente, não consegui. Esta solução significa que o alerta pode ser reutilizado sem atualizar a página. (Eu estava usando o aJax para enviar um formulário e apresentar feedback ao usuário)

    $('#Some_Button_Or_Event_Here').click(function () { // Show alert message
        $('#alert_message').addClass('in'); 
    });
Mark Daniel
fonte
3

Usar a ação 'fechar' no alerta não funciona para mim, porque ela remove o alerta do DOM e eu preciso do alerta várias vezes (estou postando dados com ajax e mostro uma mensagem para o usuário em cada postagem) . Por isso criei esta função que cria o alerta sempre que preciso e depois inicia um cronômetro para fechar o alerta criado. Passo para a função o id do container ao qual desejo anexar o alerta, o tipo de alerta ('sucesso', 'perigo', etc.) e a mensagem. Aqui está o meu código:

function showAlert(containerId, alertType, message) {
    $("#" + containerId).append('<div class="alert alert-' + alertType + '" id="alert' + containerId + '">' + message + '</div>');
    $("#alert" + containerId).alert();
    window.setTimeout(function () { $("#alert" + containerId).alert('close'); }, 2000);
}
Daniele Armanasco
fonte
2

Esta é a versão do coffescript:

setTimeout ->
 $(".alert-dismissable").fadeTo(500, 0).slideUp(500, -> $(this.remove()))
,5000
Johniboy
fonte
2

Com cada uma das soluções acima, continuei a perder a reutilização do alerta. Minha solução foi a seguinte:

No carregamento da página

$("#success-alert").hide();

Uma vez que o alerta precisava ser exibido

 $("#success-alert").show();
 window.setTimeout(function () {
     $("#success-alert").slideUp(500, function () {
          $("#success-alert").hide();
      });
 }, 5000);

Observe que fadeTo define a opacidade como 0, então a exibição era nenhuma e a opacidade era 0, por isso removi da minha solução.

biggles
fonte
0

Depois de examinar algumas das respostas aqui e em outro tópico, aqui está o que eu terminei:

Criei uma função chamada showAlert()que adicionaria dinamicamente um alerta, com um opcional typee closeDealy. Para que você possa, por exemplo, adicionar um alerta do tipo danger(ou seja, alerta-perigo do Bootstrap) que fechará automaticamente após 5 segundos, assim:

showAlert("Warning message", "danger", 5000);

Para isso, adicione a seguinte função Javascript:

function showAlert(message, type, closeDelay) {

    if ($("#alerts-container").length == 0) {
        // alerts-container does not exist, add it
        $("body")
            .append( $('<div id="alerts-container" style="position: fixed;
                width: 50%; left: 25%; top: 10%;">') );
    }

    // default to alert-info; other options include success, warning, danger
    type = type || "info";    

    // create the alert div
    var alert = $('<div class="alert alert-' + type + ' fade in">')
        .append(
            $('<button type="button" class="close" data-dismiss="alert">')
            .append("&times;")
        )
        .append(message);

    // add the alert div to top of alerts-container, use append() to add to bottom
    $("#alerts-container").prepend(alert);

    // if closeDelay was passed - set a timeout to close the alert
    if (closeDelay)
        window.setTimeout(function() { alert.alert("close") }, closeDelay);     
}
isapir
fonte
0

Eu precisava de uma solução muito simples para esconder algo depois de algum tempo e consegui fazer isso funcionar:

No angular, você pode fazer isso:

$timeout(self.hideError,2000);

Aqui está a função que chamo quando o tempo limite é atingido

 self.hideError = function(){
   self.HasError = false;
   self.ErrorMessage = '';
};

Portanto, agora meu diálogo / ui pode usar essas propriedades para ocultar elementos.

Leeroya
fonte
0

Com atraso e desvanecimento:

setTimeout(function(){
    $(".alert").each(function(index){
        $(this).delay(200*index).fadeTo(1500,0).slideUp(500,function(){
            $(this).remove();
        });
    });
},2000);
GigolNet Guigolachvili
fonte
0

tente este

$(function () {

 setTimeout(function () {
            if ($(".alert").is(":visible")){
                 //you may add animate.css class for fancy fadeout
                $(".alert").fadeOut("fast");
            }

        }, 3000)

});
danny
fonte