Avatar billede Slettet bruger
21. juli 2011 - 22:46 Der er 7 kommentarer og
1 løsning

Jquery galleri driller!

Jeg håber i kloge hoveder kan hjælpe mig!

JQuery er forholdsvis nyt for mig, og som en øvelse vil jeg lave et galleri.
Det er også gået fint nok, dog driller det mig!

Første gang man bladre igennem en gruppe billeder virker det helt som planlagt. Lukker man den guppe og åbner en ny er fanden løs!

Den springer fra f.eks 1 til 5. Det går jo ikke!

En demo kan ses på http://jsfiddle.net/mortenhauberg/ukkfK/

Her er en udgave ( http://jsfiddle.net/mortenhauberg/dwtwC/ ) hvor jeg har smidt en alert på hver gang den skifter billede og man kan se at id'et skifter 2 gange før billedet dukker op.

Hvorfor gør den det??
Har stirret på det i lang tid nu og kan simpelthen ikke se hvor fejlen er!

Beklager hvis koden er grim og bøvlet. Som sagt er jeg ny!


Morten Hauberg
Avatar billede Slettet bruger
24. juli 2011 - 11:01 #1
Jeg TROR det skyldes "flimmer" med globale/lokale variabler.
Det er lidt svært at overskue, "grupperne" kræver mere tid end jeg liige ku' afse : )
- så jeg kan desværre ikke pege på fejlen.

Men give et råd: Erklær dine variabler, total f.eks. hvor hører den hjemme ?

Bruger du globale variabler (det KAN være nødvendigt) så erklær dem "i toppen": var total = 0;
I stedet for at regne med, at du kan forudsige hvor de bruges første gang..
- Med jQuery opstår der let "event-spaghetti" : )
Avatar billede Slettet bruger
24. juli 2011 - 14:46 #2
Det lyder meget fornuftigt :)

Jeg kan bare ikke finde ud af det!

Kan du prøve at give mig et eksempel, virkelig skåret ud i pap :)?
Avatar billede Slettet bruger
24. juli 2011 - 21:00 #3
Jeg nappede indholdet i nederste højre hjørne på jsFiddle - og fiflede med det : )
<!DOCTYPE html>
<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title> Kvægdemo by mortenhauberg</title>
<script type='text/javascript' src='http;//code.jquery.com/jquery-1.6.2.js'></script>

<!-- ved ikke hvad de 2 nedenstående er... Noget Fiddlehalløj måske? -->
<!--link rel="stylesheet" type="text/css" href="/css/normalize.css"-->
<!--link rel="stylesheet" type="text/css" href="/css/result-light.css"-->
 
<style type='text/css'>
#Explain
    {
    background-color: #FFF;
    height:25px;
    font-size: 20px;
    padding:0 4px;
    }
#alt-text
    {
    float:left;
    font-style:italic;
    }
#close_img
    {
    float: right;
    cursor: pointer;
    }
#Pagination
    {
    color: #FFF;
    text-align:center;
    }
#Pagination p
    {
    display: inline;
    cursor: pointer;
    }
#show_img
    {
    width: auto;
    cursor: pointer;
    }
#Gallery
    {
    position: relative;
    }
#Gallery > img
    {
    max-height: 150px;
    cursor: pointer;
    }
#img_box
    {
    vertical-align:middle;
    display:table-cell;
    }
#img_bg
    {
    position:fixed;
    top:0;
    left:0;
    width:100%;
    height:100%;
    background:rgba(0,0,0,0.7);
    z-index:10;
    }
#middle
    {
    height:100%;
    display:table;
    margin:0 auto;
    }
.hide
    {
    display: none;
    }
</style>

 
<script type='text/javascript'>

var images = null;
var total = 0;
var current = 0;

var winH = $(window).height(); // hvad hvis brugeren resizer vinduet ?
var winW = $(window).width();
var border = 100;
var winHeight = winH - border;
var winWidth = winW - border;

$(document).ready(function() // alt HTML+script er loadet - klargør jQuery funktioner
    {
    $('.thumb').click(function()
        {
        $('#img_bg').fadeIn();
        $('#middle').fadeIn();
        $('#img_box').fadeIn();
       
        var group = $(this).attr('data-group');

        $('#alt-text').html( $(this).attr('data-text') );

        images = $("#Gallery").find('img[data-group='+group+']');    // images er global - bruges også i next/prev

        current = $('img[data-group='+group+']').index(this);        // current er global (erstatter både showImg og numberImg)

        thisImg = images.eq(current).attr('src');
        $('#show_img').attr('src', thisImg);

        var orgImgWidth = $('#show_img').width();
        var orgImgHeight = $('#show_img').height();

        if(orgImgHeight >= winHeight || orgImgWidth >= winWidth)
            $('#show_img').animate({ height: winHeight }, 1000 );    // hvad med meget brede (lave) billeder ?
       

        total = images.length;    // total er global - bruges også i next/prev
        if (total > 1)
            {
            $('#Pagination').show();
            $('#Page').html(current + 1);
            $('#total').html(total);
            }
        else
            $('#Pagination').hide();
           
        })
       
       
    $('#Next, #Prev').click(function()
        {
        var $nav = $(this).attr('id');

        // Både current og total er globale - genbrug er godt

        if ($nav == "Next") // før "Nex" = altid den anden : )
            {
            if(current == total - 1)
                current = 0;
            else
                current = current + 1;
            }
        else
            {
            if (current == 0)
                current = total - 1;
            else
                current = current - 1;
            }
   
        $('#Page').html(current + 1);

        var text = images.eq(current).attr('data-text');
        $('#alt-text').html(text);

        $('#show_img').css("display", "none");
        $('#show_img').css("height", "");

        var img = images.eq(current).attr('src');
        $('#show_img').attr('src',img).fadeIn();

        orgImgHeight =  $('#show_img').height();

        if (orgImgHeight >= winHeight)
            $('#show_img').animate( {height: winHeight}, 1000 );

        });
     

    $('#show_img,#close_img').click(function ()
        {
        $('#img_bg').fadeOut(); // river alle de indre med
/*
        $('#img_box').fadeOut();
        $('#middle').fadeOut();
        $('#show_img').css("height", "");
        $('#Pagination').fadeOut();
*/
        });
    });
</script></head><body>
<div id="Gallery">
    <img data-group="111" class="thumb" data-text="Maren"    src="http;//2.bp.blogspot.com/-CXFfl9luHPM/TV-Os6opQfI/AAAAAAAAA2E/oCgrgvWqzrY/s1600/cow.jpg" />
    <img data-group="111" class="thumb" data-text="Mille"    src="http;//www.thelibertyvoice.com/wp-content/uploads/2011/06/52cow.jpg"/>
    <br/><br/>
    <img data-group="QQQ" class="thumb" data-text="Johnny"    src="http;//filuren.dk/wp-content/uploads/cow-1.jpg"/>
    <img data-group="QQQ" class="thumb" data-text="Karl"    src="http;//slothsandmovies.com/images/cow_large.jpg"/>
    <img data-group="QQQ" class="thumb" data-text="Mini"    src="http;//madmikesamerica.com/wp-content/uploads/2010/11/wisconsin-milk-cow.jpg"/>
    <img data-group="QQQ" class="thumb" data-text="Kvik"    src="http;//www.thetwentyfirstfloor.com/main/wp-content/uploads/2011/02/cow3.jpg"/>
    <img data-group="QQQ" class="thumb" data-text="Lis 1+2"    src="http;//1.bp.blogspot.com/-3QSgXPbk1f4/Td1RiyrkyaI/AAAAAAAAD3k/tamo23XG_VA/s1600/cow1.jpg"/>
    <img data-group="QQQ" class="thumb" data-text="Elvira"    src="http;//nextnature.net/wp-content/uploads/2008/07/world_cow_530.jpg"/>
    <br/><br/>
    <img data-group="QWE" class="thumb" data-text="Herrene"    src="http;//img.dailymail.co.uk/i/pix/2008/05_03/bigcowBNS_468x334.jpg"/>
</div>



<div id="img_bg" class="hide" style="display: none">
    <div id="middle" class="hide" style="display: none">
        <div id="img_box" class="hide" style="display: none">

            <img src="" id="show_img" title="Klik for at lukke" />

            <div id="Explain">
                <span id="alt-text"></span>
                <span id="close_img">X</span>
            </div>

            <div id="Pagination" class="hide">
                <p id="Prev">« Forrige</p>
                (<span id="Page"></span>/<span id="total"></span>)
                <p id="Next">Næste »</p>
            </div>


        </div>
    </div>
</div>
</body></html>

Der var en del lokal/global flimmer - og mulighed for genbrug (og dermed forenkling)
- ellers har jeg (næsten) holdt mig i skindet, det er stadig din struktur (ånd) : )

En del class="xyz" er lavet om til "id="xyz" fordi class er til genbrug, id til det unikke.

"Indrykningen" er nu på "min" måde - fordi den er overlegen : )

Pagination er delt i to div'er: tekst + lukknap => #Explain

PS: Ret ";" i alle "http;//" til ":"  En lille Eksperten.dk quirk..
- ellers burde et være lige til at paste ind i en tom.html
Avatar billede Slettet bruger
25. juli 2011 - 12:09 #4
De, min gode herre, er en helt!
Avatar billede Slettet bruger
25. juli 2011 - 16:39 #5
Joo, det kan der være noget om - men jeg lærte da selv noget undrevejs (har kun jQuery'et 3-4 mdr)
- bla. var den smarte find() og eq() combo ny for mig : )

Men det er jo ikke færdigt:
- billeder kan blive for brede - de skal resizes med "omtanke" (finde den rette faktor)
- du bør vise små versioner først - og så fiske de stores "src" ud af en property
- måske skjule <forrige eller næste> når du viser første/sidste billede i en gruppe ?
- man bør også kunne lukke med [Esc] (er nærmest blevet en standard)
- klik på den store version bør ikke lukke, men enten bladre frem, eller åbne billedet "råt" (fuld størrelse) evt. i et nyt browservindue..

Og til slut (til jul?) pakke det hele ind i en class (plugin) så det kan implementeres med ét kald: $("#billedDIV").MHgallery(options)

Lavede iøvrigt noget lignende (galleri) ifbm. et andet eksperten-spørgsmål, hvis du er interesseret:
http://ak247.dk/
Avatar billede Slettet bruger
25. juli 2011 - 16:47 #6
Godt det ikke kun er mig der lærer noget :)

Ja, der er bestemt meget at lave endnu! Har klaret problemet med for brede billeder :)
Resten må komme hen af vejen!
Avatar billede Slettet bruger
08. august 2011 - 09:17 #7
Det må du sgu undskylde!
Troede jeg havde accepteret dit svar for længst
Avatar billede Slettet bruger
08. august 2011 - 15:40 #8
Pyt, tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Unik System Design A/S

DevOps Engineer

Netcompany A/S

Managing Architect

Unik System Design A/S

QA Engineer