2011-11-08 9 views
15

Questa è la situazione, ho 2 div uno vicino all'altro. Un div è molto dinamico in altezza, il che significa fondamentalmente che può crescere e restringersi per adattarsi al suo contenuto. Ad esempio, questo div ha contenuti che possono essere piegati aperti o chiusi o contenitori che possono espandersi per adattarsi al contenuto caricato di ajax.jquery ridimensionare l'ascoltatore su un div

Ora, accanto a questo div è un altro che segue perfettamente l'altezza del primo tramite css. Funziona alla grande. Ma ecco la domanda: mi piacerebbe cambiare il contenuto di questo secondo div a seconda della sua altezza.

In altre parole, div 1 cambia in dimensione, div 2 segue attraverso css e ora devo attivare una chiamata ajax per ri-compilare div 2 con un nuovo contenuto, che si adatta alle sue nuove dimensioni.

Qualcuno ha un'idea di come posso farlo con jquery? Se possibile, senza l'uso di timeout?

Cheers.

+1

allmoast duplicare http://stackoverflow.com/questions/172821/detecting-when-a-divs-height-changes- using-jquery, cerca prima di pubblicare una domanda –

risposta

19

come suggerisce the thread poelinca provided, ci sono alcuni plugin belle disponibili per questa funzionalità.

Se non ti piace l'idea del plugin, un'altra semplice soluzione sarebbe semplicemente attivare un evento "ridimensiona" sul div ogni volta che il contenuto viene modificato. Quindi è possibile monitorarlo con resize() come previsto, utilizzando un elegante observer pattern.

function appendContent($div, content) { 
    $div.append(content).trigger($.Event('resize')); 
} 

$div.bind('resize', function(e) { 
    // all your magic resize mojo goes here 
}); 
+0

Grazie! Non ho assolutamente nulla contro i plugin, funziona come un piacere! – Peter

+0

Ciao a tutti, sono in ritardo per la conversazione, ma come useresti esattamente questo pezzetto di codice? Come si fa a chiamarlo? –

+0

@JeremyMiller l'idea qui è che ogni volta che il contenuto si aggiorna, tu chiama il metodo appendContent (...) (devi chiamare qualcosa, dopotutto). All'interno di appendContent, devi semplicemente attivare il tuo evento di ridimensionamento, indicando che il div è stato ridimensionato. Il codice all'interno di '$ div.bind ('ridimensiona', ...)' è chiamato automagicamente (ascolta gli eventi di ridimensionamento) – Kato

0

L'unica cosa che potrei pensare è avere un timer che controlla l'altezza ogni X secondi.

Qualcosa di simile a questo:

function checkHeightTimer(){ 
    var div1 = $('#div1'); 
    var div2 = $('#div2'); 
    var somesize = #somenumber here; 
    if(div1.height() > somesize){ 
     //do something to div2 
    } 
    setTimeout(checkHeightTimer, 500); //at 500 miliseconds 
} 
+3

Qualsiasi soluzione che richieda controlli periodici può essere considerata un "hack" piuttosto che una soluzione basata su eventi, a volte inevitabile –

6

https://github.com/sdecima/javascript-detect-element-resize

funziona come un fascino!

Ive testati attrchange ma questo non funzionava, ha perso due ore di lavoro :(

+0

Ottima sceneggiatura! Il "solo", visto finora, che ** NON usare i timer ** per interrogare in modo intermittente la dimensione degli elementi per rilevare una modifica. Questa tecnica introduce prestazioni terribili! Grazie @Jaroslav –