В настоящее время я использую следующий код, позволяющий пользователю показывать/скрывать div на клике. При нажатии в любом месте за пределами div он закрывает div.
Однако в div есть ссылка, которая может открыть лайтбокс. Когда пользователь закрывает этот лайтбокс, он также закрывает div, в котором содержалась ссылка. Есть ли что-нибудь, что я могу добавить в скрипт, чтобы остановить это?
$(document).ready(function(){
$("a.dropdown-link").click(function(evt) {
evt.preventDefault();
var $div = $(this).next('.info-container');
$(".info-container").not($div).slideUp();
if ($div.is(":visible")) {
$div.slideUp()
} else {
$div.slideDown();
}
});
$(document).click(function(e){
var p = $(e.target).closest('.dropdown').length
if (!p) {
$(".info-container").slideUp();
}
});
$('.movie-link').magnificPopup({type:'iframe'});
});
<a class="dropdown-link" href="#"><div class="dropdown dropdown-processed">More info</div></a>
<div class="info-container" style="display: none;">Video preview: <a class="movie-link" href="videourl"></a></div>
Я использую Magnific Popup для лайтбокса: http://dimsemenov.com/plugins/magnific-popup/
Мои знания JavaScript довольно простые, поэтому любая помощь приветствуется.
В "нажмите, чтобы закрыть функцию div, вы можете проверить, включен ли лайтбокс или нет. Простой if ($("#lightbox").css("display") == "none")
должен иметь возможность делать трюк
EDIT: поместите эту строку после строки $(document).ready
var state = 0; // default state
$('.movie-link').click(function() { state = 1; }); // state = 1, lightbox on
в исходном коде, в строке 384, вставьте этот код
state = 2; //state = 2, lightbox close button clicked
идея не запускает функцию "закрыть div", когда состояние равно 1 (загорается лайтбокс и щелкает случайные предметы внутри или за пределами лайтбокса) или 2 (нажата кнопка закрытия лайтбокса), а состояние возврата - 0, когда это было 2
поэтому вместо того, if
я предоставил комментарий, используйте это
if (state == 2) {
state = 0;
} else if (state == 0) {
//rest of the code
}
это просто что-то, что я собрал и еще не проверил, поэтому я действительно не знаю, работает ли оно или нет, поэтому просто резервное копирование файлов js на всякий случай.
EDIT 2:
удалите все изменения в edit 1 и используйте это вместо if (state == 2) {
if (e.target != $('.mfp-bg')[0] and e.target != $('.mfp-wrap')[0]) {
ИЗМЕНИТЬ 3
var e_class = $(e.target).attr('class');
if (e_class != 'mfp-close' && e_class != 'mfp-container') {
рабочий пример: http://imgcrash.comeze.com/test.html
Попробуй это:
$("a.dropdown-link").click(function(evt) {
evt.preventDefault();
evt.stopPropagation(); //We stop the propagation of the event
//Changed it to slideToggle and added stop to prevent weird animation
//on multiple clicks
$(this).next('.info-container').stop().slideToggle()
});
$(document).click(function(e){
//Check if it has the class info-container
if (!$(e.target).hasClass("info-container")) {
$(".info-container").slideUp();
}
});
$('.movie-link').magnificPopup({type:'iframe'});
evt.stopPropagation
, я что-то упустил?
Я не 100%, не тестируя это, но вы можете столкнуться с проблемами с $(document).click(...);
поскольку щелчок в любом месте document
вызовет это событие.
Когда вы закрываете всплывающее окно, вы, вероятно, запускаете это событие и раздвигаете div info-container
.
Кажется, что вы ищете клики на .dropdown
с классом .dropdown
. Почему бы не использовать что-то вроде:
$('.dropdown').click(function(e) {... });
$(document)
на $('.dropdown')
и теперь он позволяет закрывать лайтбокс без закрытия div информационного контейнера, однако div не закрывается, когда пользователь щелкает где-то за его пределами. ,
var p = $(e.target).closest('.dropdown').length
?