一:iframe基本使用

<iframe> 标签一个内联框架,即用来当前 HTML 页面中嵌入另一个文档的,且所有主流浏览器支持iframe标签

&lt;iframe&gt; 标签常用属性介绍:<iframe> – HTML(超文本标记语言) | MDN

    &lt;iframe src="http://www.taobao.com" width="600px" height="300px" frameborder="0"&gt;</iframe&gt;

二:iframe的父子通讯

window.postMessage() 方法可以安全地实现跨源通信。但是一个文档里的脚本还是不能调用在其他文档方法读取属性,但他们可以用window.postMessage结合window.addEventListene这种消息传递技术来实现安全通信

引入iframeindex.html页面

<iframe id="iframe" src="./iframeDemo"></iframe>
 
<script>
//获取dom
var iframe = document.getElementById('iframe');
//在iframe加载完成后
iframe.onload = function() {
   // 向iframeDemo发送数据
   iframe.contentWindow.postMessage('index.html发出的消息', '*');
};
// 监听信息
window.addEventListener('message',(e) => {
    console.log(e);
}, false);
</script>

iframeDemo.html页面

<script>
// 监听信息接收index.html的数据
window.addEventListener('message',(e) => {
    console.log(e.data);
    window.parent.postMessage('iframeDemo.html发出的消息', '*');
}, false);
</script>

三:动态加载iframe

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div><button onclick="headerClick(Isrc)">打开淘宝</button></div>
    <div id="content" style="width: 1000px; height: 600px"></div>
    <script>
      //动态src
      const Isrc = "http://www.taobao.com";
      //创建iframe
      function createIframe(src) {
        const iframe = document.createElement("iframe");
        //传入iframe的src
        iframe.src = src;
        iframe.id = "ifr";
        iframe.width = "100%";
        iframe.height = "100%";
        document.getElementById("content").appendChild(iframe);
        console.log("创建iframe完成");
      }
      //点击事件
      function headerClick(id) {
        createIframe(id);
      }
      //删除iframe
      function closeIframe(){
        let iframe = document.getElementById("ifr");
        iframe.src = "about:blank";
        iframe.contentWindow.document.write('')
        iframe.contentWindow.document.clear();
        iframe.contentWindow.close();
        iframe.parentNode.removeChild(iframe);
        iframe = null;
      }
      //点击按钮事件
      function headerClick(src){
        createIframe(src)
      }
      //监听iframe页面发出的信息,销毁iframe
      window.addEventListener("message",(e) => {
          closeIframe();
        },
        false
      );
    </script>
  </body>
</html>

在iframe的子页面中需要发出事件,让父页面销毁

window.parent.postMessage('销毁iframe','*');

注意:iframe嵌入页面为Cesium时可能出现的报错

错误:VM5729:1 Blocked script execution in ‘about:blankbecause the document’s frame is sandboxed and the ‘allowscriptspermission is not set.

原因是:在“about:blank”中阻止脚本执行,因为文档框架已被沙盒化并且未设置allow-scripts权限。这个错误提示是Cesium不识别js沙箱iframe不允许使用js。 

解决方案

第一种:禁用infobox

const viewer = new Viewer('cesiumContainer', {
  infoBox: false, // If set to false, the InfoBox widget will not be created.
});

第二种:设置沙箱权限

var iframe = document.getElementsByClassName(‘cesium-infoBox-iframe’)[0];
iframe.setAttribute(‘sandbox’, ‘allow-same-origin allow-scripts allow-popups allow-forms’);
iframe.setAttribute(‘src’, ‘’); //必须设置src为空 否则不会生效

参考https://blog.csdn.net/ganggun/article/details/124825612 

原文地址:https://blog.csdn.net/wangyingying12/article/details/130198591

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_15249.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注