2012-06-20 9 views
5

Tengo una página de Jquery Mobile en la que estoy cargando un formulario a través de AJAX. Estoy configurando las dimensiones de la página usando un complemento, que calcula las dimensiones DESPUÉS de que Ajax se haya ejecutado y el diseño se haya actualizado (al menos las consolas siguientes aparecen más adelante).cómo obtener la altura de un elemento después de insertar contenido a través de AJAX?

necesito para obtener la altura del elemento que recibe el contenido, pero no importa lo que intente, sólo estoy recibiendo basura (~ 169px en lugar de algún 1200px)

Aquí está mi código:

(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')) ; 
     }; 
    } 
    ... 

Si no estoy usando ningún AJAX, esto funciona correctamente. Si agrego contenido dinámicamente a través de AJAX, todas las consolas se activan después de AJAX, pero solo devuelven valores falsos.

Pregunta:
¿Cómo puedo obtener de forma fiable la altura del elemento de contenido después de una actualización de AJAX? Traté de establecer un tiempo de espera de 10 segundos después de Ajax para esperar hasta que todo esté allí. No hay diferencia, después de 10 segundos la altura del elemento de contenido aún no es correcta.

¡Gracias por la ayuda!

EDITAR:
Aunque las consolas de registro después de la carga AJAX, creo que la función está disparando antes, así que es calcualting basada en las dimensiones pre-AJAX. Estoy pensando en volver a usar este fuego:

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

y provocando

$ .trigger (ventana) ('dimensionchange')

en mi manejador éxito AJAX. No es perfecto, pero supongo que esto servirá.

EDIT2:
Lo tengo para funcionar. @HolgerDSchauf fue correcto. En mi primera ejecución de funciones, configuré los valores falsos y luego de que AJAX ingresara, el valor falso todavía estaba establecido. Ahora estoy fijando de esta manera:

Ajax éxito:

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

En mi plugin:

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

Y en función de la OME:

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

funciona como un encanto .

+0

¿Puede ser que tenga imágenes en su contenido cargado que no tienen una altura predefinida y su secuencia de comandos está dando el alto de la parte html sin imágenes, ya que aún no están cargadas? –

+0

@AidasBendoraitis: no.El elemento predeterminado está vacío (excepto un encabezado). – frequent

Respuesta

1

que utiliza un elemento de caché con la "envoltura, paneles, ct" actualizar esta variable en caché o utilizarlo al instante

+0

Debo declarar dentro del circuito? – frequent

+0

Creo que lo entiendo ahora. Estoy configurando la altura a 160px y una vez que actualizo necesito eliminar 160px para calcular la nueva altura, ¿correcto? – frequent

+0

Lo tengo. Gracias por el puntero! – frequent

2

utilizo esta función para mantener actualizados todos los tamaños de mi div. Use algo como esto, pero no olvide llamarlo cuando el documento esté listo.

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

también un buen enfoque. Pero demasiado anulando mi necesidad. – frequent

Cuestiones relacionadas