Nachladen?

Du rufst das unveil zweimal auf

dh. die html-auskommentierungs-syntax funktioniert bei scriptaufrufen nicht...? das "alte" script habe ich entfernt

und Du rufst es für alle img-Tags auf, d. h. es wirkt auch auf die Bilder in den iFrames

theoretisch soll das unveil auch in den iframes funktionieren und im moment entstehen genau deshalb die lücken weil das noch nicht angesprochen wird, oder nicht...? soweit ich es verstehe ist es dazu da, dass es erstmal platzhalter zeigt bis die entsprechende scrollposition erreicht wurde... nee?
wenn ich über diesen grandios-pfiffigen-supertrick $("img[data-src]").unveil(200); nur auf die imgs außerhalb der iframes zugreife verändert es leider die lückenbildung beim nachladen der videos nicht.
weise ich über $("img[data-videoid]").unveil(200); diese funktion nur den iframes zu, werden die anderen bilder zwar nicht mehr nachgeladen und bleiben bei dem platzhalter, allerdings verändert es das nachladeverhalten bzw. die anzeigdauer des platzhalters für die videos nicht...
das www sagt dass das nachladen via unveil auch bei iframes funktioniert: https://github.com/luis-almeida/unveil/issues/86
müsste es nicht an irgendeiner stelle im jquery.unveil.js auftauchen...? oder im scriptaufrunf hier irgendwo:
$("li > iframe").each(function (idx) {
var id = "video" + (idx + 1);
$(this).attr("id", id);
var videoid = $(this).attr("data-videoid");

solche feinheiten machen schon sehr viel freude wenn sie bedacht und geregelt werden und sind letztendlich für die endbenutzer überhaupt nicht wahrnehmbar dass es sie gibt und wie viel zeit und wissen das ganze gebraucht hat. gemerkt wird soetwas nur dann wenn es nicht da ist und irgendwelche dinge einfach nicht fluffig funktionieren...
 
Danke für die zahlreichen Videos und das Volkslied. Da gibt es ja doch einiges mit meinem Namen.

Da sind mir anscheinend ein paar Irrtümer unterlaufen:

die html-auskommentierungs-syntax funktioniert bei scriptaufrufen nicht...?
Da habe ich wohl etwas übersehen. Ja, wenn Du das Skript einschl. der <script>-Tags mit HTML-Kommentar-Zeichenfolgen auskommentierst, wird wahrscheinlich das Skript trotzdem ausgeführt.

Es trifft zu, dass unveil auch für iFrames funktioniert, jedoch nicht in unserem Fall, weil es keine einfachen iFrames mit src-Angabe sind, sondern die Inhalte durch die Youtube-API eingetragen werden.

Dass ein $("img").unveil() auch auf die GIFs in den iFrames wirkt, trifft nicht zu, denn Javascript/jQuery erfasst diese Inhalte nicht. Daher ist das nicht der Grund dafür, dass die GIFS so schnell verschwinden. In Wirklichkeit liegt es daran, dass sofort, wenn erkannt wird, dass der iFrame im Fenster liegt, über die Youtube-API das Laden des Videos angestoßen wird. Diese überschreibt sofort den iFrame mit ihrem eigenen Inhalt, so dass das GIF verschwindet. Man könnte das unterbinden, indem man das GIF nicht als Inhalt des iFrame definiert, sondern außerhalb und so, dass es den iFrame überdeckt. Die Youtube-API hat ein Event onplayerready oder so, damit könnte man dann das GIF erst ausblenden, wenn der Player wirklich fertig geladen ist. Probiere ich später.
 
Fertig.

Code:
        var players = {}, activeid = "";
        var domready = false, apiready = false;

        function onPlayerStateChange(event) {
            var id = $(event.target.a).attr("id");
            if (activeid != "" && activeid != id) {
                //players[acticeid].player.destroy();
                createPlayer(activeid);
            }
            activeid = id;
        }

        function onPlayerReady(event) {
            $(event.target.a).prev("img").hide();
        }

        function createPlayer(id) {
            $("#" + id).replaceWith('<div id="' + id + '"></div>');
            players[id].player = new YT.Player(id, {
                height: '113',
                width: '200',
                videoId: players[id].videoid,
                events: {
                    'onStateChange': onPlayerStateChange,
                    'onReady': onPlayerReady
                }
            });
            players[id].created = true;
        }

        function inView2(id) {
            $e = $("#" + id);
            //if ($e.is(":hidden")) return;
            var $w = $(window);
            var wt = $w.scrollTop(),
                wb = wt + $w.height(),
                et = $e.offset().top,
                eb = et + $e.height(),
                th = 200;

            return eb >= wt - th && et <= wb + th;
        }

        function createPlayers() {
            if (domready && apiready) {
                for (id in players) {
                    if (!players[id].created && inView2(id)) createPlayer(id);
                }
            }
        };


        function onYouTubeIframeAPIReady() {
            apiready = true;
            createPlayers();
        }

        $(document).ready(function () {
            $("img").unveil(200);
            $("li > iframe").each(function (idx) {
                var id = "video" + (idx + 1);
                $(this).attr("id", id);
                var videoid = $(this).attr("data-videoid");
                players[id] = {};
                players[id].videoid = videoid;
            });

            domready = true;
            createPlayers();
            $(window).on("scroll", createPlayers);
        });
CSS:
        .zitty li {
            position: relative;
        }
        .zitty img[src*='blind_02.gif'] {
            position: absolute;
            top: 0;
            left: 0;
            width: 200px;
            height: 113px;
            padding: 0;
            margin: 0;
HTML:
                    <img src="imgz/blind_02.gif" width="200" height="113" ><iframe width="200" height="113"  data-videoid="hJXT2V4wIPI" frameborder="0" allowfullscreen=allowfullscreen></iframe>
Wie Du siehst, habe ich im HTML das GIF vor den iFrame gestellt. Auch das geht sehr schnell mit einem globalen Ersetzen.
 
Zuletzt bearbeitet:
Ja, wenn Du das Skript einschl. der <script>-Tags mit HTML-Kommentar-Zeichenfolgen auskommentierst, wird wahrscheinlich das Skript trotzdem ausgeführt.

habe es ausprobiert - das script wird dank der auskommentierung nicht aufgerufen (die lade-gis werden nicht ersetzt und bleiben sichtbar.) aber es ist bestimmt grundsätzlich besser es einfach zu löschen...
 
Ich verstehe dich so, dass es funktioniert? Bist Du dann soweit zufrieden? In einem anderem Projekt, wo ich das Lazyloading implementiert habe, hatten wir das Problem, dass, wenn man schnell und weit nach unten scrollt, man alles dazwischen überfährt und dafür das Laden anstößt. Probier's mal aus. Es gibt eine einfache Lösung.
Danke, dass Du dir so viel Mühe mit der Seite über meinen Vornamen gemacht hast. Erstaunlich, dass Du so viel gefunden hast.
 
dass, wenn man schnell und weit nach unten scrollt, man alles dazwischen überfährt und dafür das Laden anstößt. Probier's mal aus. Es gibt eine einfache Lösung.

dank deiner hilfe ist es wirklich jetzt schon unglaublich großartig - vielen lieben dank für deine zeit, da war die seite mit deinem namen ein klacks (und ohne deine hilfe auch gar nicht machbar!). dieses problem ist mir auch schon aufgefallen, vor allem beim schnellen scrollen auf dem iphone, da entstehen leere räume und es dauert doch einige sekunden bis überhaupt irgendetwas erscheint, selbst das grau des divs wird nicht angezeigt... wenn die lösung wirklich einfach ist und du sie mir geben könntest würde ich sie selbstredend sehr gerne einsetzen.

allerdings habe ich noch so 30 namen vor mir, mit je 2-4 songs... habe mir in den letzten monaten meiner suche die zitate aus den liedern nicht gespeichert weil es ja erstmal nur eine cd mit je einem lied pro namen werden sollte... erstmal also schön suchen + die listen erstellen... grrrrrr (brauche einen praktikanten + ein einlese-script das dann automatisch die daten aus dem dokument herausliest und die listen erstellt. hehehehe)
mich nervt auch noch das blind.gif das ich kurz mal hochskaliert habe und die ränder der kreise nun so unscharf sind... werde ich vermutlich auch neu machen... irgendwann. fahre am donnerstag aber erstmal für zwei wochen in eine internetfreie zone und werde das wohl vorher ganz bestimmt nicht schaffen, fadammt!
 
Versuche, dieses:
Code:
$(window).on("scroll", createPlayers);
durch dieses zu ersetzen:
Code:
            var scrollHandle = null;
            $(window).on("scroll", function () {
                console.log("Scroll");
                if (scrollHandle) clearTimeout(scrollHandle);
                scrollHandle = setTimeout(createPlayers, delayScrolling);
            });
Das ist die Lösung aus dem anderen Projekt und diese wirkt jedoch nur auf die Videos. Ob ich es auch für die Bilder bzw. unveil machen kann, werde ich mir noch ansehen.
 
Das gleiche mit unveil war leichter als ich dachte. Ersetze das ganze Skript in jquery.unveil.js durch dieses:
Code:
/**
* jQuery Unveil
* A very lightweight jQuery plugin to lazy load images
* http://luis-almeida.github.com/unveil
*
* Licensed under the MIT license.
* Copyright 2013 Luís Almeida
* https://github.com/luis-almeida
*/

;(function($) {

  $.fn.unveil = function(threshold, callback) {

    var $w = $(window),
        th = threshold || 0,
        retina = window.devicePixelRatio > 1,
        attrib = retina? "data-src-retina" : "data-src",
        images = this,
        loaded;

    this.one("unveil", function() {
      var source = this.getAttribute(attrib);
      source = source || this.getAttribute("data-src");
      if (source) {
        this.setAttribute("src", source);
        if (typeof callback === "function") callback.call(this);
      }
    });

    function unveil() {
      var inview = images.filter(function() {
        var $e = $(this);
        if ($e.is(":hidden")) return;

        var wt = $w.scrollTop(),
            wb = wt + $w.height(),
            et = $e.offset().top,
            eb = et + $e.height();

        return eb >= wt - th && et <= wb + th;
      });

      loaded = inview.trigger("unveil");
      images = images.not(loaded);
    }

    //$w.on("scroll.unveil resize.unveil lookup.unveil", unveil);
    var scrollHandle = null;
    $w.on("scroll.unveil resize.unveil lookup.unveil", function () {
        if (scrollHandle) clearTimeout(scrollHandle);
        scrollHandle = setTimeout(unveil, 200);
    });

    unveil();

    return this;

  };

})(window.jQuery || window.Zepto);
Ganz am Ende siehst Du, was ich geändert habe und dass es genau analog zu der vorigen Änderung ist.
 
Zurück