iframe 随着内容变化自动调整高度

2024-05-13

我有一个 iframe,您可以在以下链接中看到;-

http://one2onecars.com http://one2onecars.com

iframe 是屏幕中央的在线预订。我遇到的问题是,虽然 iframe 的高度在页面加载时没问题,但我需要它以某种方式在页面内容调整时自动调整高度。例如,如果我在在线预订中进行邮政编码搜索,它会创建一个下拉菜单,然后使“下一步”按钮不可见。

我需要发生的是,当在线预订的内容发生变化时,iframe 会自动调整到 iframe 的新高度(动态),因为它不会加载任何其他页面。

我已经尝试使用 jquery 尝试几个不同的脚本来尝试解决此问题,但它们似乎都只在页面首次加载时自动调整 iframe 的高度,并且not随着 iframe 的内容发生变化。

这可能吗?

我目前拥有的代码目前具有设定的高度:-

        <div id="main-online-booking">

            <iframe id="main-online-frame" class="booking-dimensions" src="http://www.marandy.com/one2oneob/login-guest.php" scrolling="no" frameborder="0"></iframe>

        </div>

#main-online-booking {
    height: 488px;
    border-bottom: 6px #939393 solid;
    border-left: 6px #939393 solid;
    border-right: 6px #939393 solid;
    z-index: 4;
    background-color: #fff;
}


.booking-dimensions {
    width: 620px;
    height: 488px;
}

如果有人能帮助我,我将不胜感激!


现代浏览器具有一些新功能,使这项任务比以前更容易。

留言

The 发布消息 https://developer.mozilla.org/en-US/docs/Web/API/window.postMessageAPI 提供了一种在 iFrame 与其父级之间进行通信的简单方法。

要将消息发送到父页面,请按如下方式调用它。

parent.postMessage('Hello parent','http://origin-domain.com');

在另一个方向上,我们可以使用以下代码将消息发送到 iFrame。

var iframe = document.querySelector('iframe');
iframe.contentWindow.postMessage('Hello my child', 'http://remote-domain.com:8080');

要接收消息,请为消息事件创建事件侦听器。

function receiveMessage(event)
{
  if (event.origin !== "http://remote-domain.com:8080")
    return;

  console.log(event.data);
}

if ('addEventListener' in window){
    window.addEventListener('message', receiveMessage, false);
} else if ('attachEvent' in window){ //IE
    window.attachEvent('onmessage', receiveMessage);

这些示例使用 origin 属性来限制消息发送到的位置并检查消息的来源。可以指定*允许发送到任何域,并且在某些情况下您可能希望接受来自任何域的邮件。但是,如果您这样做,您需要考虑安全隐患并对传入消息实施您自己的检查,以确保它包含您期望的内容。在这种情况下,iframe 可以将其高度设置为“*”,因为我们可能有多个父域。不过,最好检查传入消息是否来自 iFrame。

function isMessageFromIFrame(event,iframe){
    var
        origin  = event.origin,
        src     = iframe.src;

    if ((''+origin !== 'null') && (origin !== src.substr(0,origin.length))) {
        throw new Error(
            'Unexpect message received from: ' + origin +
            ' for ' + iframe.id + '. Message was: ' + event.data  
        );
    }

    return true;
}

变异观察者

现代浏览器的另一个进步是变异观察者 https://developer.mozilla.org/en/docs/Web/API/MutationObserver它允许你观察 DOM 的变化;因此现在可以检测可能影响 iFrame 大小的更改,而无需不断使用 setInterval 进行轮询。

function createMutationObserver(){
    var
        target = document.querySelector('body'),

        config = {
            attributes            : true,
            attributeOldValue     : false,
            characterData         : true,
            characterDataOldValue : false,
            childList             : true,
            subtree               : true
        },

        observer = new MutationObserver(function(mutations) {
            parent.postMessage('[iframeResize]'+document.body.offsetHeight,'*');
        });

    log('Setup MutationObserver');
    observer.observe(target, config);
}

var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

if (MutationObserver){
    createMutationObserver();
}

计算出准确的高度

获取 iFrame 的准确高度并不像应有的那么简单,因为您可以选择六个不同的属性进行检查,但没有一个属性能够始终给出正确的答案。我想出的最佳解决方案是,只要您不使用 CSS 溢出 body 标记,此函数就可以工作。

function getIFrameHeight(){
    function getComputedBodyStyle(prop) {
        const style = document.defaultView.getComputedStyle(
            document.body, null);
        return parseInt(style.getPropertyValue(prop), 10);
    }

    return document.body.offsetHeight +
        getComputedBodyStyle('marginTop') +
        getComputedBodyStyle('marginBottom');
}

这是IE9版本,较长的IE8版本请看这里answer https://stackoverflow.com/questions/22402895/why-does-document-body-offsetheight-document-body-bottommargin-not-equal-docum.

如果您确实溢出了正文,并且无法修复代码来阻止这种情况,那么可以使用offsetHeight or scrollHeight的属性document.documentElement是您最好的选择。两者都有优点和缺点,最好只是测试两者并看看哪种适合您。

其他事宜

其他需要考虑的事项包括:页面上有多个 iFrame、CSS :Checkbox 和 :Hover 事件导致页面调整大小、避免在 iFrame 的 body 和 html 标记中使用 height auto,最后调整窗口大小。

IFrame 调整器库

我已将所有这些内容封装在一个简单的无依赖库中,该库还提供了一些此处未讨论的额外函数和页面大小检测算法。

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

这适用于所有现代浏览器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iframe 随着内容变化自动调整高度 的相关文章

随机推荐

  • 按日期对图表中的 X 轴进行排序 - JavaFX

    如何按日期对折线图 X 轴进行排序 现在我的折线图看起来像这样 我试图剪切日期并将其转换为 int 但现在我不知道该怎么办 datesToCompare addAll LastHoursAndDates keySet dates in St
  • C++ 的 String.Format

    正在寻找 NET 的 String Format 等函数的 C 实现 显然有 printf 及其变体 但我正在寻找具有位置的东西 如下所示 String Format 您好 0 您是 1 岁 感觉如何 1 姓名 年龄 这是必要的 因为我们将
  • 如何提取句子中的主语及其各自的从属短语?

    我正在尝试在句子中进行主题提取 以便我能够根据主题获得情感 我在用nltk在 python2 7 中用于此目的 以下面的句子为例 Donald Trump is the worst president of USA but Hillary
  • 使用 MSBuild 12 构建 MVC 4.0 项目时“任务失败,因为未找到 AXImp.exe”

    我正在尝试使用 CruiseControl Net 和 MSBuild 设置构建服务器 但是 它失败并出现错误 C Builds PremiumStore checkout PremiumStore sln default target 1
  • 为什么正则表达式中有四个反斜杠?

    d 1 2 我有上面的正则表达式 我知道字符串解析器会删除两个反斜杠 留下我们 d 以1为元字符 无关的功能是什么 我以前没有正则表达式的经验 或者字符串模式本身就是 反斜杠 最多出现两次的整数 我错过了什么吗 反斜杠转义其他反斜杠以及特殊
  • ASP.NET - 在 GridView 中显示图像和 pdf

    我想在 asp GridView 中显示 图像 列 这个想法是提供图像的缩略图以及实际尺寸图像的链接 对于某些行 这也可以是 PDF 文档 我想要 PDF 的链接 PDF 或图像存储在 SQL 数据库中 现在我在处理程序 ashx 文件中出
  • 强制向扬声器发出音频警报

    我有一个小应用程序 在此应用程序中 扬声器每隔我设置的特定时间就会发出噪音 现在 我希望即使设备中插入了耳机插孔 它也能通过内置扬声器发出噪音 我怎样才能做到这一点 您可以尝试以下代码在扬声器上播放代码 另请检查this http uiha
  • Kendo Ui MVC EditorTemplateName 在 PopUp 编辑模式下不起作用

    我想在 Kendo Ui 网格中使用 EditorTemplateName 作为外键列 当网格编辑模式为内联时 一切正常并且我的模板已加载 但是当将模式更改为弹出时不加载模板 如何修复它 Html Kendo Grid
  • PHP ::: 准备语句 ::: freeresult() ::: close()

    使用的重要性是什么 stmt gt free result stmt gt close 使用准备好的语句进行数据库调用后 如下所示 mysqli new mysqli database db pass user stmt mysqli gt
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?

    MISRA C 规则 18 4 1 说 不得使用动态堆内存分配 See http dist sonarsource com reports coverage misra c 2008 html http dist sonarsource c
  • 在 TensorFlow 中,tf.identity 有何用途?

    我见过tf identity在一些地方使用过 例如官方 CIFAR 10 教程和 stackoverflow 上的批量规范化实现 但我不明白为什么有必要 它是用来做什么的 谁能给出一两个用例吗 一种建议的答案是它可以用于 CPU 和 GPU
  • 使用操作系统用户名/密码在 PHP 中进行身份验证?

    我想知道是否有一种方法可以使用 PHP 或者可能是其他一些 CGI 但最好是 PHP 来使用其操作系统 在本例中为 Linux Debian 5 用户名和密码来验证用户 可能的 难的 谢谢 一般来说 这种东西是特定于操作系统的 并与现有的身
  • 如何仅在单击子级时触发父级单击事件

    子级和父级都是可点击的 子级可以是带有 jQ uery 单击事件的链接或 div 当我点击子事件时 如何只触发父事件而不触发子事件 DOM 事件阶段 活动分为三个阶段 Capture 第一阶段是 捕获 其中从事件处理程序开始调用
  • Jquery 动画背景图像过渡

    我有一个导航栏 当将鼠标悬停在某个项目上时 背景图像会发生变化 效果很好 但是 我希望该图像从顶部滑入 并在您停止悬停时向上滑回 我一直在尝试使用 JQuery 使用 css bacgroundImage 和滑动或切换来做到这一点 但这些似
  • 快速搜索压缩文本文件

    我需要能够在大量压缩文件 txt 中搜索文本 压缩可能会改变为其他东西 甚至成为专有的 我想避免解压所有文件并压缩 编码 搜索字符串并在压缩文件中搜索 这应该可以通过对所有文件使用相同的码本使用霍夫曼压缩来实现 我不想重新发明轮子 所以 任
  • onMouseEnter 和 onMouseLeave 未按预期运行

    我正在尝试为我的组件模拟悬停效果 然而 onMouseEnter Leave 事件没有按预期工作 现在我试图让它简单地 console log 一个字符串来检查它是否正常工作 但什么也没有发生 目的是我可以在悬停时更改其背景颜色 我尝试通过
  • UIView-Encapsulated-Layout-宽度/高度限制为零

    有很多关于自动布局的堆栈溢出问题UITableView涉及以下内容的单元格和节页眉 页脚UIView Encapsulated Layout Width的限制条件是UITableView用于使其组件具有正确的尺寸 什么是 NSLayoutC
  • 以编程方式检查 .class 文件是否扩展特定类

    我有一个问题 我已经尝试解决好几个小时了 在 Eclipse 插件中 我有一个 ArrayList 其中包含一些 java class 文件的完整路径 作为字符串 我想做的是检查列表中包含的类是否扩展了特定的类 我考虑过解析该文件 查找 e
  • iframe 随着内容变化自动调整高度

    我有一个 iframe 您可以在以下链接中看到 http one2onecars com http one2onecars com iframe 是屏幕中央的在线预订 我遇到的问题是 虽然 iframe 的高度在页面加载时没问题 但我需要它