【问题标题】:Dynamically creating Bootstrap CSS alert messages动态创建 Bootstrap CSS 警报消息
【发布时间】:2012-02-16 09:53:20
【问题描述】:

我正在尝试使用用于 Bootstrap CSS 的 jQuery 插件动态创建警报消息。我想创建和销毁某些事件的警报(例如 AJAX 成功/错误)。这是我的代码的非工作 sn-p:

var alertVisible = false;
function fetchData() {
    function onDataReceived(stats) {
        if (alertVisible) {
            $(".alert-message").alert("close");
        }
        alertVisible = false;
        // Do stuff with data...
    }

    function onError() {
        $(".alert-message").alert();
        alertVisible = true;
    }

    $.ajax({
        dataType: 'json',
        success: onDataReceived,
        error: onError,
        cache: false
    });
};

这是相应的 HTML:

<div class="row">
  <div class="alert-message error fade in hide span16" data-alert="alert">
    <a class="close" href="#">&times;</a>
    <p>Lost connection to server.</p>
  </div>
</div>

我的第一个问题是警报默认显示。我可以通过使用hide 类来解决这个问题。但是,如果您关闭警报(通过单击关闭按钮),则创建新断言不再有效(我猜 DOM 元素已经消失)。您应该如何使用 Bootstrap 警报?

【问题讨论】:

    标签: javascript jquery css twitter-bootstrap


    【解决方案1】:

    这个答案是指 Bootstrap 2。

    当警报关闭时,它会从 DOM 中移除。

    如果您想稍后再次出现警报,请确保不要在关闭按钮中输入data-dismiss="alert",如下所示:

    <div class="alert fade in" id="login-error" style="display:none;">
        <button type="button" class="close">×</button>
        Your error message goes here...
    </div>
    

    然后,绑定关闭按钮以在按下警报时简单地隐藏警报:

    $('.alert .close').on('click', function(e) {
        $(this).parent().hide();
    });
    

    当您希望工具提示重新出现时,只需显示它即可。

    $('#login-error').show();
    

    【讨论】:

    • 顺便说一句,live 已从 jQuery 1.9+ 中消失;改用on
    【解决方案2】:

    您可以为警报动态添加 DOM 元素。

    Javascript:

    function addAlert(message) {
        $('#alerts').append(
            '<div class="alert">' +
                '<button type="button" class="close" data-dismiss="alert">' +
                '&times;</button>' + message + '</div>');
    }
    
    function onError() {
        addAlert('Lost connection to server.');
    }
    

    HTML:

    <div id="alerts"></div>
    

    在多个警报的情况下,此版本将导致多个警报堆积,最终用户必须单独解除这些警报。根据您期望的警报数量以及用户查看每个警报的重要性,您可能希望修改此设置以删除旧警报。

    此外,通过一些重构,您可以扩展它以创建除此错误警报之外的警告、信息和成功警报。

    【讨论】:

    • 更好的方法是通过.hide();$(document).ready (function() 隐藏html 中的整个警报文本。当需要警报时,可以显示该块,并动态插入带有信息文本的单个
    • 我认为这行不通,因为当用户关闭它时,Bootstrap 代码会从 DOM 中删除警报。
    • 最好将视图与控制器分开,这是您建议的一个优势。一种方法是按照您的建议将警报存储在 HTML 中,然后复制它(使用 JQuery 克隆)并将其显示为新块。如果需要,您可以修改每个警报的文本。您甚至可以使用 JavaScript 模板库,但如果您出于其他原因仍然使用其中的模板库,那么这样做可能才值得。
    【解决方案3】:

    我知道的最好方法:

    HTML:

    <div class="alert alert-block alert-error fade in" id="cert-error" style="display:none;">
        <button type="button" class="close" data-dismiss="alert">×</button>
        <h4 class="alert-heading">Этот файл не подходит!</h4>
        <p>Недопустимый тип файла! Выберите файл вида: *.cer, *.crt</p>
        <p>
            <a class="btn btn-danger" href="#">Take this action</a> <a class="btn" href="#">Or do this</a>
        </p>
    </div>
    

    JS:

    $('.alert .close').live("click", function(e) {
        $(this).parent().hide();
    });
    
    function showAlert() {
        $(".alert").addClass("in");
        $("#cert-error").show();
    }
    
    function closeAlert() {    
        $("#cert-error").hide();
    }
    

    现在我们可以使用 showAlert() 显示通知并使用 closeAlert() 隐藏它们。

    【讨论】:

      【解决方案4】:

      我采纳了 Eamonn 的答案并对其进行了一些改进,添加了可选的 typecloseDelay,以便您可以添加类型为 danger 的警报,该警报将在 5 秒后自动关闭,如下所示:

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

      为此,添加以下 JavaScript 函数:

      function showAlert(message, type, closeDelay) {
      
          var $cont = $("#alerts-container");
      
          if ($cont.length == 0) {
              // alerts-container does not exist, create it
              $cont = $('<div id="alerts-container">')
                  .css({
                       position: "fixed"
                      ,width: "50%"
                      ,left: "25%"
                      ,top: "10%"
                  })
                  .appendTo($("body"));
          }
      
          // default to alert-info; other options include success, warning, danger
          type = type || "info";    
      
          // create the alert div
          var alert = $('<div>')
              .addClass("fade in show alert alert-" + type)
              .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
          $cont.prepend(alert);
      
          // if closeDelay was passed - set a timeout to close the alert
          if (closeDelay)
              window.setTimeout(function() { alert.alert("close") }, closeDelay);     
      }
      

      【讨论】:

      • 好收获@SaiyajinGohan。如果您觉得答案有用,请点赞。谢谢。
      • 很不错,但作为一个jQuery插件会更好。您查询#alerts-container 两次,我会缓存该引用。此外,您可以使用 jQuery 的内置函数(如 attr("type", "button")addClass("alert") 等)构建更清晰、更易于维护的 HTML。已投赞成票,但乞求投票有点不受欢迎。
      【解决方案5】:

      我认为你是对的。在警报的“关闭”事件中,我们单击的整个 Dom 元素被破坏。因此我们无法检查该 id 的可见性属性。

      所以我的建议是'不要使用'close'类或 bootstrap-alerts.js 的关闭事件。 只需到那里查看类并尝试使用传统的隐藏显示或一些 jquery 技巧来完成我们的任务。

      【讨论】:

      • 我想另一种选择是每次我想显示警报时都在 DOM 中插入 HTML。
      • 是的,当我们每次必须显示不同的警报消息时,这可能是更好的选择..
      【解决方案6】:

      更改 removeElement() 函数。 bootstrap-alert.js 中的第 59 行:

      变化:

      .remove()
      

      收件人:

      .hide().css('opacity', 1);
      

      【讨论】:

        【解决方案7】:

        您可以考虑实现 Toastr 库(https://github.com/CodeSeven/toastr by John Papa)。 Toastr 为您提供本机 DOM 事件触发器所需的警报功能,或者您可以在 PageLoad 上显示通知。值得研究。

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签