详解iframe与frame的区别

开门见山了,大家需要注意的地方:HTML5不再支持使用frame,iframe只有src 属性

优点:

  1.程序调入静态页面比较方便;   2.页面和程序分离;

缺点:

  1.iframe有不好之处:样式/脚本需要额外链入,会增加请求。另外用js防盗链只防得了小偷,防不了大盗。   2.iframe好在能够把原先的网页全部原封不动显示下来,但是如果用在首页,是搜索引擎最讨厌的.那么你的网站即使做的在好,也排不到好的名次!如果是动态网页,用include还好点!但是必须要去除他的<body><a href="https://www.jb51.cc/tag/biaoqian/" target="_blank" class="keywords">标签</a>!   3.框架结构有时会让人感到迷惑,特别是在多个框架中都出现上下、左右滚动条的时候。这些滚动条除了会挤占已经特别有限的<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>空间外,还会分散访问者的留心力。访问者遇到这种<a href="https://www.jb51.cc/tag/zhandian/" target="_blank" class="keywords">站点</a>往往会立刻转身离开。他们会想,既然你的主页如此混乱,那么<a href="https://www.jb51.cc/tag/zhandian/" target="_blank" class="keywords">站点</a>的其他部分也许更不值得阅读。(这里面本人的观点就是子框架不要出现滚动条,窗口的滚动条只能有由主<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>来控制)   4.<a href="https://www.jb51.cc/tag/lianjie/" target="_blank" class="keywords">链接</a>导航疑问。运用框架结构时,你必须保证正确配置所有的导航<a href="https://www.jb51.cc/tag/lianjie/" target="_blank" class="keywords">链接</a>,如不然,会给访问者带来很大的麻烦。比如被<a href="https://www.jb51.cc/tag/lianjie/" target="_blank" class="keywords">链接</a>的<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>出现在导航框架内,这种情况下访问者便被陷住了,因为此时他没有其他地点可去。   5.<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>外部<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>,需要额外<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>css,给<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>带来额外的请求<a href="https://www.jb51.cc/tag/cishu/" target="_blank" class="keywords">次数</a>;</p> <p><span style="color: #0000ff">二、为什么少用iframe</p> <p>  iframes 提供了<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>简单的方式把<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>网站的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>嵌入到另<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>网站中。但我们需要慎重的使用iframe。iframe的创建比其它<a href="https://www.jb51.cc/tag/baokuo/" target="_blank" class="keywords">包括</a>scripts和css的 DOM 元素的创建慢了 1-2 个<a href="https://www.jb51.cc/tag/shuliang/" target="_blank" class="keywords">数量</a>级。 </p> <p>  使用 iframe 的<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>一般不会包含太多 iframe,所以创建 DOM 节点所花费的时间不会占很大的比重。但带来一些其它的问题:onload 事件以及连接池(connection pool)。 </p> <p><h3>1.Iframes 阻塞<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>加载</h3> </p> <p>  及时触发 window 的 onload 事件是非常重要的。onload 事件触发使浏览器的 “忙” 指示器停止,告诉<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>当前网页已经加载完毕。当 onload 事件加载延迟后,它给<a href="https://www.jb51.cc/tag/yonghu/" target="_blank" class="keywords">用户</a>的感觉就是这个网页非常慢。 </p> <p>  window 的 onload 事件需要在所有 iframe 加载完毕后(包含里面的元素)才会触发。在 Safari 和 Chrome 里,通过 JavaScript 动态设置 iframe 的 SRC 可以避免这种阻塞情况。 </p> <p><h3>2.唯一的连接池</h3> </p> <p>  浏览器只能开少量的连接到web服务器。比较老的浏览器,包含 Internet Explorer 6 & 7 和 Firefox 2,只能对<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>域名(hostname)同时打开两个连接。这个<a href="https://www.jb51.cc/tag/shuliang/" target="_blank" class="keywords">数量</a>的限制在新版本的浏览器中有所提高。Safari 3+ 和 Opera 9+ 可同时对<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>域名打开 4 个连接,Chrome 1+,IE 8 以及 Firefox 3 可以同时打开 6 个。你可以通过这篇<a href="https://www.jb51.cc/tag/wenzhang/" target="_blank" class="keywords">文章</a>查看具体的数据表:Roundup on P<a href="https://www.jb51.cc/tag/ara/" target="_blank" class="keywords">ara</a>llel Connections. </p> <p>  有人可能希望 iframe 会有自己独立的连接池,但不是这样的。绝大部分浏览器,主<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>和其中的 iframe 是共享这些连接的。这意味着 iframe 在加载资源时可能用光了所有的可用连接,从而阻塞了主<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>资源的加载。如果 iframe 中的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>比主<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>更重要,这当然是很好的。但通常情况下,iframe 里的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>是没有主<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>重要的。这时 iframe 中用光了可用的连接就是不值得的了。一种<a href="https://www.jb51.cc/tag/jiejue/" target="_blank" class="keywords">解决</a>办法是,在主<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>上重要的元素加载完毕后,再动态设置 iframe 的 SRC。 </p> <p>  美国前 10 大网站都使用了 iframe。大部分情况下,他们用它来加载广告。这是可以理解的,也是一种符合逻辑的<a href="https://www.jb51.cc/tag/jiejuefang/" target="_blank" class="keywords">解决方</a>案,用一种简单的办法来加载广告服务。但请记住,iframe 会给你的<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a><a href="https://www.jb51.cc/tag/xingneng/" target="_blank" class="keywords">性能</a>带来冲击。只要可能,不要使用 iframe。当确实需要时,谨慎的使用他们。 </p> <p><span style="color: #0000ff">三、iframe和frame的区别 </p> <p>1、frame不能脱离frameSet单独使用,iframe可以; 2、frame不能放在body中; </p> <p>如下可以正常<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>: </p> <div class="jb51code"> <pre class="b<a href="https://www.jb51.cc/tag/rush/" target="_blank" class="keywords">rush</a>:js;"> <!--<body>--> <frameset rows="50%,*"> <frame name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <frame name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </frameset> <!--<body>--> </pre> </div> <p>  如下不能正常<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>: </p> <div class="jb51code"> <pre class="b<a href="https://www.jb51.cc/tag/rush/" target="_blank" class="keywords">rush</a>:js;"> <body> <frameset rows="50%,*"> <frame name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <frame name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </frameset> <body> </pre> </div> <p>3、嵌套在frameSet中的iframe必需放在body中; 如下可以正常<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>: </p> <div class="jb51code"> <pre class="b<a href="https://www.jb51.cc/tag/rush/" target="_blank" class="keywords">rush</a>:js;"> <body> <frameset> <iframe name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <iframe name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </frameset> </body> </pre> </div> <p>如下不能正常<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>: </p> <div class="jb51code"> <pre class="b<a href="https://www.jb51.cc/tag/rush/" target="_blank" class="keywords">rush</a>:js;"> <!--<body>--> <frameset> <iframe name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <iframe name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </frameset> <!--</body>--> </pre> </div> <p>4、不嵌套在frameSet中的iframe可以随意使用; </p> <p>如下均可以正常<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>: </p> <div class="jb51code"> <pre class="b<a href="https://www.jb51.cc/tag/rush/" target="_blank" class="keywords">rush</a>:js;"> <body> <iframe name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <iframe name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </body> <!--<body>--> <iframe name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <iframe name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> <!--</body>--> </pre> </div> <p>5、frame的高度只能通过frameSet控制;iframe可以自己控制,不能通过frameSet控制,如: </p> <div class="jb51code"> <pre class="b<a href="https://www.jb51.cc/tag/rush/" target="_blank" class="keywords">rush</a>:js;"> <!--<body>--> <frameset rows="50%,*"> <frame name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <frame name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </frameset> <!--</body>--> <body> <frameset> <iframe height="30%" name="frame1" src="http://gongxquan.blog.163.com/test1.htm"/> <iframe height="100" name="frame2" src="http://gongxquan.blog.163.com/test2.htm"/> </frameset> </body> </pre> </div> <p>6、如果在同<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a><a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>使用了两个以上的iframe,在IE中可以正常<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>,在firefox中只能<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>出第<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>(firefox已经改进,这个问题已经不存在了);使用两个以上的frame在IE和firefox中均可正常</p> <p><h3>小结:</h3> </p> <p>Frame与Iframe两者可以实现的<a href="https://www.jb51.cc/tag/gongneng/" target="_blank" class="keywords">功能</a>基本相同,不过Iframe比Frame具有更多的灵活性。 frame是整个<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>的框架,iframe是内嵌的网页元素,也可以说是内嵌的框架 Iframe<a href="https://www.jb51.cc/tag/biaoji/" target="_blank" class="keywords">标记</a>又叫浮动帧<a href="https://www.jb51.cc/tag/biaoji/" target="_blank" class="keywords">标记</a>,可以用它将<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>HTML文档嵌入在<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>HTML中<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>。它和Frame<a href="https://www.jb51.cc/tag/biaoji/" target="_blank" class="keywords">标记</a>的最大区别是在网页中嵌入 的<Iframe></Iframe>所包含的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>与整个<a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>是<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>整体,而<Frame>< /Frame>所包含的<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>是<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a>独立的个体,是可以独立<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>的。另外,应用Iframe还可以在同<a href="https://www.jb51.cc/tag/yige/" target="_blank" class="keywords">一个</a><a href="https://www.jb51.cc/tag/yemian/" target="_blank" class="keywords">页面</a>中多次<a href="https://www.jb51.cc/tag/xianshi/" target="_blank" class="keywords">显示</a>同一<a href="https://www.jb51.cc/tag/neirong/" target="_blank" class="keywords">内容</a>,而不必重复这段内 容的<a href="https://www.jb51.cc/tag/daima/" target="_blank" class="keywords">代码</a>。</p><div class="topcard-tags"><a href="https://m.jb51.cc/tag/iframeyuframedequbie/" class="tag_link" target="_blank">iframe与frame的区别</a></div> </div> </div> </div> <!-- row end--> <div class="clearfix"></div> <!-- row --> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <div class="title"><h1>相关文章</h1></div><div class="list_con"> <img src="https://m.jb51.cc/res/2024/09-25/18/879e7ec08a36083a57dfc8b44214469d.gif" width="100" height="64" style="float:right;margin-left:20px;" /> <div class="title"> <a href="https://m.jb51.cc/js/4742335.html" title="自定义web弹窗/层:简易风格的msg与可拖放的dialog,生成博客园文章目录弹窗">自定义web弹窗/层:简易风格的msg与可拖放的dialog,生成博客园文章目录弹窗</a> </div> <div class="summary">前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...</div> </div><div class="list_con"> <img src="https://m.jb51.cc/res/2024/09-25/18/84bd76d88488cafdfb2789b5a991fecf.png" width="100" height="64" style="float:right;margin-left:20px;" /> <div class="title"> <a href="https://m.jb51.cc/js/4742334.html" title="nice-validator表单验证插件的简单使用">nice-validator表单验证插件的简单使用</a> </div> <div class="summary">前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...</div> </div><div class="list_con"> <img src="https://m.jb51.cc/res/2024/09-25/18/cf659cff914621d918c6072273c30973.gif" width="100" height="64" style="float:right;margin-left:20px;" /> <div class="title"> <a href="https://m.jb51.cc/js/4742333.html" title="基于“formData批量上传的多种实现” 的多图片预览、上传的多种实现">基于“formData批量上传的多种实现” 的多图片预览、上传的多种实现</a> </div> <div class="summary">前言 图片上传是web项目常见的需求,我基于之前的博客的代码...</div> </div><div class="list_con"> <img src="https://m.jb51.cc/res/2024/09-25/18/02f80db4fdf55f3a24674e2854e018f2.png" width="100" height="64" style="float:right;margin-left:20px;" /> <div class="title"> <a href="https://m.jb51.cc/js/4742332.html" title="踹掉后端,前端导出Excel!">踹掉后端,前端导出Excel!</a> </div> <div class="summary">前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...</div> </div><div class="list_con"> <img src="https://m.jb51.cc/res/2024/09-25/18/db8dce1453ed09a8230451f2a9fcdc68.png" width="100" height="64" style="float:right;margin-left:20px;" /> <div class="title"> <a href="https://m.jb51.cc/js/4742331.html" title="Web Worker——js的多线程,实现统计博客园总阅读量、总评论量、总推荐量">Web Worker——js的多线程,实现统计博客园总阅读量、总评论量、总推荐量</a> </div> <div class="summary">前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...</div> </div><div class="list_con"> <img src="https://m.jb51.cc/res/2024/09-25/18/1cd1c972ce822d1a99b7d1b2c8f9cfcd.png" width="100" height="64" style="float:right;margin-left:20px;" /> <div class="title"> <a href="https://m.jb51.cc/js/4742330.html" title="select标签 禁止选择但又能通过序列化form表单传值到后台">select标签 禁止选择但又能通过序列化form表单传值到后台</a> </div> <div class="summary">前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...</div> </div></div> </div> <!-- row end--> </div> </div> <footer id="footer"> <div class="container"> <div class="copyright"> Copyright © 2018 编程之家. 当前版本 V7.0.16<br> <span class="ml5">编程之家 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">闽ICP备13020303号-8</a> </div> </div> </footer> <script> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(bp, s); })(); </script> <script src="https://m.jb51.cc/js/count.js"></script> </body> </html>