Search code examples
javascriptdomdocument

Detect Document Height Change


I'm trying to detect when my document height changes. Once it does, I need to run a few functions to help organize my page layout.

I'm not looking for window.onresize. I need the entire document, which is larger than the window.

How do I observe this change?


Solution

  • Update (Oct 2020):

    resizeObserver is a wonderful API (support table)

    // create an Observer instance
    const resizeObserver = new ResizeObserver(entries => 
      console.log('Body height changed:', entries[0].target.clientHeight)
    )
    
    // start observing a DOM node
    resizeObserver.observe(document.body)
    
    // click anywhere to rnadomize height
    window.addEventListener('click', () =>
      document.body.style.height = Math.floor((Math.random() * 5000) + 1) + 'px'
    )
    click anywhere to change the height


    Old answer:

    Although a "hack", this simple function continuously "listens" (through setTimeout) to changes in an element's height and fire a callback when a change was detected.

    It's important to take into account an element's height might change regardless of any action taken by a user (resize, click, etc.) and so, since it is impossible to know what can cause a height change, all that can be done to absolutely guarantee 100% detection is to place an interval height checker :

    function onElementHeightChange(elm, callback) {
      var lastHeight = elm.clientHeight, newHeight;
    
      (function run() {
        newHeight = elm.clientHeight;
        if (lastHeight != newHeight)
          callback(newHeight)
        lastHeight = newHeight
    
        if (elm.onElementHeightChangeTimer)
          clearTimeout(elm.onElementHeightChangeTimer)
    
        elm.onElementHeightChangeTimer = setTimeout(run, 200)
      })()
    }
    
    // to clear the timer use:
    // clearTimeout(document.body.onElementHeightChangeTimer);
    
    // DEMO:
    document.write("click anywhere to change the height")
    
    onElementHeightChange(document.body, function(h) {
      console.log('Body height changed:', h)
    })
    
    window.addEventListener('click', function() {
      document.body.style.height = Math.floor((Math.random() * 5000) + 1) + 'px'
    })
    LIVE DEMO