首页 前端知识 iframe的使用动态添加

iframe的使用动态添加

2024-02-04 11:02:34 前端知识 前端哥 253 562 我要收藏

一:iframe的基本使用

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

<iframe> 标签常用属性介绍:<iframe> - HTML(超文本标记语言) | MDN

    <iframe src="http://www.taobao.com" width="600px" height="300px" frameborder="0"></iframe>

二:iframe的父子通讯

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

在引入iframe的index.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:blank' because the document's frame is sandboxed and the 'allow-scripts' permission 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://www.qianduange.cn//article/1258.html
标签
评论
会员中心 联系我 留言建议 回顶部
复制成功!