2012-06-20 11 views
5

Ho una pagina Jquery Mobile in cui sto caricando un modulo tramite AJAX. Sto impostando le dimensioni della pagina usando un plugin, che calcola le dimensioni DOPO che Ajax è stato eseguito e il layout è stato aggiornato (almeno le console sottostanti arrivano in seguito).come ottenere l'altezza di un elemento dopo aver inserito il contenuto tramite AJAX?

ho bisogno di ottenere l'altezza dell'elemento che ha ricevuto il contenuto, ma non importa quello che cerco, sto solo diventando spazzatura (~ 169px al posto di qualche 1200px)

Ecco il mio codice:

(inside plugin) 
some: function(){ 

    var self = this, 
    o = self.options, 
    wrap = $('div:jqmData(wrapper="true").ui-page-active').last(), 
    // elements 
    panels = wrap.find('.ui-panel.ui-panel-active').filter(':not(.ui-popover)'), 
    pages = panels.find('.ui-page'), 
    contents = pages.find('.ui-content'); 

    // maxHeight contents 
    for (var i = 0; i < contents.length; i++){   
     ct = contents.eq(i); 

     console.log(ct); 
     console.log(ct.css("height")) 
     console.log(ct.height()); 
     console.log(ct.outerHeight());  
    // max 
    if (ct.css("height") > parseFloat(o._iPadFixHeight)){ 
     o._iPadFixHeight = parseFloat(ct.css("height")) + parseFloat(ct.css('padding-top')) + parseFloat(ct.css('padding-bottom')) ; 
     }; 
    } 
    ... 

Se non utilizzo alcun AJAX, questo funziona correttamente. Se aggiungo il contenuto dinamicamente tramite AJAX, le console si attivano dopo AJAX, ma restituiscono solo valori falsi.

Domanda:
Come posso ottenere l'altezza in modo affidabile elemento di contenuto dopo un aggiornamento AJAX? Ho provato a impostare un timeout di 10 secondi dopo che Ajax ha aspettato fino a quando tutto è arrivato. Nessuna differenza, dopo 10 secondi l'altezza dell'elemento del contenuto non è ancora corretta.

Grazie per l'aiuto!

EDIT:
Anche se le console di registro dopo il carico AJAX, penso che la funzione è sparare prima, quindi è calcualting in base alle dimensioni pre-AJAX. Sto pensando di ri-il-fuoco di utilizzare questo:

$(window).on('dimensionchange', function(){    
    self.ome(); 
    }) 

e innescando

$ .trigger (finestra) ('dimensionchange')

nel mio gestore successo AJAX. Non perfetto, ma credo che lo farà.

EDIT2:
Got a farlo funzionare. @HolgerDSchauf era corretto. Durante la mia prima esecuzione della funzione, ho impostato i valori falsi e quindi dopo che AJAX è entrato, il valore falso era ancora impostato. Ora sto fissandolo in questo modo:

Ajax Successo:

... 
// cleanup dimensions 
$(window).trigger('dimensionclear'); 
... 
window.setTimeout(function() { 
    target.removeClass('.fade.in'); 
    // recalculate 
    $(window).trigger('dimensionchange');  
    },250); 

Nel mio plugin:

$(window).on('dimensionchange', function(){ 
    self.ome(); 
    }); 
$(window).on('dimensionclear', function(){ 
    self.ome("clear"); 
    });  

E in OME funzione:

// cleanup 
if (from == "clear") { 
    contents.css({'height':'', 'max-height':''}) 
    return; 
    } 

funziona come un fascino .

+0

È possibile che nel contenuto caricato siano presenti immagini prive di altezza predefinita e che lo script indichi l'altezza della parte html senza immagini in quanto non sono ancora state caricate? –

+0

@AidaBendoraitis: no.L'elemento predefinito è vuoto (tranne un'intestazione). – frequent

risposta

1

si è utilizzato un elemento di cache con "involucro, pannelli, ct" rinfrescare questa variabile nella cache o usarlo immediatamente

+0

Dovrei dichiarare all'interno del ciclo? – frequent

+0

Penso di aver capito ora. Sto impostando l'altezza su qualsiasi 160 pixel e una volta aggiornato devo rimuovere il 160px per calcolare la nuova altezza, corretto? – frequent

+0

Capito. Grazie per il puntatore! – frequent

2

Io uso questa funzione per mantenere aggiornati tutti i formati di mio div. Usa qualcosa del genere, ma non dimenticare di chiamarlo quando il documento è pronto.

function framing() { 
    /* 
     Pre   : ready.js, self 
     Post   : design.js->framing 
     Author   : Enes Ü. 
     Date   : 15:30, 05 May 12 
     Summary   : framing the page widthly/heightly 
     Bugs/TODOs    : Frame heights are anormal and will be fixed. Prior=5 
    */ 


    $("#right_menu").width($("#main").width()-$("#left_menu").width()); 
    $("#left_menu").height(getWinHeight()); 
    $("#top_menu").width($("#main").width()-$("#left_menu").width()); 
    $("#right_menu").height(getWinHeight()-$("#top_menu").height()); 
    $("#map_container").height(getWinHeight()); 
    /* 
    ******* lots of lines like above... 
    */ 

    setTimeout(framing,100); 
} 
+0

anche un buon approccio. Ma troppo esagerato per il mio bisogno. – frequent

Problemi correlati