如果在 iframe 中,引导模式弹出窗口会忽略滚动位置

Posted

技术标签:

【中文标题】如果在 iframe 中,引导模式弹出窗口会忽略滚动位置【英文标题】:Bootstrap modal popup ignores scroll position if in iframe 【发布时间】:2016-07-24 12:02:17 【问题描述】:

如果网页不在 iframe 中,我有一个引导模式弹出窗口,效果很好,如下所示:

https://jgroups-dev.herokuapp.com/(点击查找群组,然后点击电子邮件按钮)

但是,当它在 iframe 中时,模式弹出框会锚定到 iframe 的顶部,完全忽略用户的滚动位置:

http://www.yourjourney.tv/connect/j-group-catalogue/

为了解决这个问题,我尝试根据 iframe 中的滚动位置手动设置模式弹出窗口的顶部属性,但是 $(window).scrollTop() 和其他变体都返回 0 或40 来自 iframe。

$('.send-email-modal').modal();

            setTimeout(function () 
                if(inIframe()) 
                    var emailModal = $('.send-email-modal .modal-dialog');
                    var win = $(window);
                    var offset1 = win.scrollTop();
                    var offset2 = document.documentElement.scrollTop || document.body.scrollTop;
                    console.log('offset1: ' + offset1);
                    console.log('offset2: ' + offset2);
                    var positionWindow = (offset1 + (win.height() / 2)) - (emailModal.height() / 2);
                    console.log('win.height(): ' + win.height());
                    console.log('emailModal.height(): ' + emailModal.height());
                    console.log('positionWindow: ' + positionWindow);
                    emailModal.css( 'top': positionWindow );
                
            , 500);

这是控制台输出:

offset1: 40
main.js:54 offset2: 40
main.js:56 win.height(): 27037
main.js:58 emailModal.height(): 426
main.js:59 positionWindow: 13345.5

如果我无法从 iframe 中的代码检索用户在 iframe 中滚动的距离,那么我就无法正确定位引导模式弹出窗口。非常感谢您的帮助,我在这个上遇到了一堵砖墙......

【问题讨论】:

给我-1的人,获得生命。 【参考方案1】:

可能的问题:它没有忽略滚动值。用户滚动发生在父窗口中。您的 iframe 的高度可能等于它的文档高度。模态总是放置在包含窗口的顶部中心(有一些边距)(在这种情况下是你的 iframe)。因此,当您在独立窗口中看到它时,它可以正常工作。它位于 iframe 内文档的开头附近。

可能的解决方案[在相同来源的情况下] 从您的 iframe 内部,检查页面是否有父窗口(以确保它在 iframe 内)以及它是否已读取 scrollTop 的值,然后手动调整模态 css top 属性。

parent == self // 对于任何***窗口

以下将为您提供父窗口的滚动顶部

parent.document.body.scrollTop

如果是跨域 如果 iframe 和父级的来源不同,您将无法访问父级的属性。 尝试使用 postMessage。将 scrollTop 的值从父级发送到用户滚动的 iframe。保存此值并在显示模式时使用它。

在此处阅读有关 postMessage 的更多信息https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

【讨论】:

这不起作用,会出现跨域错误:main.js:65 Uncaught SecurityError: Blocked a frame with origin "localhost:5000" from access a frame with origin "yourjourney.tv".协议、域和端口必须匹配。 只有当两者都来自同一个域时才允许访问父级,因为跨域受限。你可以在同一个域上托管这两个页面吗?? 不幸的是,嵌入的页面是带有 angularjs 的 nodejs 应用程序,父级是 CMS,因此仅限于基本 html(因此是 iframe。) 但是我同意你的观点,iframe 内容是 iframe 高度的 100%,所以 scrollTop 不起作用,我实际上动态地从 iframe 向父级发送一个 postMessage,告诉它它的高度所以它可以调整 iframe 高度以匹配(以避免滚动条内有滚动条。) 您是否可以从父窗口到 iframe 执行类似的 postMessage,每当用户滚动页面时,它会发送 scrollTop 值。你可以使用这个值

以上是关于如果在 iframe 中,引导模式弹出窗口会忽略滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

如何让视频 iframe 出现在 Internet Explorer 的模式弹出窗口下方?

如何在数据表中使用引导模式在弹出窗口中打开数据

使用 iframe 标签在 firefox 中显示 PDF 会导致弹出窗口

使用引导程序加载打开模式弹出窗口?

Cookie 同意弹出窗口不会在 IFrame 中消失

如何在 iframe 中打开 ajax 成功的引导模式