微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

window.matchMedia 不适用于 iframe 1) 将 iFrame 大小更改为 100%,以便在横向/纵向方向事件触发时调整大小2) 主页上的媒体查询检测,并在方向事件触发时使用 postMessage 向 iFrame 发送消息index.html:iframe.html:

如何解决window.matchMedia 不适用于 iframe 1) 将 iFrame 大小更改为 100%,以便在横向/纵向方向事件触发时调整大小2) 主页上的媒体查询检测,并在方向事件触发时使用 postMessage 向 iFrame 发送消息index.html:iframe.html:

我正在使用 window.matchMedia 检测设备方向。以下代码按预期工作 - 每个方向更改都以正确的值记录到控制台:

<!DOCTYPE html>
<html lang="en">
  <head>
    <Meta charset="utf-8" />
    <Meta name="viewport" content="width=device-width,initial-scale=1" />
    <title>Test App</title>
  </head>
  <body>
    <script type="application/javascript">
        let isIframe= () => {
            try {
                return window.self !== window.top;
            } catch (e) {
                return true;
            }
        }    

         let onorientationChange = () => {
            const isLandscape = window.matchMedia("(orientation: landscape)").matches;
            console.log("Event: " + (isIframe() ? "Iframe " : "") + "landscape:" + isLandscape);
        }

        let mediaQueryList = window.matchMedia("(orientation: landscape)");
        
        console.log("Onload: " + (isIframe() ? "Iframe " : "") + "landscape:" + mediaQueryList.matches);

        mediaQueryList.addListener(onorientationChange);
    </script>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root">Hello World in Iframe</div>
  </body>
</html>

但是当我在 iframe 中运行该页面时,不会触发使用 addListener 注册的回调。在 iframe 中,无论设备方向如何,我都只会得到单个日志行 - Onload: Iframe landscape:true

 <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root">Hello World</div>
    <iframe id="game" src="iframeContent.html" frameborder="0" style="width: 960px; height: 600px;"></iframe>
  </body>

我使用 addListener 而不是 addEventListener,因为第二个功能不适用于所有 Safari 版本。

在 Safari 14 以及 Chrome 和 Firefox 的开发工具上测试。

我的问题是 - 为什么 addListener 中没有调用 iframe 回调。

谢谢。

解决方法

如果 iframe 没有改变它的大小,因为它有固定的宽度和高度,因此无法在其中触发与调整大小相关的事件,包括关于 orientationMediaQueryList 事件。

你可以做两件事来让它工作;您可以将 iFrame 的宽度和高度设为 100%,也可以让媒体查询检测代码位于主窗口内,并在触发更改事件时使用 postMessage 传递方向状态。

1) 将 iFrame 大小更改为 100%,以便在横向/纵向方向事件触发时调整大小

在主页面中,使正文全高和 iframe 全宽/高(使用 CSS)。

body {
  height: 100vh;
  margin: 0;
}

iframe {
  width: 100%;
  height: 100%;
}

您可以测试的现场示例:https://zikro.gr/dbg/so/65704468/

2) 主页上的媒体查询检测,并在方向事件触发时使用 postMessage 向 iFrame 发送消息

index.html

<iframe src="iframe.html"></iframe>
<script>
  let iframe = document.querySelector('iframe');

  let onOrientationChange = () => {
    iframe.contentWindow.postMessage({
      isLandscape: window.matchMedia("(orientation: landscape)").matches
    },'*');
  }

  iframe.addEventListener('load',onOrientationChange);

  const mediaQueryList = window.matchMedia("(orientation: landscape)");

  mediaQueryList.addListener(onOrientationChange);
</script>

iframe.html

<script>
  window.addEventListener("message",(event) => {
    if (event.data.isLandscape) {
      console.log('iFrame Landscape');
    } else {
      console.log('iFrame Portrait');
    }
  });
</script>

您可以测试的现场示例:https://zikro.gr/dbg/so/65704468/pm/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?