javascript - 处理来自父窗口 ScrollBar 的 iframe 滚动

标签 javascript jquery html iframe scroll

我正在构建一个可在不同域中使用的iframeiframe 有一个数据列表,到达滚动底部后会更新更多数据。

我遇到一个问题,其中包含 iframe 的父窗口有两个滚动条;我的目标是消除父滚动条并依赖 iframe 滚动或相反。重要的是两者都需要一张卷轴,

我的代码如下:

 <html>
   <body >
      <div>Header</div>
      <iframe
         width='100%'
         height='500px'
         onLoad="window.parent.scroll(0,0);"
         id='iframe'
         src="myIframe.com"></iframe>

       <div>Footer</div>
   </body>
   <script type="text/javascript">
     window.addEventListener('message', function (e) {
         document.getElementById("iframe").height = e.data.frameHeight
       });
 </script>
</html>

监听来自父级的消息并设置框架的高度,有助于消除 iframe 的滚动,但我确实需要该滚动在到达底部时更新列表。

我尝试了一些方法但没有成功。在这种情况下实现我的目标的最佳方法是什么?

最佳答案

简短回答

https://github.com/davidjbradshaw/iframe-resizer

更长的答案

上述库的做法是使用 MutationObserver 来检测 iframe 中 DOM 的变化,以触发页面大小的重新计算。复杂之处在于必须检测新加载的 html 中的图像何时也加载。

function setupBodyMutationObserver() {
    function addImageLoadListners(mutation) {
      function addImageLoadListener(element) {
        if (false === element.complete) {
          log('Attach listeners to ' + element.src)
          element.addEventListener('load', imageLoaded, false)
          element.addEventListener('error', imageError, false)
          elements.push(element)
        }
      }

      if (mutation.type === 'attributes' && mutation.attributeName === 'src') {
        addImageLoadListener(mutation.target)
      } else if (mutation.type === 'childList') {
        Array.prototype.forEach.call(
          mutation.target.querySelectorAll('img'),
          addImageLoadListener
        )
      }
    }

    function removeFromArray(element) {
      elements.splice(elements.indexOf(element), 1)
    }

    function removeImageLoadListener(element) {
      log('Remove listeners from ' + element.src)
      element.removeEventListener('load', imageLoaded, false)
      element.removeEventListener('error', imageError, false)
      removeFromArray(element)
    }

    function imageEventTriggered(event, type, typeDesc) {
      removeImageLoadListener(event.target)
      sendSize(type, typeDesc + ': ' + event.target.src, undefined, undefined)
    }

    function imageLoaded(event) {
      imageEventTriggered(event, 'imageLoad', 'Image loaded')
    }

    function imageError(event) {
      imageEventTriggered(event, 'imageLoadFailed', 'Image load failed')
    }

    function mutationObserved(mutations) {
      sendSize(
        'mutationObserver',
        'mutationObserver: ' + mutations[0].target + ' ' + mutations[0].type
      )

      // Deal with WebKit / Blink asyncing image loading when tags are injected into the page
      mutations.forEach(addImageLoadListners)
    }

    function createMutationObserver() {
      var target = document.querySelector('body'),
        config = {
          attributes: true,
          attributeOldValue: false,
          characterData: true,
          characterDataOldValue: false,
          childList: true,
          subtree: true
        }

      observer = new MutationObserver(mutationObserved)

      log('Create body MutationObserver')
      observer.observe(target, config)

      return observer
    }

    var elements = [],
      MutationObserver =
        window.MutationObserver || window.WebKitMutationObserver,
      observer = createMutationObserver()

    return {
      disconnect: function() {
        if ('disconnect' in observer) {
          log('Disconnect body MutationObserver')
          observer.disconnect()
          elements.forEach(removeImageLoadListener)
        }
      }
    }
  }

  function setupMutationObserver() {
    var forceIntervalTimer = 0 > interval

    // Not testable in PhantomJS
    /* istanbul ignore if */ if (
      window.MutationObserver ||
      window.WebKitMutationObserver
    ) {
      if (forceIntervalTimer) {
        initInterval()
      } else {
        bodyObserver = setupBodyMutationObserver()
      }
    } else {
      log('MutationObserver not supported in this browser!')
      initInterval()
    }
  }

关于javascript - 处理来自父窗口 ScrollBar 的 iframe 滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59928424/

相关文章:

html - 在 iPhone 上显示 flex 和 width 50% 错误

html - 让幻灯片点只停留在同一个地方

javascript - 使用干净的 Vue.js 进行表单验证

javascript - HTML5 canvas 绘制自定义光标

javascript - 如果选择快速,Ajax 不会填充下拉列表

jquery - 当我克隆一个部分时,HTML 格式被破坏

javascript - 使用 jQuery 在其 id 中选择带有百分号 (%) 的元素

javascript - 这段代码中的问号是什么意思?

javascript - Material UI 在单击单个按钮时进出过渡

javascript - JSDoc 必需参数和默认值