`

JavaScript专题(二):深入理解iframe

阅读更多

一 目的

  iframe是网页布局中重要的元素,是解决一些常见前端问题的必修课,而iframe总是让人捉摸不透,不好掌握。关于iframe,有很多问题我们必须要彻底弄清。笔者累一年经验,3天构思,欲阐述关于iframe的那些事。虽然都是常见的知识,但是很少有人能深入理解,灵活使用。

  iframe在布局,无刷新方面都有极其中重要,不可替代的地位。虽然现在流行DIV布局,但是有时还得用iframe布局;虽然2005年流行使用AJAX进行无刷新,但是在特效情况下还得使用iframe;在flash动画内嵌html时,iframe更是必不可少。本文的主要目的就是针对这些问题展开讨论,并且总结。本文目的有:

  1.iframe的基础,深入理解frame是何物,属性该如何设置。

  2.iframe自适应高宽,即ifrmae在布局方面的应用。

  3.iframe的表单无刷新,iframe在上传文件时的无刷新作用。

  4.iframe的跨越问题。

  5.iframe与jQuery。

  请不要怀疑iframe的缺点,不要担心iframe的使用量。各大网站都在使用,淘宝,百度,新浪,博客园,都能找到iframe的踪迹。

二 什么是iframe

  iframe即内联框架。不同于frame,frame与frameset综合使用,成为帧,框架集。frame已经不大使用了,说白了,frame是僵硬的叠加,iframe是内联的,不是简单的叠加,而是承前启后,对于外围的页面,iframe是一个普通的元素,对于iframe里面的内容,又是一个五脏俱全的页面。iframe的写法是:

  <iframe id="coreIframe" name="coreIframe" src="/blank.html"></iframe>

可以看出,iframe毫无神秘可言,就是一个普通的元素,与span,div一样。那么,iframe是内联元素还是块元素?第一,iframe可以设置width,height并且有效。第二,iframe像普通文本一样不会换行。看图:

 

  由此两点,可以判定:

  iframe是inline-block元素。

  iframe的基本属性与其他元素一样,有样式的,也有特有的。其中,关于样式的完全可以使用css设置。有些属性不建议使用,也没有必要使用,下面列出iframe的常用属性:

  1.frameborder:是否显示边框,yes,no。

  2.height:框架作为一个普通元素的高度,建议在使用css设置。

  3.width:框架作为一个普通元素的宽度,建议使用css设置。

  4.name:框架的名称,window.frame[name]时专用的属性。

  5.scrolling:框架的是否滚动。yes,no,auto。

  6.src:内框架的地址,可以使页面地址,也可以是图片的地址。

比较特别的iframe属性只用三个:frameborder,scrolling,src,所有的iframe几乎都要指定。典型的iframe元素一般是:

  <iframe id="mainIframe" name="mainIframe" src="http://www.baidu.com" frameborder="0" scrolling="auto" ></iframe>

  <iframe id="mainIframe" name="mainIframe" src="blank.html" frameborder="0" scrolling="auto" ></iframe>

并且使用css设置其样式:

  #mainIframe{

    width:1000px;

    height:800px;

    border:1px blue solid;

    margin-left:10px;

  }

  上面都是将iframe作为一个普通元素看待,看的出来,iframe就是一个普通的元素。

三 iframe自适应高度

  iframe的自适应高宽是个不小的难题。所谓的iframe高度自适应,一般就是要嵌入的iframe符合以下要求:

  1.内嵌的iframe,要适应父页面,当需要滚动条,滚动条显示,不需要时,滚动条不显示。

  2.当父页面窗口发生变化时,iframe也会变化。

  3.当iframe的内容变化时,其滚动条也要适应。

  首先,不要盲目的去关注这个命题,而应该理解,哪些东西影响了iframe的高宽,iframe在页面中如何表现。如果对页面的高度,宽度不不够了解,经常糊涂,请看笔者的另两篇文章,页面的高度发微页面的宽度发微。要是做到高宽自适应,无非是在父页面的窗口大小,文档大小,iframe元素的高宽,子页面的窗口大小,文档大小,等方面下功夫。首先,父页面是我们编写的,窗口大小由用户即浏览器决定,文档大小由页面内容决定,而子页面的文档大小,我们也许不能决定,如果是跨越的。幸好,iframe的自适应高宽无需使用文档大小。而只需要窗口大小和iframe元素大小,其中窗口大小是只读的,所以只需要关心iframe元素大小即可。

  页面的加载顺序很重要,一般的,我们使用$(function(){})或window.onload等函数初始化页面,此时,页面中所有元素已经加载完毕。如果内嵌了iframe,同样道理,iframe作为页面的一个普通元素,也是先加载完毕,就是说,父页面的$(function(){})执行时,iframe的所有内容已经加载完毕了。下面是顺序图:

  

由此,完全不用再iframe里设置,全部js可以在父页面完成,而且只要调节iframe元素的width,height,scrolling即可。一般的,自适应iframe,将iframe得scrolling设置为auto即可。为了让页面上只显示一个滚动条,还要隐藏父页面的滚动条。那么总结起来,要注意以下事项,即可完成iframe的自适应高宽,而且不用关心跨域,跨浏览器等问题:

  1.隐藏父页面的(一般为top)滚动条。

  2.设置iframe这个元素的width,height为某个高宽,scrolling为auto。

  3.设置$(window).resiez(),或$(#XXX).resize(),使容纳iframe元素的节点在大小变化时,改变iframe的width,height以适应。

通过以上设置,完全可以做到iframe自适应。此间,不用对iframe中的子页面做任何设置,只需要在父页面完成所有程序。之所以这样,都归功于iframe的srcolling=auto这句程序最后起作用。示例如下:

  1.全屏无边框:http://www.zangb.com/html/demo/javascript/js_iframe_autoHeight_border.html

  2.有边框效果更明显:http://www.zangb.com/html/demo/javascript/js_iframe_autoHeight_border.html

四 iframe与无刷新

  iframe与无刷新有悠久的关系。笔者不知道ajax以前是如何无刷新的,也许是通过iframe。具体可以参看笔者的另一篇文章:form的target属性。iframe实现无刷新的原理就是在A页面的表单提交数据到服务器,并且指定target属性为B页面,服务器返回内容到B页面,然后在B页面中调用JavaScript程序,来刷新A页面,完成一次请求。如果在此过程中,B为A页面的一个iframe页面,而且一直不显示,则对用户来说,就是一个无刷新。

  这种无刷新比ajax要麻烦,但是同样意义非凡。在上传文件时,ajax是无法提交的,此时iframe似乎成了不二选择。

  但是有一个要求,就是AB页面同域。因为在整个过程中,会在B页面来调用A页面的js对象的方法或函数,就必须保证两个页面同域。否则操作非法。这种无刷新在网上随处可见,淘宝上很多。

五 iframe的跨域

    这里主要讲述iframe内html页面的归属。iframe内的html页面可以有两个来源,本域内的页面,外部引用的页面。我们知道,为了安全,js是不能访问其他页面的对象和方法的,除非两个页面同域。这是可以理解的,因为你不可能希望别人修改引用你的网站时还修改你的网站。

  如果有两段代码如下:

   A:<iframe id="mainIframe" name="mainIframe" src="/main.html" frameborder="0" scrolling="auto" ></iframe>

   B:<iframe id="mainIframe" name="mainIframe" src="http://www.baidu.com" frameborder="0" scrolling="auto" ></iframe>

我们该如何取iframe和子页面?有以下方法代码:

  var mainIframe = document.getElementById("mainIframe");

  var mainIframeW = window.frames["mainIframe"];

  var mainDocument = mainIframeW.document;

分别对应到AB页面是什么意思呢?我想很多人都不是很清晰。下面表格说明:

  mainIframe maiIframeW mainDocument
A代码 页面的普通元素,可以通过该对象设置iframe的width,height等一个普通元素的属性,DOM对象 子页面的window对象引用,BOM对象 子页面window对象的文档模型document,可以在父页面对子页面改写
B代码 同A代码,DOM对象 子页面的window对象引用,BOM对象 子页面window对象的文档模型document,不可以在父页面改写

  有一点要说明,如果两个页面有一个是其中一个的二级域名,可以通过js的方式设置为同域名:document.domain = xxx.xx。

 iframe与jQuery

  iframe与jQuery的关系十分简单。只要理解了一点,即可完全搞清楚:jQuery,$是页面上的一个js对象,即window的一个普通对象,获得这个jQuery对象后,就可以进行操作了。jQuery对象属于页面,如果要访问iframe页面的jQuery对象,首先要保证能够访问子页面的的对象,就是要满足父页面与子页面同域。当然iframe页面也要引入jquery.js。通常是以下写法:

  1.在父页面访问子页面的jQuery对象。window.frames["xxxIframe"].$("#top"),表示访问子页面的top元素。如果拆分开来,会更容易理解即:

  var iframe$ = window.frames["xxxIframe"].$;

  iframe$("#top");

  这里iframe$就相对于$。

  2.在子页面访问页面的jQuery对象。parent.$("#top")。拆分开来就是:

  var parent$ = parent.$;

  parent$("#top");

  如果是顶层框架,就是top.$("#top")。

 

七 总结

  关于iframe的主要知识点就这么多,如果不够详细,请留言。总结如下:

  1.iframe就是一个普通的html元素,同样可以通过css设置其样式,而起iframe还是一个inline-block元素。

  2.只要掌握了父页面和子页面的渲染顺序,就能很容易掌握iframe的自适应高宽。其实很简单,在父页面设置iframe元素的width,height即可,并且scrolling为auto。

  3.iframe的一个独特用处是,对含有文件上传表单的无刷新提交。

  4.注意如果iframe的内容是外部网址内容,则不能操作其document。

 

转载来自博客园!昵称:Fangjins

分享到:
评论

相关推荐

    深入理解JavaScript系列

    本书是一本全面、深入介绍JavaScript语言的学习指南。本书共分四个部分,第1部分帮助读者快速入手,掌握基本的JavaScript编程要点;第2部分介绍JavaScript的发展和技术背景;第3部分深入探索JavaScript,介绍了语法...

    深入理解JavaScript 5分

    深入理解JavaScript深入理解JavaScript深入理解JavaScript

    深入理解JavaScript异步

    深入理解这一主题,对于任何JavaScript开发者来说都是至关重要的。在这个教程中,我们将探索JavaScript异步处理的各个方面,包括事件循环、回调函数、Promise、Async/Await以及generator等。 首先,我们来了解异步...

    JavaScript的单线程与多线程:深入理解与应用实践

    通过深入理解JavaScript的并发机制,开发者可以编写出更高效、更响应的Web应用。 请注意,上述代码示例用于演示概念,实际应用中可能需要更多的错误处理和同步机制。此外,由于浏览器安全策略的更新,某些特性(如...

    javascript经典特效---IFRAME间链接变换.rar

    在本资源"javascript经典特效---IFRAME间链接变换.rar"中,我们聚焦于一个特定的JavaScript特效:如何在多个IFRAME之间进行链接的变换。 IFRAME(Inline Frame)是HTML中的一个元素,它允许在一个页面中嵌入另一个...

    JavaScript深入系列JavaScript专题系列ES6系列React系列

    深入理解这些概念,可以帮助开发者编写更高效、更易于维护的代码。例如,闭包是JavaScript中的一个高级特性,它允许函数访问并操作其外部作用域的变量,常用于实现模块化和数据封装。 "JavaScript专题系列"则可能...

    javascript写的可拖动的iframe

    在本文中,我们将深入探讨如何使用JavaScript实现一个可拖动的iframe。JavaScript是一种强大的客户端脚本语言,常用于网页交互和动态效果的实现。在这个案例中,我们将关注于利用JavaScript来增强iframe的功能,使其...

    JavaScript自定义事件的创建与应用:深入指南

    通过本文的介绍,你应该对如何在JavaScript中创建和使用自定义事件有了深入的理解。记住,合理地使用自定义事件可以显著提升你的Web应用程序的交互性和可维护性。 通过本文的介绍,你应该对如何在JavaScript中创建...

    iframe跨域常用问题和iframe页面自适应

    本篇文章将深入探讨两个关键知识点:`iframe`跨域问题以及`iframe`页面的自适应。 一、`iframe`跨域问题 跨域是Web开发中的一个重要概念,它限制了浏览器从一个源获取另一个源的资源,以保护用户的安全。当`iframe...

    JavaScript.and.jQuery.The.Missing.Manual.2nd.Edition

    《JavaScript和jQuery:缺失的手册》第二版是David McFarland撰写的一本深入解析JavaScript与jQuery的权威指南。这本书旨在帮助读者理解这两种技术的核心概念,掌握它们的实际应用,并且通过丰富的示例和清晰的解释...

    javascript窗体类似div窗体iframe+div窗体

    JavaScript窗体,或者说在网页中实现类似于传统窗体(如div窗体)的功能,是Web开发中的常见需求。...通过深入理解和熟练运用JavaScript、HTML和CSS,我们可以构建出功能丰富、用户体验优秀的网页窗体系统。

    解决iframe中fixed失效的问题

    在提供的压缩包文件 "iframe中fixed失效问题" 中,可能包含了具体的代码示例或演示页面,你可以直接打开查看这些案例,以更好地理解和应用上述解决方案。实际操作时,需要根据具体项目需求和限制选择合适的方法,...

    iframe_常用属性知识.txt

    - 说明:`name`属性通常用于标识`iframe`,以便在JavaScript或其他脚本语言中引用它。此外,在某些情况下,它还被用于表单提交时的目标框架指定。 3. **id**:唯一标识符 - 描述:为`iframe`指定一个唯一的ID。 ...

    iframe显示全部内容代码

    #### 二、`iframe`基础知识 1. **基本语法**: ```html &lt;iframe src="url" width="宽度" height="高度" frameborder="边框宽度" scrolling="是否显示滚动条" allowfullscreen="是否允许全屏"&gt;&lt;/iframe&gt; ``` 2. ...

    《深入浅出JavaScript》PDF版本下载.txt

    本书旨在通过浅显易懂的语言,帮助读者深入理解JavaScript语言的核心概念与技术细节,并结合实际开发场景进行讲解,让读者不仅知其然,还能知其所以然。 #### 二、书籍内容亮点 - **基础知识**:包括变量、数据类型...

    iframe大全

    本篇文章将深入探讨`iframe`的相关知识点。 ### 1. iframe基本结构 `iframe`标签是HTML5中的一个元素,用于在当前文档中嵌入另一个HTML文档。基本语法如下: ```html &lt;iframe src=...

    javascript深入浅出

    ### JavaScript深入浅出 #### 一、前言与概述 《JavaScript深入浅出》是一本致力于帮助读者深入了解JavaScript编程语言的书籍。JavaScript作为现代Web开发不可或缺的一部分,其重要性不言而喻。本书通过深入浅出的...

    深入理解JavaScript中的异步编程:`async`和`await`的魔力

    然而,正确地使用async和await也需要对错误处理和性能优化有深入的理解。 通过本文的介绍,你应该对async和await有了更深入的理解,以及如何在实际项目中有效地使用它们。记住,掌握这些工具可以显著提升你的...

    实用的现代Javascript::person_swimming:深入研究ES6和JavaScript的未来

    深入研究ES6和JavaScript的未来 :person_swimming: 模块化JavaScript是一本丛书,旨在增进我们对编写健壮,经过测试的模块化JavaScript代码的集体理解。 《实用的现代JavaScript》是该系列的第一本书,它详细讨论...

    深入理解ES6.mobi

    深入理解 ES6 javascript

Global site tag (gtag.js) - Google Analytics