Twitter Bootstrap предупреждающее сообщение закрыть и снова открыть
У меня проблема с предупреждающими сообщениями. Он отображается нормально, и я могу закрыть его, когда пользователь нажимает 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();
P. S! мне нужно показывать предупреждающее сообщение только после того, как произошло какое-то событие (например, нажата кнопка). Или кто я такой делать что-то не так?
11 ответов:
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>
Это, однако, должно использоваться только в том случае, если вы ленивы (что не очень хорошо, если вы хотите, чтобы поддерживаемое приложение).
Метод "сделай это правильно":
Создайте новый атрибут данных для скрытия элемент.
Javascript:
$(function(){ $("[data-hide]").on("click", function(){ $("." + $(this).attr("data-hide")).hide() // -or-, see below // $(this).closest("." + $(this).attr("data-hide")).hide() }) })
А затем измените данные-отклонить на данные-скрыть в разметке. пример в jsfiddle .
$("." + $(this).attr("data-hide")).hide()
Это скроет все элементы с классом, указанным в data-hide, т. е.:
data-hide="alert"
скроет все элементы с классом alert.Xeon06 предоставил альтернативное решение:
$(this).closest("." + $(this).attr("data-hide")).hide()
При этом будет скрыт только ближайший родительский элемент. Это очень полезно, если вы не хотите давать каждому оповещению уникальный класс. Пожалуйста, обратите внимание что, однако, вам нужно поместить кнопку закрытия в предупреждении.
Определение .ближайший из jQuery doc:
Для каждого элемента в наборе найдите первый элемент, соответствующий селектору, Протестировав сам элемент и пройдя вверх по его предкам в дереве DOM.
Я просто использовал переменную модели, чтобы показать / скрыть диалоговое окно и удалил
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">×</button> <strong>Error ! </strong>{{vm.exception}} </div>
Работает на меня и прекращает необходимость выходить на jquery
Если вы используете библиотеку 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">×</span> <span class="sr-only">Close</span> </button> Warning! Better check yourself, you're not looking too good. </div>
Я думаю, что хорошим подходом к этой проблеме было бы воспользоваться типом события Bootstrap
close.bs.alert
, чтобы скрыть предупреждение, а не удалять его. Причина, по которой Bootstrap предоставляет этот тип события, заключается в том, что вы можете перезаписать поведение по умолчанию удаления предупреждения из DOM.$('.alert').on('close.bs.alert', function (e) { e.preventDefault(); $(this).addClass('hidden'); });
Поэтому, если вы хотите решение, которое может справиться с динамическими html-страницами, поскольку вы уже включили его, вы должны использовать jQuery live, чтобы установить обработчик на все элементы, которые сейчас и в будущем находятся в dom или удаляются.
Я использую
$(document).on("click", "[data-hide-closest]", function(e) { e.preventDefault(); var $this = $(this); $this.closest($this.attr("data-hide-closest")).hide(); });
.alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d; } .alert { border: 1px solid transparent; border-radius: 4px; margin-bottom: 20px; padding: 15px; } .close { color: #000; float: right; font-size: 21px; font-weight: bold; line-height: 1; opacity: 0.2; text-shadow: 0 1px 0 #fff; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="alert alert-success"> <a class="close" data-hide-closest=".alert">×</a> <strong>Success!</strong> Your entries were saved. </div>
Я столкнулся с этой проблемой, а проблема с простым взломом кнопки закрытия заключается в том, что мне все еще нужен доступ к стандартным событиям bootstrap alert-close.
Мое решение состояло в том, чтобы написать небольшой настраиваемый плагин jquery, который вводит правильно сформированное предупреждение Bootstrap 3 (с кнопкой закрытия или без нее, как вам это нужно) с минимумом суеты и позволяет легко регенерировать его после закрытия коробки.
См. https://github.com/davesag/jquery-bs3Alert для использования, тестов и примеров.
Я согласен с ответом, опубликованным Хенриком Карлссоном и отредактированным Мартином Прикрилом. У меня есть одно предложение, основанное на доступности. Я бы добавил .attr ("aria-hidden", "true") до конца, так что это выглядит так:
$(this).closest("." + $(this).attr("data-hide")).attr("aria-hidden", "true");
Проблема вызвана использованием
style="display:none"
, вы должны скрыть предупреждение с Javascript или, по крайней мере, при его отображении, удалить атрибут style.
Основываясь на других ответах и изменении data-dismiss на data-hide, этот пример обрабатывает открытие предупреждения из ссылки и позволяет повторно открывать и закрывать предупреждение
$('a.show_alert').click(function() { var $theAlert = $('.my_alert'); /* class on the alert */ $theAlert.css('display','block'); // set up the close event when the alert opens $theAlert.find('a[data-hide]').click(function() { $(this).parent().hide(); /* hide the alert */ }); });
Я перепробовал все методы, и лучший способ для меня-использовать встроенные классы bootstrap
.fade
и.in
Пример:
<div class="alert alert-danger fade <?php echo ($show) ? 'in' : '' ?>" role="alert">...</div>
Примечание: в jQuery, addClass ('in'), чтобы показать предупреждение, removeClass ('in'), чтобы скрыть его.
забавный факт: это работает для всех элементов. Не просто предупреждения.
Вот решение, основанное на ответе от Хенрика Карлссона, но с правильным запуском события (на основе источников начальной загрузки):
$(function(){ $('[data-hide]').on('click', function ___alert_hide(e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector === '#' ? [] : selector) if (!$parent.length) { $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.hide() $parent.trigger($.Event('closed.bs.alert')) }) });
Ответ в основном для меня, как Примечание.