iframe标签的使用

news2025/2/27 1:43:51

iframe标签的使用

  • 1、什么是iframe
  • 2、iframe的元素属性
  • 3、iframe操作
  • 4、iframe 对象及属性
  • 5、创建iframe元素
  • 6、iframe之间的通信
    • 6.1、什么是主域名,什么是子域名(拓展)
    • 6.2、iframe之间的通信
  • 7、其他
    • 7.1、iframe自适应
    • 7.2、防嵌套网页
      • 7.2.1、浏览器端
      • 7.2.2、服务器端
    • 7.3、iframe使用场景

1、什么是iframe

  1. iframe是HTML元素,用于在网页中内嵌另一个网页。
  2. iframe默认有一个宽高,存在边界。
  3. iframe是一个行内块级元素,可以通过display修改。
  4. 所有浏览器都支持 iframe 标签。不过版本支持情况不同。
  5. 可以把需要的文本放置在 <iframe 和 </iframe 之间,这样就可以应对无法理解 iframe 的浏览器。
  6. 在 HTML 4.1 Strict DTD 和 XHTML 1.0 Strict DTD 中,不支持 iframe 元素。
    • iframe标签支持 HTML 中的全局属性:
      在这里插入图片描述

    • iframe标签支持 HTML 中的事件属性:如Window 事件属性、Form 事件、Keyboard 事件、Mouse 事件、Media 事件等
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

2、iframe的元素属性

在这里插入图片描述
在这里插入图片描述

iframe常用的元素属性:

  1. src:指定内联网页的地址
  2. width、height:控制iframe的宽高。
  3. frameborder:iframe默认有个边界,可以设置frameborder为0清除边界。
  4. name:框架的名称。
  5. scrolling:是否可滚动。yes、no、auto。
    在这里插入图片描述

3、iframe操作

  1. 每个iframe里各自维护自己的全局window对象。
  2. 只有同域才能进行iframe之间的改写,跨域时,只能进行简单的路由跳转。
  3. 在父级使用window.frames[name]可以获取子iframe的window对象,相应的可以获取document对象,从而对子iframe进行dom操作。
  4. 在子iframe想要操作父元素的iframe,直接使用子元素的window.parent来获取父级元素的window对象,从而获取document来操作dom。

4、iframe 对象及属性

在这里插入图片描述

  1. IFrame 对象代表 HTML iframe 元素。

  2. 可使用 getElementById() 来访问 iframe 元素。如:
    var iframe = document.getElementById(“iframe”);
    var iwindow = iframe.contentWindow;
    var idoc = iwindow.document;等价于iframe.contentDocument;
    (1)、获取iframe的iframe对象:console.log(“iframe”, iframe);
    在这里插入图片描述
    (2)、获取iframe的window对象:console.log(“window”, iwindow);
    在这里插入图片描述

    (3)、获取iframe的document:console.log(“document”, idoc);
    在这里插入图片描述
    (4)、获取iframe的html:console.log(“html”, idoc.documentElement);
    在这里插入图片描述

    (5)、获取head:console.log(“head”, idoc.head);
    在这里插入图片描述

    (6)、获取body:console.log(“body”, idoc.body);
    空

  3. 在父级使用window.frames[name]结合iframe的Name属性可以获取子iframe的window对象,相应的可以获取document对象,从而对子iframe进行dom操作(更便捷)。如:
    var iframes = window.frames;
    var iframe = window.frames[‘myFrame’] // 返回的就是window对象

    (1)、console.log(“iframes”, iframes);
    在这里插入图片描述
    (2)、console.log(“iframe”, iframe),与下面相同。
    在这里插入图片描述

    (3)、获取iframe的window对象:console.log(“iframe”, iframe.window);
    在这里插入图片描述

    (4)、获取iframe的document:console.log(“document”, iframe.document)
    在这里插入图片描述

  4. 在iframe中获取父级内容。
    在同域下,父页面可以获取子iframe的内容,那么子iframe同样也能操作父页面内容。在iframe中,可以通过在window上挂载的几个API进行获取:
    (1)、window.parent //获取上一级的window对象,如果还是iframe则是该iframe的window对象
    (2)、window.top //获取最顶级容器的window对象,即,就是你打开页面的文档
    (3)、window.self //返回自身window的引用。可以理解 window===window.self(脑残)

5、创建iframe元素

可使用 document.createElement() 方法来创建iframe元素:var x = document.createElement(“IFRAME”);
比如,iframe长轮询:

var iframeCon = docuemnt.querySelector('#container'),

text; //传递的信息

var iframe = document.createElement('iframe'),

iframe.id = "frame",

iframe.style = "display:none;",

iframe.name="polling",

iframe.src="target.html";

iframeCon.appendChild(iframe);

iframe.onload= function(){

var iloc = iframe.contentWindow.location,

idoc = iframe.contentDocument;

setTimeout(function(){

text = idoc.getElementsByTagName('body')[0].textContent;
console.log(text);

iloc.reload(); //刷新页面,再次获取信息,并且会触发onload函数
},2000);

}

6、iframe之间的通信

6.1、什么是主域名,什么是子域名(拓展)

  • 主域名又称一级域名或者顶级域名,由域名主体 . 域名后缀组成,整个域名通常只有1个点号。 百度的主域名是baidu.com。
  • 子域名一般会根据站点不同性质在主域名前面加上不同的前缀构成,通常比主域名多一个点或两个点。只要在主域名前面加上前缀的都是该主域名的子域名,子域名又能分为二级子域名、三级子域名、还有多级子域名。
  • 例如:百度的二级域名(子域名)www.baidu.com 如1.www.baidu.com和2.www.baidu.com这样的三级域名也同样可以成为www.baidu.com和baidu.com的子域名。
  • 拓展:子域名爆破就是指探测某个域名下的所有子域名。

6.2、iframe之间的通信

  • iframe就是一个隔离沙盒,相当于我们在一个页面内可以操控很多个标签页一样。
  • 浏览器判断你跨没跨域,主要根据两个点:一个是你网页的协议(protocol),另一个就是你的host是否相同(window.location.protocol、window.location.host)。
  1. 主域相同而子域不同,可以使用iframe进行解决document.domain = ‘’,指定相同的主域。比如在http://www.example.com/a.html和http://sub.example.com/b.html两个文件中都加上document.domain = “example.com”;
    在这里插入图片描述

  2. 当我们要向指定iframe发送信息时,首先要获取该iframe自己的window对象,然后使用该window对象的postMessage发送消息。

    • window.postMessage(message, targetOrigin, [transfer])
    1. 事件默认参数
      (1)、e.source – 消息源,消息的发送窗口/iframe。
      (2)、e.origin – 消息源的 URI(可能包含协议、域名和端口),用来验证数据源。
      (3)、e.data – 发送过来的数据。

    2. 使用注意点
      (1)、监听时使用window.addEventListener(“message”,(e)=>{}, false),必须保证监听的window和发送消息的window相同。
      (2)、需要确定先监听了message事件,再发送的消息
      (3)、targetOrigin指定了URI的话,必须是相同的域和端口号,不然会报跨域错误。
      (4)、targetOrigin使用*号的话,支持跨域,我们可以通过监听消息的默认参数e.origin来判断是否接收到了正确的消息。
      (5)、当我们明确知道origin是谁时,不要使用星号,当要接受信息时,先判断origin是否是我们要接受的源,再做后续的操作。
      (6)、获取子元素的document时要确保子元素所有dom元素已经挂载完毕,因此在原生的写法时,必须写在window的onload事件中。

    3. iframe通信示例
      (1)、 窗口1:

<!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>窗口1</div>
    <iframe src="http://127.0.0.1:5501/2.html" frameborder="1" id='123' name="abc"></iframe>
    <script>
        window.onload = function () {
            setTimeout(() => {
                window.top.postMessage('handsome', '*')
            }, 0)
        }
    </script>
</body>
</html>
(2)、窗口2
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div>窗口2</div>
    <script>
        top.addEventListener('message',(e)=>{console.log(e)},false)
    </script>
</body>
</html>
(3)、运行结果:

在这里插入图片描述

7、其他

7.1、iframe自适应

  1. iframe默认会自带滚动条,不会全屏。所以要想自适应的话首先去掉滚动条即在iframe标签上添加 scrolling=“no”。
    <iframe scrolling="no" src="./aaa" id="iframe"></iframe>
    
  2. 设置iframe的高为body的高。
     var iwindow = iframe.contentWindow;
     var idoc = iwindow.document;
     iframe.height = idoc.body.offsetHeight;
    
  3. 还可以添加其它的装饰属性。
    在这里插入图片描述
  4. 示例:
    // 可以直接写在内联里面,也可以在css里面定义,不过对于广告iframe来说,样式写在属性中,是最好的。
     <iframe id="frame" name="frame" width="160" height="600" frameborder="0" src="target.html" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true"></iframe>
    

7.2、防嵌套网页

  • iframe的使用会出现出现安全性,一共两个方面:一个是你的网页被别人iframe,另一个是你iframe别人的网页。
  • 最出名的clickhacking就是使用iframe来 拦截click事件。因为iframe享有着click的最优先权,当有人在伪造的主页中进行点击的话,如果点在iframe上,则会默认是在操作iframe的页面。 所以,钓鱼网站就是使用这个技术,通过诱导用户进行点击。

7.2.1、浏览器端

  • 前端可以使用window.top来防止你的网页被iframe
  • 限定你的网页不能嵌套在任意网页内。如果想要引用同域的框架的话,可以判断域名
    if(window != window.top){
      window.top.location.href = correctURL;
    }
    // 判断域名
    if(top.location.host != window.location.host) {
      top.location.href = window.location.href;
    }
    // 如果你网页不同域名的话,上述就会报错。可以使用try...catch...进行错误捕获。如果发生错误,则说明不同域,表示你的页面被盗用了。可能有些浏览器这样写是不会报错,所以需要降级处理再进行跳转即可。
    try{
      top.location.hostname; //检测是否出错
      //如果没有出错,则降级处理
      if (top.location.hostname != window.location.hostname) {
        top.location.href =window.location.href;
      }
    }
    catch(e){
      top.location.href = window.location.href;
    }
    

7.2.2、服务器端

  1. X-Frame-Options
    • X-Frame-Options是一个相应头,主要是描述服务器的网页资源的iframe权限。目前的支持度是IE8+。有3个选项:
      1. X-Frame-Options: DENY。拒绝任何iframe的嵌套请求。
      2. X-Frame-Options: SAMEORIGIN。只允许同源请求。例如网页为 lgg.com/123.html,則 lgg.com 底下的所有网页可以嵌入此网页,但是 lgg.com 以外的网页不能嵌入
      3. X-Frame-Options: ALLOW-FROM。只允许指定网页的iframe请求,不过兼容性较差Chrome不支持
    • X-Frame-Options其实就是将前端js对iframe的把控交给服务器来进行处理。
    // 等价于X-Frame-Options: DENY
    if(window != window.top){
      window.top.location.href = window.location.href;
    }
    // 等价于X-Frame-Options: SAMEORIGIN
    if(top.location.hostname != window.location.hostname) {
      top.location.href =window.location.href;
    }
    
    • 该属性是对页面的iframe进行一个主要限制。另外还有一个Content Security Policy,同样也可以对iframe进行限制,而且,他应该是以后网页安全防护的主流。
  2. sandbox
    • sandbox是h5的一个新属性(IE10+支持),就是用来给指定iframe设置一个沙盒模型限制iframe的更多权限。
    • 启用方式:添加sandbox属性。
    <iframe sandbox src="..."></iframe>
    
    • 会对iframe页面进行一系列的限制:
      1. script脚本不能执行。
      2. 不能发送ajax请求。
      3. 不能使用本地存储,即localStorage,cookie等。
      4. 不能创建新的弹窗和window。
      5. 不能发送表单。
      6. 不能加载额外插件比如flash等。
    • 可以在sandbox里面进行一些设置:
    <iframe sandbox="allow-forms allow-same-origin allow-scripts" src="..."></iframe>
    
    在这里插入图片描述

7.3、iframe使用场景

  1. PDF文档预览。
  2. 插入广告等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用HBuilderX软件快速搭建Vue项目

1.node.js环境下载 node.js相当于java中jdk,但是是在服务器端的 JavaScript,需要通过npm去管理node.js的包,通过npm可以下载node.js中的扩展 ①首先下载node.js的安装包 https://nodejs.org/zh-cn/download/releases/(以往版本) ②选择node.js的下载路径配置环境变量(一般会…

5分钟带你看懂 prettier + eslint 搭配(vscode)

最近身边不少朋友在用eslint和prettier搭配的时候&#xff0c;总是遇到一些莫名其妙的报错&#xff0c;自己也不知道怎么配&#xff0c;所以我总结了一下自己搭配的步骤&#xff0c;分享一下&#xff0c;如有不对之处&#xff0c;静请诸位大佬雅正&#xff01; 本文按顺序配置一…

轻松实现在web页面中直接播放rtsp视频流

轻松实现在web页面中直接播放rtsp视频流写在前面实现介绍如何使用准备ffmpeg运行rtsp2web参数说明前端代码参数说明课外知识写在前面 我之前研究在 web 中直接播放 rtsp 视频流时&#xff0c;写过一篇文章&#xff1a;【前端】rtsp 与 rtmp 视频流的播放方法。阅读 这篇文章 对…

vue3 props属性基本使用梳理

前言 vue2中props属性的使用是比较统一的基本就一种方式&#xff0c;但是vue3中其实方式是比较多的&#xff0c;因此就打算梳理一下。 会按照选项式和组合式进行梳理&#xff0c;包括属性的定义、取值以及属性的监听。 应该是叫单文件组件和组合式API&#xff0c;不知道vue官…

在vscode中创建vue项目

1. 背景 昨天对一次成功用新电脑在vscode上跑成功项目工程里的vue项目&#xff0c;今天目标是自己用vscode新建一个vue项目 关于vue环境配置请看这篇&#xff1a;使用vscode运行Vue项目 2. 准备工作&#xff08;也可跳过此步骤&#xff09; 安装Vetur&#xff0c;一款Vue代码…

unplugin-auto-import的使用

1、unplugin-auto-import插件的解决的问题unplugin-auto-import 这个插件是为了解决在开发中的导入问题&#xff0c;比如经常不清楚相对路径的问题&#xff0c;这个插件就是解决这个问题这个插件会在根目录生成一个auto-import.d.ts&#xff0c;这个文件会将所有的插件导入到gl…

node.js安装及环境配置(保姆级)

一.node安装 1.去node官网安装Node.js 2.官网界面 3.无脑下一步&#xff0c;完成安装。&#xff08;最好放在d盘&#xff09; 4.安装完成之后管理员cmd查看是否安装成功&#xff0c;出现如下界面说明已经安装成功 5.打开Node文件目录&#xff0c;如下图: 6.在Node文件目录下建…

你评论,我赠书~【哈士奇赠书 - 12期】-〖爬虫逆向进阶实战〗参与评论,即可有机获得

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

Vue Grid Layout -️ 适用Vue.js的栅格布局系统(保姆级使用教程)

目录 一、 Vue Grid Layout 简介 二、vue-grid-layout 的安装与使用 三、 属性 3.1 gridItem 的必须属性 3.2 框架元素的实际宽度高度计算方式 3.3 gridLayout 的属性 四、事件 五、vue-grid-layout 的实际应用 5.1 移动到任意位置 5.2 移动事件与调整大小 5.3 实现…

Vue显示图片的几种方式

前言 最近在做自己的项目&#xff0c;有这么一个需求&#xff0c;用户列表需要展示用户的头像&#xff0c;之前一直没有处理&#xff0c;趁着这次机会&#xff0c;正好分享下我的解决过程。 头像这一栏空荡荡的&#xff0c;我这种强迫症患者难受死&#xff01; 首先声明下&am…

vue面试题整理(2022-持续更新中...)

vue中MVVM的理解 M&#xff1a;模型&#xff08;Model&#xff09;&#xff1a;数据模型&#xff1b;负责数据存储。泛指后端进行的各种业务逻辑处理和数据操控&#xff0c;主要围绕数据库系统展开。 V就是&#xff1a;View 视图&#xff1a; 负责页面展示&#xff0c;也就是用…

IDEA使用vue的安装与配置(详细教程)

在idea中使用vue首先idea的配置以及环境要搭建好&#xff0c;然后就按照以下操作进行就可以&#xff01;&#xff08;注&#xff1a;我使用的idea是2021.1.3 版本&#xff09; 第一步 去官网下载node.js ,官网地址&#xff1a;https://nodejs.org/en/ 然后进行安装&#xff0…

封装一个uniapp的全局弹窗组件,vue中也可以使用,在任何页面都可以弹出

效果图&#xff1a; 场景&#xff1a; 当你对接websocket时&#xff0c;或者轮询也好&#xff0c;你需要获取到最新的信息&#xff0c;并且在任何页面弹出一个组件进行后续操作 思路&#xff1a; 1、先封装好要弹出的公共组件 2、向vue原型上挂载全局方法&#xff0c;拿到组件真…

VUE2安装步骤

一、node.js安装和配置 1.安装前&#xff0c;先看看自己电脑上有没有node.js 打开命令提示符&#xff0c;尽量选择管理员身份打开&#xff0c;或者按winR&#xff0c;输入cmd打开也行 打开后输入node -v 查看自己电脑是否安装node&#xff0c;以及版本号 node -v 我这里显示v…

vsCode中vue文件无法提示html标签

铅笔头课堂&#xff0c;有态度的前端培训 今天有同学问到老师&#xff1a;“ 老师&#xff0c;我的vue文件里书写html代码不提示了 ”&#xff0c;这个问题别说还真有点冷门&#xff0c;老师研究了一番之后终于妥善修复了这个问题&#xff0c;这里就将处理结果记录下来&#xf…

如何部署WebSpoon9.0.0(Kettle的Web版本)

前言 Kettle 是小有名气的开源ETL工具&#xff0c;现已改名为PDI&#xff08;Pentaho Data Integration&#xff09;&#xff0c;其Web版本为&#xff1a;WebSpoon&#xff0c;本文记录了从官方Git仓库中拉取代码并成功运行的过程。 一、在本地拉取并编译项目 参考来源&#…

基于Echarts实现可视化数据大屏大数据可视化

前言 &#x1f680; 基于 Echarts 实现可视化数据大屏响应式展示效果的源码,&#xff0c;基于htmlcssjavascriptecharts制作&#xff0c; 可以在此基础上重新开发。 本项目中使用的是echarts图表库&#xff0c;ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图&…

flex 的 三个参数:flex-grow、flex-shrink、flex-basis

前言&#xff1a; 之前对于 flex 布局没有太深刻的理解&#xff0c;往往就只是给 父元素加上 display&#xff1a;flex 属性&#xff0c;在近期学习的过程中了解到 flex 属性是 flex-grow、flex-shrink、flex-basis 三个属性的缩写&#xff0c;来看下面这一个例题&#xff0c…

基于Java Web的图书管理系统

目录 1.系统简要概述 2.系统主要用到的数据库表 3.主要功能 管理员&#xff1a; 用户&#xff1a; 3.1管理员功能 3.11登录 3.12添加学生 3.13查看学生 3.14删除学生 3.15添加书籍 3.16查看书籍 3.2用户端功能 3.2.1登录 3.2.2注册 3.2.3查询图书 3.2.4借阅书籍…

前端实现分页效果

前言 在实际开发中&#xff0c;大部分分页都是配合后端完成的。但是&#xff0c;有时候并不是这样&#xff0c;并非不是这样。后端会一次性返回所有的数据&#xff0c;而我们前端不可能展示所有数据&#xff0c;而是弄一个分页效果。还有一些场景也是需要前端自己弄的分页&…