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
705   3  

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

    Ничего не найдено.