• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[JQuery] .one("load", ...) feuert nicht!

bodo92

Aktives Mitglied
Hallo, habe mir eine einfache kleine Bildergalerie mit JQuery und dem Bootstrap Modal erstellt.
Um das Bild optimal in die Fenstergröße einzupassen errechne ich über das Seitenverhältnis des Bildes die benötigte Breite des Modals.

Folgendes Problem:
Wird das erste Thumbnail geklickt öffnet sich die Galerie aber der Event-Listener der auf das Bild hört feuert nicht!
Wenn ich jedoch blättere wird die selbe Methode aufgerufen wie beim ersten klicken, hier wird die Größe des Modals jetzt wie gewünscht verändert.​

Mein JavaScript Objekt:
Hier wird in Zeile 9 der Listener auf das Bild gelegt dieser soll auslösen wenn die neu gesetzte Source geladen ist..
Code:
function Gallery() {
    this.images = [];
    this.count = 0;
    this.pointer = 0;
    this.show = function() {
        var picture = $("#gallery-picture");
        var modal = $("#gallery .modal-dialog");

        picture.one("load", function() {
            var window_height = window.innerHeight;
            var window_width = window.innerWidth;
            var img_ratio = picture.width() / picture.height();
            if ((window_height - 10) * img_ratio > window_width) {
                modal.css({width: window_width - 10});
            } else {
                modal.css({width: (window_height - 10) * img_ratio});
            }
        }).attr("src", this.images[this.pointer]);

        $("#gallery-pointer").text(this.pointer + 1);
        $("#gallery-count").text(this.count);
    };
    this.init = function (images, image) {
        this.images = images;
        this.count = images.length;
        this.pointer = $.inArray(image, this.images);
        this.show();
    };

    this.next = function() {
        if (this.pointer < this.count - 1) {
            this.pointer++;
        } else {
            this.pointer = 0;
        }
        this.show();
    };
    this.prev = function() {
        if (this.pointer > 0) {
            this.pointer--;
        } else {
            this.pointer = this.count - 1;
        }
        this.show();
    };
}
var galerie = new Gallery();

Meine JQuery Event-Listener:
Code:
$(".img-thumbnail").click(function() {
    var image = $(this).attr("src");
    var images = $(this).parent().find("img").map(function(){
        return $(this).attr('src')
    }).get();

    galerie.init(images, image);
    $("#gallery").modal("show");
});
$("#gallery-next").click(function() {
    galerie.next();
});
$("#gallery-prev").click(function() {
    galerie.prev();
});
$("#gallery-close").click(function() {
    $("#gallery").modal("hide");
});

EDIT:

Danke Vorab :)
 
Zuletzt bearbeitet:
Werbung:
Da kollidiert wohl etwas. Setze in der Konsole Breakpoints für das Script. Dann siehst du, dass beim ersten Klick
$("#gallery").modal("show");

ausgeführt wird, erst anschließend kommt
picture.one();
 
Hab den Fehler gefunden :rolleyes:

Zeile 12: img_ratio wurde nicht korrekt berechnet da width() und height() nicht gelesen werden konnte, habe das Seitenverhältnis jetzt über picture[0].naturalWidth / picture[0].naturalHeight berechnet und es klappt wunderbar!

Vielen Dank :)
 
Werbung:
Zurück
Oben