Photoswipe pswp класс не очищается после закрытия изображения
У меня есть Photoswipe (http://photoswipe.com ) галерея изображений на моем сайте, и класс css не сбрасывает / очищает, чтобы удалить представление после того, как я закрываю галерею во второй раз.
Исх.
Пользователь открывает пункт 1, AJAX заполняет рисунок(ы) в изображение div.
Пользователь щелкает изображение из пункта 1, и Photoswipe открывает изображение правильно (установив следующий класс):
class="pswp pswp--supports-fs pswp--open pswp--animate_opacity pswp--notouch pswp--css_animation pswp--svg pswp--animated-in pswp--visible"
Пользователь закрывает изображение из пункта 1, класс сбрасывается как обычно:
class="pswp"
Пользователь закрывается пункт 1 и JS/JQuery очищает весь html в picture div. Пользователь открывает пункт 2, AJAX заполняет рисунок в картинку div. Пользователь щелкает изображение из пункта 2, и Photoswipe открывает изображение, правильно устанавливая тот же класс, что и раньше.
class="pswp pswp--supports-fs pswp--open pswp--animate_opacity pswp--notouch pswp--css_animation pswp--svg pswp--animated-in pswp--visible"
Именно здесь возникает проблема. Пользователь закрывает изображение из пункта 2, и единственное, что меняется, это:
aria-hidden="true"
Но класс не проясняется, он остается:
class="pswp pswp--supports-fs pswp--open pswp--animate_opacity pswp--notouch pswp--css_animation pswp--svg pswp--animated-in pswp--visible"
Когда он должен измениться на:
class="pswp"
Это отключает все взаимодействие на веб-сайте, так как есть невидимый div/класс поверх всего. Класс должен быть каким-то образом изменен обратно на pswp.
AJAX/JS для заполнения изображения div (я добавил идентификатор к div):
if (i == 0) {
$('#listing_photos_container').append('<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"><a href="' + json[i].image_url + '" itemprop="contentUrl" data-size="512x400" data-index="' + i + '"><img src="' + json[i].image_url + '" height="400" width="600" itemprop="thumbnail" alt="listingPhoto" class="listing-photo"></a></figure>');
} else {
$('#listing_photos_container').append('<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject" class="listing-photo-holder"><a href="' + json[i].image_url + '" itemprop="contentUrl" data-size="512x400" data-index="' + i + '"><img src="' + json[i].image_url + '" height="400" width="600" itemprop="thumbnail" alt="listingPhoto" class="listing-photo-holder"></a></figure>');
}
JS/JQuery для очистки фото div:
$('#listing_photos_container').html('');
EDIT: функция прослушивания щелчка выполняется дважды, когда пользователь щелкает фотографию, чтобы вывести ее на полный экран. Это код для слушателя:
$.ajax({
type: "POST",
url: 'http://example.com/action?action=photos',
data: {id: id},
success: function (data) {
console.log('API Call - Photos');
json = JSON.parse(data);
$('#listing_photos_container').html('');
for (var i = 0; i < json.length; i++) {
// Styling code here
}
$('#list_header').html(
(function($) {
$('.picture').each( function() {
var $pic = $(this),
getItems = function() {
var items = [];
$pic.find('a').each(function() {
var $href = $(this).attr('href'),
$size = $(this).data('size').split('x'),
$width = $size[0],$height = $size[1];
var item = {
src : $href,
w : $width,
h : $height
}
items.push(item);
});
return items;
}
var items = getItems();
console.log('Items for PSWP' + items);
alert('Alert Point 1'); // This is called once, (as it should).
var $pswp = $('.pswp')[0];
$pic.on('click', 'figure', function(event) {
// This block is called twice..
alert('Click Funct');
event.preventDefault();
var $index = $(this).index();
var options = {
index: $index,
bgOpacity: 0.7,
showHideOpacity: true
}
// Initialize PhotoSwipe
alert('Setting new PhotoSwipe');
var lightBox = new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options);
lightBox.init();
}); // End $pic.on
});// End .picture each
})(jQuery)
); // End list_header.html
} // End AJAX Success
}); // End AJAX
3 ответов:
Вы, возможно, уже исправили это, но на случай, если кто-то другой упадет на это.
Это может произойти, если вы активируете открытие галереи несколько раз, не закрывая ее. Возможно, вы зарегистрировали несколько обработчиков кликов, чтобы открыть галерею, или по какой-то причине событие запускается дважды.
Это происходит потому, что в функции init извлекается и кэшируется текущее имя класса элемента pswp, а затем при уничтожении восстанавливается имя класса. Когда откроются вторые происходит без разрушения вызывается _initialClassName будет установлен в
class="pswp pswp--supports-fs pswp--open pswp--animate_opacity pswp--notouch pswp--css_animation pswp--svg pswp--animated-in pswp--visible", Как вы видитеСтрока 776 photoswipe.js, где initialclass установлен
_initalClassName = template.className;Остановите это в вашем браузере, чтобы увидеть, вызывается ли он несколько раз при открытии
Строка 942 далее функция уничтожения
destroy: function() { _shout('destroy');Остановите это в вашем браузере, чтобы убедиться, что он вызывается для каждого вызова open
Окончательное Решение
Проблема заключается в том, что при открытии всплывающее окно и загрузка изображений, которые вы заполняете
#listing_photos_containerсвоими фотографиями, а затем добавление обработчика щелчков для открытия photoswipe. Этот обработчик кликов добавляется к верхнему элементу, поэтому он останется при закрытии всплывающего окна, а затем при следующем его открытии будет добавлен новый обработчик кликов.Чтобы исправить это, вам просто нужно отвязать обработчик щелчка при закрытии всплывающего окна, вы можете сделать это с помощью
$(".picture").off('click');где-то внутри вашей функцииcloseListing()
Была аналогичная проблема-просто определить лайтбокс как глобальную переменную. И уничтожить определяют его как null. И в начале функции, где вы инициализируете lightBox, просто проверьте, если lightbox уже определен,а затем вернитесь.
Это довольно просто, перед каждым .щелчок(...) вам нужно писать .снимите привязку ("щелчок").
Пример:
$('a#open-photoswipe').unbind('click').click(function() { // open photoswipe here });
Comments