2016-04-01 20 views
1

Ich versuche, eine jQuery-Plugin Leuchtkasten LightGallery folgendes Ergebnis genannt anpassen zu erreichen:jquery Auslöser (‚Klick‘) funktionieren nur einmal

1- Machen Sie das Skript holt alle Bilder aus einem Ordner, Indexinkrement mit als ein Bildpfad;

2- Öffnen Sie die Lightbox, nachdem Sie auf ein anderes Element geklickt haben.

Das Problem ist:

Das Plugin öffnet sich nur um den Leuchtkasten einmal!.

Ich benutze trigger('click'), um es zum ersten Mal zu feuern, aber nach dem Schließen und dem Versuch zu klicken, um es noch einmal zu wiederholen, funktioniert es nicht.

das Plugin sieht zerstört aus und es öffnet nur ein Bild!

Ich möchte, dass es die Lightbox jedes Mal öffnet, wenn ich auf die Zielelemente klicke.

Hier ist meine Versuche: (Pen here)

$(document).ready(function() { 
 

 
    var $lg = $('#lightgallery'); 
 

 
    function fetchFolderImages() { 
 
    var checkImages, endCheckImages; 
 
    var img; 
 
    var imgArray = new Array(); 
 
    var i = 1; 
 

 
    var myInterval = setInterval(loadImage, 1); 
 

 
    if ($lg.children().length > 0) { 
 
     checkImages = false; 
 
     endCheckImages = true; 
 
    } else { 
 
     checkImages = true; 
 
     endCheckImages = false; 
 
    } 
 

 
    function loadImage() { 
 
     if (checkImages) { 
 
     checkImages = false; 
 
     img = new Image(); 
 
     img.src = 'http://sachinchoolur.github.io/lightGallery/static/img/' + i + '.jpg'; 
 
     img.onload = moreImagesExists; 
 
     img.onerror = noImagesExists; 
 
     } 
 
     if (endCheckImages) { 
 
     clearInterval(myInterval); 
 
     console.log('function [loadImage] done'); 
 
     runLightGallery(); 
 
     return; 
 
     } 
 
    } 
 

 
    function moreImagesExists() { 
 
     imgArray.push(img); 
 
     $lg.append($('<a/>', { 
 
     'href': img.src 
 
     }).html(img)); 
 
     i++; 
 
     checkImages = true; 
 

 
     console.log('function [moreImagesExists] done'); 
 
    } 
 

 
    function noImagesExists() { 
 
     endCheckImages = true; 
 

 
     console.log('function [noImagesExists] done'); 
 
    } 
 

 
    console.log('function [fetchFolderImages] done'); 
 
    } 
 

 
    function runLightGallery() { 
 

 
    if ($lg.lightGallery()) { 
 
     //alert('working'); 
 
    } else { 
 
     //alert('destroyed'); 
 
     $lg.lightGallery({ 
 
     thumbnail: true 
 
     }); 
 

 
    } 
 
    //trigger click event on image to open the lightbox 
 
    $lg.children('a').trigger('click'); 
 

 
    //empty method, thought we may can use 
 
    $lg.on('onAfterOpen.lg', function(event) { 
 
     //maybe we can use this method? 
 
    }); 
 

 
    $lg.on('onCloseAfter.lg', function(event) { 
 
     $lg.children().remove(); 
 
     $lg.toggle(); 
 
     //$lg.lightGallery().destroy(true); 
 
    }); 
 

 
    console.log('function [runLightGallery] done'); 
 

 
    } 
 

 
    $('.gallery-item').each(function() { 
 
    $(this).on('click', function() { 
 
     $lg.toggle(); 
 
     fetchFolderImages(); 
 
    }); 
 
    }); 
 

 
});
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <link type="text/css" rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/lightgallery/1.2.16/css/lightgallery.css" /> 
 
</head> 
 

 
<body> 
 

 
    <div class="gallery"> 
 
    <div class="gallery-item">Gallery Item 1</div> 
 
    <div class="gallery-item">Gallery Item 2</div> 
 
    <div class="gallery-item">Gallery Item 3</div> 
 
    </div> 
 

 
    <div id="lightgallery" style="display: none; border: 5px solid red"></div> 
 

 
    <!--============== scripts ==============--> 
 
    <!-- jQuery --> 
 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.js"></script> 
 
    <!-- jQuery mouse wheel --> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.js"></script> 
 
    <!-- lightGallery : a lightbox jQuery plugin --> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/lightgallery/1.2.16/js/lightgallery.js"></script> 
 
    <!-- lightGallery plugin for thumbnails --> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/lightgallery/1.2.16/js/lg-thumbnail.js"></script> 
 

 
</body> 
 

 
</html>

Antwort

2

LightGallery muss wieder

zerstört und initialisiert werden

zerstören LightGallery diesen Code verwenden $lg.data('lightGallery').destroy(true);

Quelle: https://github.com/sachinchoolur/lightGallery/issues/238#issuecomment-161020492

Pen

$(document).ready(function() { 
 

 
    var $lg = $('#lightgallery'); 
 

 
    function fetchFolderImages() { 
 
    var checkImages, endCheckImages; 
 
    var img; 
 
    var imgArray = new Array(); 
 
    var i = 1; 
 

 
    var myInterval = setInterval(loadImage, 1); 
 

 
    if ($lg.children().length > 0) { 
 
     checkImages = false; 
 
     endCheckImages = true; 
 
    } else { 
 
     checkImages = true; 
 
     endCheckImages = false; 
 
    } 
 

 
    function loadImage() { 
 
     if (checkImages) { 
 
     checkImages = false; 
 
     img = new Image(); 
 
     img.src = 'http://sachinchoolur.github.io/lightGallery/static/img/' + i + '.jpg'; 
 
     img.onload = moreImagesExists; 
 
     img.onerror = noImagesExists; 
 
     } 
 
     if (endCheckImages) { 
 
     clearInterval(myInterval); 
 
     console.log('function [loadImage] done'); 
 
     runLightGallery(); 
 
     return; 
 
     } 
 
    } 
 

 
    function moreImagesExists() { 
 
     imgArray.push(img); 
 
     $lg.append($('<a/>', { 
 
     'href': img.src 
 
     }).html(img)); 
 
     i++; 
 
     checkImages = true; 
 

 
     console.log('function [moreImagesExists] done'); 
 
    } 
 

 
    function noImagesExists() { 
 
     endCheckImages = true; 
 

 
     console.log('function [noImagesExists] done'); 
 
    } 
 

 
    console.log('function [fetchFolderImages] done'); 
 
    } 
 

 
    function runLightGallery() { 
 

 
    if ($lg.lightGallery()) { 
 
     //alert('working'); 
 
    } else { 
 
     //alert('destroyed'); 
 
     $lg.lightGallery({ 
 
     thumbnail: true 
 
     }); 
 

 
    } 
 
    //trigger click event on image to open the lightbox 
 
    $lg.children('a').trigger('click'); 
 

 
    //empty method, thought we may can use 
 
    $lg.on('onAfterOpen.lg', function(event) { 
 
     //maybe we can use this method? 
 
    }); 
 

 
    $lg.on('onCloseAfter.lg', function(event) { 
 
     $lg.children().remove(); 
 
     $lg.toggle(); 
 
     $lg.data('lightGallery').destroy(true); 
 
    }); 
 

 
    console.log('function [runLightGallery] done'); 
 

 
    } 
 

 
    $('.gallery-item').each(function() { 
 
    $(this).on('click', function() { 
 
     $lg.toggle(); 
 
     fetchFolderImages(); 
 
    }); 
 
    }); 
 

 
});
<html> 
 

 
<head> 
 
    <link type="text/css" rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/lightgallery/1.2.16/css/lightgallery.css" /> 
 
</head> 
 

 
<body> 
 

 
    <div class="gallery"> 
 
    <div class="gallery-item">Gallery Item 1</div> 
 
    <div class="gallery-item">Gallery Item 2</div> 
 
    <div class="gallery-item">Gallery Item 3</div> 
 
    </div> 
 

 
    <div id="lightgallery" style="display: none; border: 5px solid red"></div> 
 

 
    <!--============== scripts ==============--> 
 
    <!-- jQuery --> 
 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.js"></script> 
 
    <!-- jQuery mouse wheel --> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.js"></script> 
 
    <!-- lightGallery : a lightbox jQuery plugin --> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/lightgallery/1.2.16/js/lightgallery.js"></script> 
 
    <!-- lightGallery plugin for thumbnails --> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/lightgallery/1.2.16/js/lg-thumbnail.js"></script> 
 

 
</body> 
 

 
</html>

+0

Vielen Dank Ammar, ich schätze es! :) – Homer

0

ich durch den Code schnell und sah Sie dynamische Daten werden geladen sogar Delegation versuchen, https://learn.jquery.com/events/event-delegation/ Das Problem, das ist bei der Moment der Ereignisbindung, nicht alle "a" -Elemente, die wirklich existieren, um ein Ereignis darauf zu binden

Ihr Triggerereignis sollte so etwas wie

$(document).on('click','#someId a:first-child',function(){ 

}) 
1

Sie zerstören LightGallary nicht den richtigen Weg.

verwenden für 'onCloseAfter.lg' Veranstaltung:

$lg.on('onCloseAfter.lg', function(event) { 
    $lg.children().remove(); 
    $lg.toggle(); 
    //$lg.lightGallery().destroy(true); 
    $lg.data('lightGallery').destroy(true); 
}); 
+0

Vielen Dank Mohamed, ich schätze es! :) – Homer

Verwandte Themen