Сообщение об обновлении бутстрапа Twitter снова и снова
У меня проблема с сообщениями с предупреждением. Он отображается нормально, и я могу закрыть его, когда пользователь нажимает 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! Мне нужно показать предупреждающее сообщение только после того, как произошло какое-то событие (например, нажатие кнопки). Или что я делаю неправильно?
Ответы
Ответ 1
Data-dismiss полностью удаляет элемент. Вместо этого используйте метод jQuery.hide().
Метод исправить это быстро:
Используя встроенный javascript, чтобы скрыть элемент по клику вот так:
<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/cQNFL/
Однако это следует использовать только в том случае, если вы ленивы (что не очень хорошо, если вы хотите обслуживаемое приложение).
Метод "сделай это правильно":
Создайте новый атрибут данных для сокрытия элемента.
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"
скроет все элементы с классом alert.
Xeon06 предоставил альтернативное решение:
$(this).closest("." + $(this).attr("data-hide")).hide()
Это будет скрывать только ближайший родительский элемент. Это очень полезно, если вы не хотите назначать каждому предупреждению уникальный класс. Обратите внимание, что, однако, вам нужно поместить кнопку закрытия в оповещении.
Определение .closest от jquery doc:
Для каждого элемента в наборе получите первый элемент, который соответствует селектору, проверив сам элемент и пройдя через его предков в дереве DOM.
Ответ 2
Я просто использовал модельную переменную, чтобы показать/скрыть диалог и удалить 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
Ответ 3
Я думаю, что хорошим подходом к этой проблеме было бы использовать тип события Bootstrap close.bs.alert
, чтобы скрыть предупреждение, а не удалять его. Причина, по которой Bootstrap предоставляет этот тип события, заключается в том, что вы можете перезаписать поведение по умолчанию для удаления предупреждения из DOM.
$('.alert').on('close.bs.alert', function (e) {
e.preventDefault();
$(this).addClass('hidden');
});
Ответ 4
Если вы используете библиотеку 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>
http://jsfiddle.net/bce9gsav/5/
Ответ 5
Итак, если вам нужно решение, которое может справиться с динамическими страницами 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>
Ответ 6
Я столкнулся с этой проблемой, и проблема с просто взламыванием кнопки закрытия заключается в том, что мне по-прежнему нужен доступ к стандартным событиям бутстрапа-предупреждения-закрытия.
Моим решением было написать небольшой маленький настраиваемый плагин jquery, который вводит правильно сформированное предупреждение Bootstrap 3 (с кнопкой или без кнопки закрытия, поскольку вы нуждайтесь в ней) с минимумом суеты и позволяет легко восстановить его после закрытия коробки.
См. https://github.com/davesag/jquery-bs3Alert для использования, тестов и примеров.
Ответ 7
Я согласен с ответом, опубликованным Хенриком Карлссоном и отредактированным Мартином Прикрилом. У меня есть одно предложение, основанное на доступности. Я бы добавил .attr( "aria-hidden", "true" ) до конца, чтобы он выглядел так:
$(this).closest("." + $(this).attr("data-hide")).attr("aria-hidden", "true");
Ответ 8
Проблема вызвана использованием style="display:none"
, вы должны скрыть предупреждение с помощью Javascript или, по крайней мере, при его отображении, удалить атрибут стиля.
Ответ 9
В соответствии с другими ответами и изменением данных-увольнением скрыть данные, этот пример обрабатывает уведомление из ссылки и позволяет повторно открывать и закрывать предупреждение
$('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 */
});
});
Ответ 10
Я пробовал все методы, и лучший способ для меня - использовать встроенные классы начальной загрузки .fade
и .in
Пример:
<div class="alert alert-danger fade <?php echo ($show) ? 'in' : '' ?>" role="alert">...</div>
Примечание. В jQuery addClass ('in') для отображения предупреждения, removeClass ('in'), чтобы скрыть его.
Fun fact: Это работает для всех элементов. Не только оповещения.
Ответ 11
Вот решение, основанное на ответе Хенрика Карлссона, но с надлежащим инициированием событий (на основе источников Bootstrap):
$(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'))
})
});
Ответ в основном для меня, как записка.
Ответ 12
Все вышеперечисленные решения используют внешние библиотеки, либо angular, либо jQuery, и старую версию Bootstrap. Итак, вот решение Чарльза Уайка-Смита на чистом JavaScript, примененное к Bootstrap 4. Да, Bootstrap требует jQuery для собственного модального кода и кода предупреждений, но не все пишут свой собственный код с помощью jQuery.
Вот HTML-код предупреждения:
<div id="myAlert" style="display: none;"
class="alert alert-success alert-dismissible fade show">
<button type="button" class="close" data-hide="alert">×</button>
<strong>Success!</strong> You did it!
</div>
Обратите внимание, что изначально предупреждение скрыто (style="display: none;"
), и вместо стандартного data-dismiss="alert"
мы использовали здесь data-hide="alert"
.
Вот JavaScript, чтобы показать предупреждение и переопределить кнопку закрытия:
var myAlert = document.getElementById('myAlert');
// Show the alert box
myAlert.style.display = 'block';
// Override Bootstrap standard close action
myAlert.querySelector('button[data-hide]').addEventListener('click', function() {
myAlert.style.display = 'none';
});
Если вы хотите скрыть или показать предупреждение программным myAlert.style.display = 'none';
в другом месте кода, просто выполните myAlert.style.display = 'none';
или myAlert.style.display = 'block';
,