tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von ComFreek
  • 1 Beitrag von para_noid
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
905
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Sturmrider Sturmrider ist offline Mitglied Gold
    Registriert seit
    Mar 2006
    Beiträge
    217
    Hallo zusammen,

    ich möchte ein Bild mittels click-event in jQuery nachladen:
    Code :
    1
    2
    
    [...] click( [...]
    $('#bildBox').html('<img src="testbild.jpg" id="bild">'+$('#bildBox').html());
    und die Bildmaße ermitteln:
    Code :
    1
    
    alert($('#bild').width());
    Komischerweise liefert mir Firefox ZWEI anstelle von EINER Alert-Meldungen. Die Erste mit 24 und die Zweite mit dem richtigen Wert. Safari liefert mir zwei mal 0. Ich habe gelesen, dass es bei Safari und Chrome an der anderen Script-Abarbeitung liegt. Parallelisierung war hier ein Stichwort.

    Leider hat html() keine callback-Funktion, da sie >angeblich< synchron arbeitet. Scheinbar stimmt das in diesem Fall aber nicht, sonst gäbe es nicht dieses Problem. (nebenbei gesagt, ich nutze die aktuellste jQuery-Version)
    Weiß jemand Rat, wie ich das Problem beheben kann? Ich habe es schon mit ready() und einer onload-Anweisung im img-Tag probiert, leider alles ohne Erfolg.
    Geändert von Sturmrider (18.11.11 um 18:47 Uhr)
     
    Gruß Sturmi

  2. #2
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.363
    Blog-Einträge
    4
    Hallo Sturmrider,

    folgendes funktioniert bei mir problemlos:
    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    /* #the_div ist ein DIV, der das Bild beinhalten soll */
    $("#the_div").html("");
                         
    var newImg = new Image;
    newImg.src = imgSrc;
    newImg.alt = 'Bild';
                         
    newImg.onload = function()
    {
      alert($(this).width());
    }
                         
    $("#the_div")[0].appendChild(newImg);
    Genau so funktioniert es, wenn ich newImg mit document.createElement("img"); initialisiere.

    Siehe auch meinen Vergleich von jQuery.html(), new Image; und createElement(): http://jsfiddle.net/qN7T5/1/
    Sturmrider bedankt sich. 
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  3. #3
    Sturmrider Sturmrider ist offline Mitglied Gold
    Registriert seit
    Mar 2006
    Beiträge
    217
    Ich glaube das funktioniert soweit. Leider habe ich selbst nicht daran gedacht, das Bild einfach in ein Objekt zu packen und so vor zu laden. Ich hing zu sehr an .html() fest, was damit ja geschickt umgangen wurde.
    Eine Frage habe ich aber noch: Mein #the_div ist nicht leer und das Bild wird am Anfang des contents erwartet. Wie setze ich newImg an den Anfang und nicht wie zur Zeit, ans Ende? Ich kenne mich mit appendChild und Co. ehrlich gesagt nicht so gut aus.
     
    Gruß Sturmi

  4. #4
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.363
    Blog-Einträge
    4
    Dafür ist die Methode insertBefore zuständig:
    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    
    function insertAtBegin(newElem, parent)
    {
        var children = obj.childNodes;
        if ( children.length > 0 )
          parent.insertBefore( newElem, children[0] );
    }
    insertAtBegin( img, $("#the_div")[0] );
    Der erste Parameter ist das neue Element,
    der zweite Parameter ist das Referenzelement, in unserem Fall das erste Kindelement.
     
    mfg ComFreek

    Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
    Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
    [PHP] Überprüfen, ob Website erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  5. #5
    Avatar von para_noid
    para_noid para_noid ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    144
    Alternativ: Du könntest das erste Element mit firstChild ermitteln und das Bild dann mit insertBefore davorpacken.

    Mich wundert aber ehrlich gesagt, dass dein erster Ansatz nicht funktioniert hat. Hattest du es mal mit dem live-Event probiert?
    Sturmrider bedankt sich. 
    Für die Übereinstimmung von Niederschrift und Hirninhalt.

  6. #6
    Sturmrider Sturmrider ist offline Mitglied Gold
    Registriert seit
    Mar 2006
    Beiträge
    217
    @ComFreek
    Deine Funktion funktioniert bei mir irgendwie nicht. Ich habe es aber ähnlich gemacht - so wie para_noid vorgeschlagen hat.
    Code :
    1
    
    $('#the_div')[0].insertBefore(newImg, $('#the_div')[0].firstChild);

    Vielen Dank euch beiden. Damit ist mein das Rätsel wohl gelöst.

    @para_noid
    Mich wundert es ehrlich gesagt auch... da in der Doku zu html() eindeutig steht, dass es synchron läuft, was meines Wissens nach heißt, dass andere Programmabschnitte erst bearbeitet werden, wenn der HTML-Teil aus html() vollständig geladen ist. Aber sei es drum Bei WebKit-Browsern (das war der Begriff, auf den ich im Zusammenhang mit Chrome und Safari nicht gekommen bin) hätte es wahrscheinlich eh nicht richtig geklappt. Die machen beim dynamischen Nachladen eh manchmal so ihre Probleme :P

    EDIT: Achja, noch ein schönes Wochenende
     
    Gruß Sturmi

  7. #7
    Avatar von para_noid
    para_noid para_noid ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    144
    da in der Doku zu html() eindeutig steht, dass es synchron läuft, was meines Wissens nach heißt, dass andere Programmabschnitte erst bearbeitet werden, wenn der HTML-Teil aus html() vollständig geladen ist
    Das wird auch so sein, und wahrscheinlich ist das img-Tag auch bereits da, wenn das alert losgeht. Die Frage ist aber, ob das Bild in der Zeit wirklich im Browser geladen wurde und nun "messbar" ist. Ich schätze, wenn du an der Stelle attr('id') ausgeben würdest, wäre das Ergebnis positiv, weil das Attribut auslesbar ist sobald das Element existiert..


    Hab grad gesehen dass es mit Safari & Co. nur mit width als Attribut funktioniert

    The width has to be specified in the image code for Chrome/Safari to be able to correctly detect the width. If the image code looks like this:

    <img src=”my_super_cool_image.png”>

    Firefox and IE will correctly detect the width but Chrome and Safari will return a 0. When you add width=”XXX” then Chrome/Safari will return the XXX value.
    [http://api.jquery.com/width/#dsq-comment-message-8331]

    Schon blöd wenn eigentlich so hilfreiche Werkzeuge/Bibliotheken bei eher simplen Problemen nicht helfen dir auch n schönes Wochenende
     
    Für die Übereinstimmung von Niederschrift und Hirninhalt.

Ähnliche Themen

  1. jQuery Lib dynamisch nachladen (FireFox 3.5.7)
    Von KICK im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 26.07.11, 19:03
  2. Antworten: 2
    Letzter Beitrag: 10.05.11, 14:54
  3. Nachladen von iFrame ohne jQuery, etc-.
    Von QUEST08 im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 18.04.11, 11:19
  4. JQuery Sortable Seite nachladen
    Von iLu_is_a_loser im Forum Javascript & Ajax
    Antworten: 7
    Letzter Beitrag: 30.08.10, 20:37
  5. Antworten: 4
    Letzter Beitrag: 14.02.05, 12:34