2012-12-02 8 views
26

Per molto tempo, ho cercato un modo per rilevare quando le dimensioni o la posizione di un elemento DOM sono cambiate. Potrebbe essere perché la finestra è stata ridimensionata, o perché nuovi elementi figlio sono stati aggiunti all'elemento, o perché sono stati aggiunti nuovi elementi attorno a questo elemento, o perché le regole CSS sono cambiate, o perché l'utente ha cambiato la dimensione del carattere del browser. Ci sono un numero enorme di motivi per cui la dimensione o la posizione di un elemento cambierebbe.Esiste un modo non di rilevamento per rilevare quando le dimensioni o la posizione di un elemento DOM sono cambiate?

Potrei collegare gestori di eventi per molti di questi eventi, ma penso che ci siano casi che non sono coperti. Speravo di usare MutationObservers solo per guardare l'offset dell'elementoWidth o clientWidth, ma sembra che questi si applichino solo agli attributi DOM, non alle proprietà dei nodi (o forse è proprio ciò che implementa Webkit). Quindi, per essere veramente a prova di proiettile, sembra che avrei bisogno di eseguire un ciclo di polling comunque.

È corretto? Ho perso qualcosa di importante? Il polling è l'unico modo a prova di proiettile per rilevare quando le dimensioni o la posizione di un elemento sono cambiate?

Modifica

Per dare un po 'più di contesto, questo non è legato ad alcun un particolare caso d'uso. Per me, è venuto fuori più e più volte. Nella mia situazione attuale, speravo di avere una tela che è impostata, tramite CSS, per essere al 100% larghezza e altezza del suo genitore. Voglio uno script per regolare le proprietà di larghezza e altezza del canvas quando è stato modificato il suo offsetWidth o clientWidth (questo è per WebGL, dove le proprietà width e height influiscono sulla risoluzione del framebuffer). In un altro progetto, volevo che un elemento si espandesse in altezza per riempire tutto lo spazio rimanente nella finestra del browser dell'utente. Mi sono imbattuto in questo momento e ora la situazione di nuovo e, inevitabilmente, la soluzione sembra essere:

  1. Ascolta window.resize
  2. Hook in qualsiasi codice che si scrive che potrebbe cambiare il DOM (o forse usare mutazione Eventi o osservatori mutazione)
  3. Avere un'operazione di polling periodica per pulire eventuali casi mancati

(la maggior parte delle persone si fermano a 1, e magari fare un po 'di 2)

I volevo solo assicurarmi che non mi mancasse qualcosa di vitale.

Per inciso, nella mia situazione WebGL, ascoltare window.resize è sufficiente (ed è alquanto preferibile, perché quindi le dimensioni del canvas e la risoluzione di rendering cambiano nello stesso momento).

+1

Al titolo: n. All'ultima frase: sì. Qual è il problema più grosso che stai cercando di risolvere? –

+1

Gli eventi di mutazione sono progettati solo per il DOM, non per le proprietà di visualizzazione o simili; Webkit lo fa correttamente. Supponevo che gli eventi di attivazione durante il reflow del layout del documento sarebbero troppo critici (in termini di rendimento, ma anche di errore). – Bergi

+0

@Matt Ball - mi dispiace per non aver fornito il contesto nella domanda iniziale. Sono stato così a lungo da sapere meglio. –

risposta

3

Un collaboratore mi ha indirizzato a un technique che utilizza gli eventi underflow e overflow. Non l'ho provato, e non ho idea di che tipo di supporto del browser ci sia (sembra Chrome e FireFox, e dovrebbe funzionare in IE sintetizzando gli stessi eventi che il browser dovrebbe cercare, ma non ho idea di quali versioni supporta la tecnica).

+2

È interessante notare che l'autore è anche pubblicizzato usando le animazioni CSS. Ecco il suo post originale: http://www.backalleycoder.com/2012/04/25/i-want-a-damnodeinserted/ – Christophe

+1

Se hai bisogno del supporto IE, leggi l'articolo aggiornato dell'autore, [Cross-Browser, Event -based, Element Resize Detection] (http://www.backalleycoder.com/2013/03/18/cross-browser-event-based-element-resize-detection/). – 10basetom

10

Si potrebbe fare con le animazioni CSS. Controlla http://developer.streak.com/2012/11/how-to-detect-dom-changes-in-css.html e simili. Suppongo che non gestirà tutte le tue richieste però, ora che ne leggo ancora un po '.

+2

Questo è ... incredibilmente intelligente. Non penso che mi aiuterà nel caso generale, ma lo riporterò comunque nella mia cassetta degli attrezzi. Non sai mai quando sarà utile. Grazie! –

+0

collegamento a quel post è morto – Aras

+0

risolto il collegamento. – Pre101

Problemi correlati