tutorial ejemplo descargar definicion javascript domdocument

javascript - ejemplo - Detecta el cambio de altura del documento



javascript descargar (6)

Como se menciona en vsync, no hay ningún evento, pero puede usar un temporizador o adjuntar el controlador en otro lugar:

// get the height var refreshDocHeight = function(){ var h = $(document).height(); $(''#result'').html("Document height: " + h); }; // update the height every 200ms window.setInterval(refreshDocHeight, 200); // or attach the handler to all events which are able to change // the document height, for example $(''div'').keyup(refreshDocHeight);

Encuentra el jsfiddle aquí .

Intento detectar cuándo cambia la altura de mi document . Una vez que lo haga, necesito ejecutar algunas funciones para ayudar a organizar el diseño de mi página.

No estoy buscando window.onresize . Necesito el documento completo, que es más grande que la ventana.

¿Cómo observo este cambio?



La respuesta de vsync está completamente bien. En caso de que no le guste usar setTimeout , puede usar requestAnimationFrame ( ver soporte ) y, por supuesto, sigue interesado.

En el siguiente ejemplo, el cuerpo obtiene un cambio de sizechange evento sizechange . Y cada vez que cambia la altura o el ancho del cuerpo, se activa.

(function checkForBodySizeChange() { var last_body_size = { width: document.body.clientWidth, height: document.body.clientHeight }; function checkBodySizeChange() { var width_changed = last_body_size.width !== document.body.clientWidth, height_changed = last_body_size.height !== document.body.clientHeight; if(width_changed || height_changed) { trigger(document.body, ''sizechange''); last_body_size = { width: document.body.clientWidth, height: document.body.clientHeight }; } window.requestAnimationFrame(checkBodySizeChange); } function trigger(element, event_name, event_detail) { var evt; if(document.dispatchEvent) { if(typeof CustomEvent === ''undefined'') { var CustomEvent; CustomEvent = function(event, params) { var evt; params = params || { bubbles: false, cancelable: false, detail: undefined }; evt = document.createEvent("CustomEvent"); evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); return evt; }; CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; } evt = new CustomEvent(event_name, {"detail": event_detail}); element.dispatchEvent(evt); } else { evt = document.createEventObject(); evt.eventType = event_name; evt.eventName = event_name; element.fireEvent(''on'' + event_name, evt); } } window.requestAnimationFrame(checkBodySizeChange); })();

Una demostración en vivo

El código se puede reducir mucho si tiene una función propia triggerEvent en su proyecto. Por lo tanto, simplemente elimine el trigger función completo y reemplace el trigger(document.body, ''sizechange''); línea trigger(document.body, ''sizechange''); con, por ejemplo, en jQuery $(document.body).trigger(''sizechange''); .


Puede usar un iframe posición absolute con ancho cero dentro del elemento que desea monitorear para los cambios de altura, y escuchar el cambio de resize eventos en su contentWindow . Por ejemplo:

HTML

<body> Your content... <iframe class="height-change-listener" tabindex="-1"></iframe> </body>

CSS

body { position: relative; } .height-change-listener { position: absolute; top: 0; bottom: 0; left: 0; height: 100%; width: 0; border: 0; background-color: transparent; }

JavaScript (usando jQuery pero podría adaptarse a JS puro)

$(''.height-change-listener'').each(function() { $(this.contentWindow).resize(function() { // Do something more useful console.log(''doc height is '' + $(document).height()); }); });

Si por alguna razón tienes height:100% establecido en el body necesitarás encontrar (o agregar) otro elemento contenedor para implementar esto. Si desea agregar el iframe dinámicamente, probablemente necesite usar el evento <iframe>.load para adjuntar el listener contentWindow.resize . Si quieres que esto funcione en IE7 y en los navegadores, necesitarás agregar *zoom:1 hack al elemento contenedor y también escuchar el evento de cambio de resize ''propietario'' en el elemento <iframe> mismo (que duplicará contentWindow.resize en IE8-10).

Aquí hay un violín ...


Solo mis dos centavos. Si por casualidad usa angular, esto haría el trabajo:

$scope.$watch(function(){ return document.height(); },function onHeightChange(newValue, oldValue){ ... });


function onElementHeightChange(elm, callback){ var lastHeight = elm.clientHeight, newHeight; (function run(){ newHeight = elm.clientHeight; if( lastHeight != newHeight ) callback(); lastHeight = newHeight; if( elm.onElementHeightChangeTimer ) clearTimeout(elm.onElementHeightChangeTimer); elm.onElementHeightChangeTimer = setTimeout(run, 200); })(); } onElementHeightChange(document.body, function(){ alert(''Body height changed''); });

DEMO EN VIVO