iframe 的使用理解

这篇具有很好参考价值的文章主要介绍了iframe 的使用理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是 iframe。

frame 用于在页面内显示页面,使用 iframe 会创建包含另外一个文档的内联框架(即行内框架)

<iframe src="URL"></iframe>

二、iframe 的常用属性

1、width

定义 iframe 的宽度

2、height

定义 iframe 的高度

3、name

规定 iframe 的名称

4、frameborder

规定是否显示边框,值为 0(不显示)和 1(显示)

5、scrolling

规定是否在 iframe 中显示滚动条,值为 yes、no、auto

6、src

设置 iframe 的地址(页面/图片)

7、srcdoc

用来替换 iframe 中 html、body 里的内容(IE 不支持)

8、sandbox

对 iframe 进行内容限制,值为

  • allow-forms
  • allow-same-origin
  • allow-scripts
  • allow-top-navigation

支持 IE10+

三、获取 iframe 中的内容

1. 获取 iframe

var iframe = document.getElementById("iframe1");

2. 获取 iframe 的 window 对象

  • 通过 iframe.contentWindow
var iwindow = iframe.contentWindow;
  • 通过 window.frames[‘name’]
    这种方法同样可以获取 window 对象
var iwindow = window.frames["name"];

3. 获取 iframe 的 document 对象

  • 获取 iframe 的 document 对象
var idoc = iwindow.document;

四、在 iframe 中获取父级内容

  1. 获取上一级 window 对象
    通过 window.parent 获取上一级 window 对象(iframe 可以有多层使用)

  2. 获取最顶级容器的 window 对象
    通过 window.top 获取 window 对象(即打开页面时的文档)

  3. 返回自身 window 对象
    通过 window.self 返回自身 window 对象

五、iframe 的长轮询

长轮询就是在 ajax 的 readyState = 4 的时,再次执行原函数。

这里使用 iframe 也是一样,异步创建 iframe,然后 reload。

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);
}

这样就可以实现 ajax 长轮询的效果。

当然,这里只是使用 reload 进行获取,也可以添加 iframe 和删除 iframe 的方式,进行发送信息,这些都是根据具体场景应用的。

另外在 iframe 中还可以实现异步加载 js 文件,不过,iframe 和主页是共享连接池的,现在基本上都被 XHR 和 hard calllback 取缔了。

六、自适应 iframe - 广告嵌入

广告通常与原文无关,如果直接在某个 div 下嵌套,会造成网页布局的紊乱,而且还需要引入额外的 css 和 js 文件,极大降低了网页的安全性。这些所有的弊端,都可以使用 iframe 进行解决。

可以将 iframe 理解为一个沙盒,里面的内容能够被 top window 完全控制,而且,主页的 css 样式不会入侵 iframe 里面的样式

默认情况下,iframe 会自带滚动条,不会全屏,如果想自适应 iframe 的话:

1、去掉滚动条

<iframe src="./iframe1.html" id="iframe1" scrolling="no"></iframe>
2、设置 iframe 的高为 body 的高
var iwindow = iframe.contentWindow;
var idoc = iwindow.document;
iframe.height = idoc.body.offsetHeight;

另外,还可以添加其它的装饰属性:

属性 效果
allowtransparency true or false 是否允许 iframe 设置为透明,默认为 false
allowfullscreen true or false 是否允许 iframe 全屏,默认为 false

七、iframe 的安全性

1. 防嵌套网页

iframe 享有 click 优先权,当有人在伪造的主页中进行点击的话,如果点在 iframe 上,则会默认是在操作 iframe 的页面。所以,钓鱼网站就是使用这个技术,通过诱导用户进行点击。

为了防止网站被钓鱼,可以使用 window.top 来防止网页被 iframe,即限定你的网页不能被嵌套在任何网页内:

// iframe2.html
if (window != window.top) {
  window.top.location.href = correctURL;
}

2. X-Frame-Options

X-Frame-Options 是一个相应头,主要是描述服务器的网页资源的 iframe 权限,有 3 个选项:

  • DENY:当前页面不能被嵌套 iframe 里,即便是在相同域名的页面中嵌套也不允许,也不允许网页中有嵌套 iframe
  • SAMEORIGIN:iframe 页面的地址只能为同源域名下的页面
  • ALLOW-FROM:可以在指定的 origin url 的 iframe 中加载
    简单实例:
X-Frame-Options: DENY
拒绝任何 iframe 的嵌套请求

X-Frame-Options: SAMEORIGIN
只允许同源请求,例如网页为 foo.com/123.php,則 foo.com 底下的所有网页可以嵌入此网页,但是 foo.com 以外的网页不能嵌入

X-Frame-Options: ALLOW-FROM http://s3131212.com
只允许指定网页的 iframe 请求,不过兼容性较差 Chrome 不支持

X-Frame-Options 其实就是将前端 js 对 iframe 的把控交给服务器来进行处理

// js
if (window != window.top) {
window.top.location.href = window.location.href;
}
// 等价于
X-Frame-Options: DENY

// js
if (top.location.hostname != window.location.hostname) {
top.location.href = window.location.href;
}
// 等价于
X-Frame-Options: SAMEORIGIN

该属性是对页面的 iframe 进行一个主要限制,不过,涉及 iframe 的 header 可不止这一个,另外还有一个 Content Security Policy,同样也可以对 iframe 进行限制

3. sandbox

sandbox 就是用来给指定 iframe 设置一个沙盒模型限制 iframe 的更多权限
sandbox 是 h5 的一个新属性,IE10+支持
启用方式就是使用 sandbox 属性:


<iframe sandbox src=...></iframe>

这样会对 iframe 页面进行一系列的限制:

  • script 脚本不能执行
  • 不能发送 ajax 请求
  • 不能使用本地存储,即 localStorage,cookie 等
  • 不能创建新的弹窗和 window
  • 不能发送表单
  • 不能加载额外插件比如 flash 等
    同时可以放宽一点权限。在 sandbox 里面进行一些简单设置
<iframe sandbox=”allow-same-origin” src=...></iframe>

常用的配置项有:

配置 效果
allow-forms 允许进行提交表单
allow-scripts 运行执行脚本
allow-same-origin 允许同域请求,比如 ajax,storage
allow-top-navigation 允许 iframe 能够主导 window.top 进行页面跳转
allow-popups 允许 iframe 中弹出新窗口,比如 window.open,target=“_blank”
allow-pointer-lock 在 iframe 中可以锁定鼠标,主要和鼠标锁定有关

可以通过在 sandbox 里,添加允许进行的权限.


<iframe sandbox=”allow-forms allow-same-origin allow-scripts” src=...></iframe>

这样可以保证 js 脚本的执行,但是禁止 iframe 里的 javascript 执行 top.location = self.location

八、iframe 的局限

1、创建比一般的 DOM 元素慢了 1-2 个数量级

iframe 的创建比其它包括 scripts 和 css 的 DOM 元素的创建慢了 1-2 个数量级,使用 iframe 的页面一般不会包含太多 iframe,所以创建 DOM 节点所花费的时间不会占很大的比重。但带来一些其它的问题:onload 事件以及连接池(connection pool)

2、阻塞页面加载

及时触发 window 的 onload 事件是非常重要的。onload 事件触发使浏览器的 “忙” 指示器停止,告诉用户当前网页已经加载完毕。当 onload 事件加载延迟后,它给用户的感觉就是这个网页非常慢。

window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 SRC 可以避免这种阻塞情况

3、唯一的连接池

浏览器只能开少量的连接到 web 服务器。比较老的浏览器,包含 Internet Explorer 6 & 7 和 Firefox 2,只能对一个域名(hostname)同时打开两个连接。这个数量的限制在新版本的浏览器中有所提高。Safari 3+ 和 Opera 9+ 可同时对一个域名打开 4 个连接,Chrome 1+, IE 8 以及 Firefox 3 可以同时打开 6 个。

绝大部分浏览器,主页面和其中的 iframe 是共享这些连接的。这意味着 iframe 在加载资源时可能用光了所有的可用连接,从而阻塞了主页面资源的加载。如果 iframe 中的内容比主页面的内容更重要,这当然是很好的。但通常情况下,iframe 里的内容是没有主页面的内容重要的。这时 iframe 中用光了可用的连接就是不值得的了。一种解决办法是,在主页面上重要的元素加载完毕后,再动态设置 iframe 的 SRC。

4、不利于 SEO

搜索引擎的检索程序无法解读 iframe。

另外,iframe 本身不是动态语言,样式和脚本都需要额外导入。综上,iframe 应谨慎使用。

iframe 的使用理解

参考文章@Leophen文章来源地址https://www.toymoban.com/news/detail-696520.html

到了这里,关于iframe 的使用理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是AJAX?如何使用原生JavaScript搭建AJAX请求?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月11日
    浏览(44)
  • 什么是AJAX?如何使用原生JavaScript进行AJAX请求?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月07日
    浏览(38)
  • 【AngularJs】前端使用iframe预览pdf文件报错

    iframe style=\\\"width: 100%; height: 100%;\\\" src=\\\"{{vm.previewUrl}}\\\"/iframe 在ctrl文件中信任该文件就可以了 vm.trustUrl = $sce.trustAsResourceUrl(vm.previewUrl);//信任该文件  在html中:   X-Frame-Options: HTTP 响应头是用来给浏览器 指示允许一个页面 可否在 frame ,  iframe ,  embed  或者  object  中展现的标记

    2024年04月25日
    浏览(41)
  • 【前端基础知识】网易云音乐iframe外链的使用

    HTML 内联框架元素 ( iframe) 表示嵌套的浏览上下文(browsing context)。它能够将另一个 HTML 页面 嵌入 到当前页面中。 使用网页版的网易云音乐! 这一串就是网易云音乐的外链了 新建一个html页面,复制这个标签到head里就可以了。 要注意的是需要在src开头加上协议:https:或者

    2024年02月08日
    浏览(48)
  • javascript常见100问|前端基础知识|问ajax-fetch-axios-区别请用 XMLHttpRequestfetch 实现 ajax节流和防抖px em rem vw/箭头函数的缺点

    HTML CSS JS HTTP 等基础知识是前端面试的第一步,基础知识不过关将直接被拒。本章将通过多个面试题,讲解前端常考的基础知识面试题,同时复习一些重要的知识点。 扎实的前端基础知识,是作为前端工程师的根本。基础知识能保证最基本的使用,即招聘进来能干活,能产出

    2024年04月27日
    浏览(49)
  • 9.Vue前端使用iframe集成帆软报表的单点登录

    一、背景 需要把帆软报表内嵌到若依里面来。 二、帆软设置 2.1 帆软报表的url 打开帆软后端里面的【目录管理】查看具体报表的url 帆软报表的具体地址为: Frm聚合报表地址: 【帆软的服务http】+【/webroot/decision/view/form?viewlet=demo/demo.frm】 CPT普通报表的地址:【帆软的服务ht

    2024年01月25日
    浏览(39)
  • 零基础学前端(二)用简单案例去理解 HTML 、CSS 、JavaScript 概念

    该篇适用于从零基础学习前端的小白 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 HTML,CSS,JavaScript 都是单独的语言;他们构成前端技术基础; (1)HTML:负责网页的架构; (2)CSS:负责网页的样式,美化; (3)JavaScript(JS):负责

    2024年02月08日
    浏览(51)
  • AJAX 使用 JavaScript 的 `XMLHttpRequest` 对象来向服务器发送异步请求

    AJAX 是一种使用异步 HTTP (Ajax) 请求获取和发送数据的技术。它使得网页能够进行异步更新,而不需要重新加载整个页面。通过使用 AJAX,可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。 AJAX 使用 JavaScript 的 XMLHttpRequest 对象来向服务器发送异步请

    2024年01月16日
    浏览(53)
  • 【JavaScript】动态监听iframe高度以及监听iframe内部链接跳转

    目录 背景 实现方式 实现思路 实现代码 扩展场景 参考文档 在日常开发中会遇到一种情况,就是页面需要嵌套iframe,由于iframe无法自适应里面样式高度,所以我们需要去监听iframe的动态高度 MutationObserver 定义观察器MutationObserver 监听iframe的contenWindow的 DOMContentLoaded 事件(当初始

    2024年02月07日
    浏览(48)
  • 前端经典面试题 | 吊打面试官系列 之 说说你对TypeScript 和 JavaScript的理解

    🖥️ 前端经典面试题 专栏:吊打面试官系列 之 说说你对TypeScript 和 JavaScript的理解 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、回答

    2024年01月17日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包