Twitter Bootstrap 警报消息关闭并再次打开

IT技术 javascript jquery twitter-bootstrap alert
2021-02-12 21:24:32

我有警报消息的问题。它正常显示,当用户按下x(关闭)时我可以关闭它,但是当用户尝试再次显示它时(例如,单击按钮事件)则不显示。(此外,如果我将此警报消息打印到控制台,则等于[]。)我的代码在这里:

 <div class="alert" style="display: none">
   <a class="close" data-dismiss="alert">×</a>
   <strong>Warning!</strong> Best check yo self, you're not looking too good.
 </div>

和事件:

 $(".alert").show();

附注!我只需要在发生某些事件(例如,单击按钮)后才显示警报消息。或者我做错了什么?

6个回答

Data-dismiss 完全删除元素。改用 jQuery 的 .hide() 方法。

快速修复方法:

使用内联 javascript 隐藏元素 onclick,如下所示:

<div class="alert" style="display: none"> 
    <a class="close" onclick="$('.alert').hide()">×</a>  
    <strong>Warning!</strong> Best check yo self, you're not looking too good.  
</div>

<a href="#" onclick="$('alert').show()">show</a>

http://jsfiddle.net/cQNF​​L/

然而,这应该只在你懒惰的时候使用(如果你想要一个可维护的应用程序,这不是一件好事)。

正确做法:

创建用于隐藏元素的新数据属性。

Javascript:

$(function(){
    $("[data-hide]").on("click", function(){
        $("." + $(this).attr("data-hide")).hide()
        // -or-, see below
        // $(this).closest("." + $(this).attr("data-hide")).hide()
    })
})

然后在标记中将 data-dismiss 更改为 data-hide。jsfiddle 中的示例

$("." + $(this).attr("data-hide")).hide()

这将隐藏具有在 data-hide 中指定的类的所有元素,即:data-hide="alert"将隐藏具有警报类的所有元素。

Xeon06提供了另一种解决方案:

$(this).closest("." + $(this).attr("data-hide")).hide()

这只会隐藏最近的父元素。如果您不想给每个警报一个唯一的类,这将非常有用。但是请注意,您需要将关闭按钮放在警报中。

jquery doc中 .closest 的定义

对于集合中的每个元素,通过测试元素本身并在 DOM 树中向上遍历其祖先来获取与选择器匹配的第一个元素。

新来的..你会在哪里定义'$(function(){..'
2021-03-19 21:24:32
JavaScript 文件或 <script>code here</script> 标记中的任何位置。
2021-03-21 21:24:32
是的,我没想过让它以这种方式工作。然而,这将在一定程度上消除该解决方案的简单性。我会将其添加为现有代码的注释。谢谢!
2021-03-24 21:24:32
如果您使用 $(document).on('click', '[data-hide]', function() { /* */ }) 您的答案将是完美的;)
2021-04-03 21:24:32
嘿!关于你做正确的答案。这将隐藏alert页面上具有相同类(即)的每个元素对此的解决方案是用这一行替换回调的内容$(this).closest("." + $(this).attr("data-hide")).hide();,这只会影响最近的父元素,因为关闭按钮通常放置在它影响的警报中。
2021-04-12 21:24:32

我只是使用模型变量来显示/隐藏对话框并删除了 data-dismiss="alert"

例子:

<div data-ng-show="vm.result == 'error'" class="alert alert-danger alert-dismissable">
    <button type="button" class="close" data-ng-click="vm.result = null" aria-hidden="true">&times;</button>
    <strong>Error  !  </strong>{{vm.exception}}
</div>

对我有用,不再需要去 jquery

我认为解决这个问题的一个好方法是利用 Bootstrap 的close.bs.alert事件类型来隐藏警报而不是删除它。Bootstrap 公开此事件类型的原因是,您可以覆盖从 DOM 中删除警报的默认行为。

$('.alert').on('close.bs.alert', function (e) {
    e.preventDefault();
    $(this).addClass('hidden');
});

如果您使用的是 MVVM 库,例如 Knockout.js(我强烈推荐),您可以更简洁地进行操作:

<div class="alert alert-info alert-dismissible" data-bind="visible:showAlert">
   <button type="button" class="close" data-bind="click:function(){showAlert(false);}>
        <span aria-hidden="true">&times;</span>
        <span class="sr-only">Close</span>
   </button>
   Warning! Better check yourself, you're not looking too good.
</div>

http://jsfiddle.net/bce9gsav/5/

@Leo 以什么方式突兀?
2021-03-19 21:24:32
data-bind="click:function(){showAlert(false);}是一个很好的例子突兀的JavaScript是远未吸尘器我强烈建议不要遵循这种方法
2021-03-20 21:24:32
不,我实际上说的是使用关注点分离您的视图 (html) 不应包含任何 javascript,负面影响在开发团队中可能是巨大的。这是关于 Knockout 和有点争议的data-bind属性stackoverflow.com/questions/13451414/unobtrusive-knockout 的好问题(和答案)
2021-03-25 21:24:32
你认为“JavaScript”是什么?如果它只包含要调用的方法的名称怎么办?是不是它用一个参数(false)调用它,使它在你眼中显得突兀?
2021-03-31 21:24:32
各方面都很突兀。您正在积极地将行为“嵌入”到您的 html 结构/标记中。想象一下,您必须更改这种行为……您必须更改多少个页面和 html 元素?不要误会我的意思,它仍然回答了提出的问题,这就是为什么我不会对它投反对票。但这远非“更清洁”的解决方案
2021-04-05 21:24:32

这对我最有效:

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