【问题标题】:Getting undefined when trying to get .offset().top value of element in iframe尝试获取 iframe 中元素的 .offset().top 值时未定义
【发布时间】:2017-03-08 04:55:11
【问题描述】:

我遇到了 Firefox 和 Safari 的问题,当尝试从 iframe 中的元素获取 .offset().top 值时,我在尝试获取该值时返回未定义。这在 Chrome、Edge 和 IE 中似乎可以正常工作,但在 Firefox 或 Safari 中却不行。

这是网址:

https://twlatl.github.io/styleguide/

当您在 Firefox 中单击导航时,您会在控制台中看到错误。

TypeError: this.$iframeContent.find(...).offset(...) is undefined

导致问题的块在这里:

gotoAnchor: function($elem) {
  window.location.hash = '!' + $elem.attr('href').replace('#', '');
  this.top = this.$iframeContent.find('h1' + $elem.attr('href')).offset().top;
  this.$iframeContent.find('html, body').animate({
    scrollTop: this.top
  }, 800);
},

从元素中移除 .offset().top 会移除错误,但也会移除滚动到页面该部分的能力。

我尝试将此变量包装在 .on() 方法中以检查 iframe 是否首先完全加载,但这不起作用。

【问题讨论】:

  • 您的this.$iframeContent 中没有任何内容
  • 当然可以。将其记录到控制台或通过控制台通过 cruxStyle.$iframeContent 显示该对象以及显示的输出,显示来自加载的 iframe 内容的值。
  • 查看我的更新答案

标签: javascript jquery iframe


【解决方案1】:

试试这个(你可以重组以满足你的需要)

var iframe = document.body.querySelector('.hgt-iframe-wrapper > iframe')
var iframeBody = iframe.contentDocument.body
var sectionHeader = iframeBody.querySelector($elem.attr('href'))

if( sectionHeader ){
    sectionHeader.scrollIntoView()
}

注意:这个 ^ 会出错,因为 ID 是 aren't allowed to start with numbers。将部分标题 ID 更改为以字母开头,它将起作用

更新

啊,您的问题是您在加载 iframe 之前正在访问它的内容。如果您有时刷新它会加载得足够快并且您的菜单可以正常工作。您可以在下面的屏幕截图中看到 iframe 加载速度不够快,因此 this.$iframeContent 实际上是空的(没有返回 <div>s)

【讨论】:

  • scrollIntoView 在 Chrome 上尚不支持,因此无法使用。我重新编写了代码以通过 JS 动态加载 iframe src,并将导航的点击事件包装在 eventListener 中以确保加载 iframe。现在至少每次尝试访问锚点上的 .top 值时都会失败,但它不能来自未加载的 iframe。
  • supported in all major browsers,只是没有平滑选项
  • 尝试使用开发工具控制台单步调试您的代码
  • 解决方案是推迟从 init 函数获取 iframe 内容并将其移至 gotoNav 函数,它不受竞态条件的影响。感谢您对 scrollIntoView 的建议。使用它来处理在页面加载时显示适当的区域。
猜你喜欢
  • 2014-02-23
  • 2015-07-13
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2017-12-17
相关资源
最近更新 更多