2015-07-06 6 views
1

В Sitefinity CMS, я использую сценарий галереи, который, как представляется, компилируется в бэкэнд-файлах. Другими словами, я не могу получить доступ и изменить исходный код.Оберните динамический контент с помощью jQuery

Галерея работает так, как должно, но я хотел бы добавить к ней лайтбокс. Поэтому я начал использовать «wrapAll» в сочетании с загрузкой. Это работает на самом первом изображении, но как только следующее изображение загружается динамически (другими словами, изображение и окружающие теги заменяются), он перестает работать.

Я застрял. Любая идея?

Мой код:

$(window).on("load", function() { 
var i = 0; 
$(".galleria-images .galleria-image img").each(function() { 
    i++; 
    //alert(i); 
    var lightboximg = $(this).attr("src"); 
    $(this).wrap("<a href=" + lightboximg + " class='fancybox'></a>"); 

}); 
$(".fancybox").fancybox(); 
}) 

Я также попытался просто добавить FancyBox() в структуре, но это работает один раз, а также.

Сгенерированный HTML (как это должно быть):

<div style="position: relative; top: 0px; left: 0px; width: 100%; height: 100%;" class="galleria-images"> 
<div style="overflow: hidden; position: absolute; top: 0px; left: 0px; transition: none 0s ease 0s ; opacity: 0; z-index: 0;" class="galleria-image"><div style="position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; z-index: 2;" class="galleria-layer"></div> 
<div style="overflow: hidden; position: absolute; top: 0px; left: 0px; z-index: 4; background: rgb(0, 0, 0) none repeat scroll 0% 0%; display: none;" class="galleria-frame"> 
</div> 
</div> 
<div style="overflow: hidden; position: absolute; top: 0px; left: 0px; opacity: 1; width: 563px; height: 340px; transition: none 0s ease 0s ; z-index: 1;" class="galleria-image"><div style="position: absolute; top: 0px; left: 0px; right: 0px; bottom: 0px; z-index: 2; display: none; width: 563px; height: 352px;" class="galleria-layer"> 
</div> 
<div style="overflow: hidden; position: absolute; top: 0px; left: 0px; z-index: 4; background: rgb(0, 0, 0) none repeat scroll 0% 0%; display: none;" class="galleria-frame"> 
</div> 
<a href="/images/default-source/scholen/adm/administratief-en-juridisch-44.jpg?sfvrsn=2" class="fancybox"> 
<img src="/images/default-source/scholen/adm/administratief-en-juridisch-44.jpg?sfvrsn=2" style="display: block; opacity: 1; min-width: 0px; min-height: 0px; max-width: none; max-height: none; transform: translate3d(0px, 0px, 0px); width: 544px; height: 340px; position: absolute; top: -6px; left: 0px;" height="340" width="544"></a> 
</div> 
</div> 

следующее изображение выглядит так же, за исключением того, изображение не обернуты.

обновление

В конце концов решил ее убить и Galleria запустить его снова, используя свои собственные варианты. Выписка:

Galleria.configure({ 

extend: function (options) { 

    Galleria.log(this) // the gallery instance 
    Galleria.log(options) // the gallery options 

    // listen to when an image is shown 
    this.bind('image', function (e) { 

     Galleria.log(e) // the event object may contain custom objects, in this case the main image 
     Galleria.log(e.imageTarget) // the current image 

     lightboximg = jQuery(e.imageTarget).attr("src"); 
     jQuery(e.imageTarget).addClass('test'); 
     jQuery(e.imageTarget).wrap("<a href=" + lightboximg + " class='fancybox'></a>"); 
     $(".fancybox").fancybox(); 

    }); 
} 

});

ответ

0

Проблема заключается в том, что событие «load» запускается только один раз. Вот почему вы можете увидеть только одно обернутое изображение.

Вот простой способ сделать это:

HTML

<div id="container"> 
    Hello World 
</div> 

JS

(function() { 
    setInterval(function(){ 
     $("#container").append('<div class="item new">New Item</div>'); 
    }, 3000); 

    setInterval(function() { 
     $('.item').css('color', 'red'); 
     $('.item').removeClass('new'); 
    }, 100); 
})(); 

Fiddle

Даунсайд этого подхода является ненужной нагрузки на странице, поэтому если вам нужна производительность, взгляните на: Determining if a HTML element has been added to the DOM dynamically

Третий вариант, и лучший на мой взгляд, чтобы вызвать пользовательское событие при добавлении изображения, но для этого вам нужно будет изменить код, который на самом деле отвечает за добавление изображений на странице:

$(document).trigger('imageAdded'); 

$(document).on('imageAdded', function() {....}) 
+0

Спасибо вы за свой ответ. Чтобы быть честным, я действительно не знаю, что вы делали в первом скрипте. Я попробовал это, добавив класс (это сработало), но добавление или упаковка просто не было. Я в конце концов решил его, убив плагин galleria и снова инализируя его. Если у вас есть время, чтобы объяснить, почему addclass работает, но добавить это не так, мне бы очень хотелось узнать. Спасибо за Ваш ответ! – mat

+1

В сценарии у меня есть две функции, сначала добавляя элементы на страницу, чтобы имитировать ваш прецедент, второй ищет новые элементы и меняет стиль, а затем удаляет «новый» класс, поэтому он будет пропущен в следующий раз. Странно, но, обертывание работает для меня так же хорошо, как изменение цвета. Так что просто взгляните на обновленную скрипку: https://jsfiddle.net/s4jo3gxu/2/ Надеюсь, он ответит на ваш вопрос.Если нет, сообщите мне, мне также интересно. – Sargon

+0

Я действительно не знаю, почему мой не работает. Код кажется законным, и ваш пример работает нормально. Когда сайт приходит в производство (онлайн), я дам вам знать, чтобы вы могли взглянуть на него. Еще один вопрос. Почему ваш код работает, так это из-за 100 мс времени? Есть ли какое-нибудь другое решение, например, что-либо (изменение) или что-то в этом роде? – mat

 Смежные вопросы

  • Нет связанных вопросов^_^