在Flex中用Iframe嵌入HTML网页
有时候我们需要在Flex应用中嵌入HTML代码,根据嵌入HTML要求的不同有以下三种方法:
1、Flex文本组件(Label、Text、TextArea)的htmlText属性支持一些基本的HTML代码,例如:
- <mx:TextArea>
- <mx:htmlText>
- <!--[CDATA[
- <p align="center"><font size="15" color="#3399ff">this is a html code</font></p>
- ]]-->
- </mx:htmlText>
- </mx:TextArea>
2、我们可以将Flex应用嵌入到HTML页面中,然后通过Flex2中的ExternalInterface(Flex1.5使 getURL("javascript.:javascriptMethod"))
来实现Flex与HTML javascript的相互交互,进一步的,如果要在Flex应用中嵌入完整的HTML呢?
其实实现的方法很简单,只需要使用HTML的Iframe标签来导入需嵌入的HTML页面,
然后使用ExternalInterface调用相应的javasript将该Iframe移动到我们Flex页面需要嵌入HTML页面的部分之上就可以 了,示意图如下:
也就是说,我们包含Flex SWF文件的HTML页面主要有三个部分:
1、Flex swf 插件容器,FlexBuilder自动生成部分
- <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- id="IFrameDemo" width="100%" height="100%"
- codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab">
- <param name="movie" value="IFrameDemo.swf" />
- <param name="quality" value="high" />
- <param name="bgcolor" value="#869ca 7" />
- <embed src="IFrameDemo.swf" mce_src="IFrameDemo.swf" quality="high" bgcolor="#869ca7"
- width="100%" height="100%" name="detectiontest" aligh="middle"
- play="true" loop="false" quality="high"
- allowScriptAccess="sameDomain"
- type="application/x-shockwave-flash"
- wmode="opaque"
- swLiveConnect="true"
- pluginspage="http://www.macromedia.com/go/getflashplayer">
- </embed>
- </object>
- 2、HTML Iframe标 签,绝对定位,用来导入HTML页面
- <iframe id="myFrame" name="myFrame" frameborder="0"
- style="position:absolute;background-color:transparent;border:0px;visibility:hidden;" mce_style="position:absolute;background-color:transparent;border:0px;visibility:hidden;" />
- 3、移动Iframe和在Iframe 中导入需嵌入FLEX中的HTML页面的脚本
- <mce:script type="text/javascript"><!--
- function moveIFrame(x,y,w,h) {
- var frameRef=document.getElementById("myFrame");
- frameRef.style.left=x;
- frameRef.style.top=y;
- frameRef.width=w;
- frameRef.height=h;
- }
- function loadIFrame(url){
- top.frames["myFrame"].location.href=url;
- }
- // --></mce:script>
Flex中的导入Iframe页面和移动Iframe的代码如下:
- import flash.external.ExternalInterface;
- import flash.geom.Point;
- import flash.net.navigateToURL;
- private var __source: String;
- private function moveIFrame(): void {
- var localPt:Point = new Point(0, 0);
- var globalPt:Point = this.localToGlobal(localPt);
- ExternalInterface.call("moveIFrame", globalPt.x, globalPt.y, this.width, this.height);
- }
- public function set source(source: String): void {
- if (source) {
- if (! ExternalInterface.available)
- {
- // TODO: determine if this Error is actually needed. The debugger
- // build gives the error below. Assuming that this error will not show
- // up in the release build but haven’t checked.
- throw new Error("The ExternalInterface is not available in this container. Internet Explorer ActiveX,
- Firefox, Mozilla 1.7.5 and greater, or other browsers that support NPRuntime are required.");
- }
- __source = source;
- ExternalInterface.call("loadIFrame", source);
- }
- }
两个方法分别直接调用使用ExternalInterface.call调用前面我们提到的HTML页面上的两个Javascript方法。另外一个要注 意的是<Canvas/>
继承自flash.display.DisplayObject类的localToGlobal方法的使 用,该方法将基于Flash场景的坐标转换为基于全局本地坐标,也就是浏览器页面坐标:
这 样就可以在Flex页面中嵌入任意的HTML页面了,为了方便,Brian写了个嵌入HTML页面的代理IFrame组件,该组件封装了所有需要的 Flex端代码:
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Canvas xmlns:mx="http://www.macromedia.com/2005/mxml"
- resize="callLater(moveIFrame)"
- move="callLater(moveIFrame)">
- <mx:Script>
- <!--[CDATA[
- import flash.external.ExternalInterface;
- import flash.geom.Point;
- import flash.net.navigateToURL;
- private var __source: String;
- private function moveIFrame(): void {
- var localPt:Point = new Point(0, 0);
- var globalPt:Point = this.localToGlobal(localPt);
- ExternalInterface.call("moveIFrame", globalPt.x, globalPt.y, this.width, this.height);
- }
- public function set source(source: String): void {
- if (source) {
- if (! ExternalInterface.available)
- {
- // TODO: determine if this Error is actually needed. The debugger
- // build gives the error below. Assuming that this error will not show
- // up in the release build but haven’t checked.
- throw new Error("The ExternalInterface is not available in this container. Internet Explorer ActiveX, Firefox,
- Mozilla 1.7.5 and greater, or other browsers that support NPRuntime are required.");
- }
- __source = source;
- ExternalInterface.call("loadIFrame", source);
- }
- }
- public function get source(): String {
- return __source;
- }
- override public function set visible(visible: Boolean): void {
- super.visible=visible;
- if (visible)
- {
- ExternalInterface.call("showIFrame");
- }
- else
- {
- ExternalInterface.call("hideIFrame");
- }
- }
- ]]-->
- </mx:Script>
- </mx:Canvas>
该IFrame组件有个source属性用来记录需要载入的嵌入HTML页面的地址,每次source属性更新时,调用 ExternalInterface.call("loadIFrame", source)
调用javascript方法loadIFrame 方法在HTML 页面中的IFrame中载入要嵌入的HTML页面。
另外,重载了Canvas的visible属性,以便在Canvas隐藏 HTML页面中的IFrame。
如下使用该组件在Flex应用中嵌入HTML页面方法:
- <IFrame id="iFrame" source="http://blog.eshangrao.com" width="300" height="400" />
以上代码将在我们的Flex应用中嵌入本站首页。
(3) 前面的两种方法都是用的Flex2.0的老的函数,如果觉得麻烦的话也可以使用现成的类
地址:http://code.google.com/p/flex-iframe/
将类文件加入项目,加下面的语句在需要的地方,指明URL就好了
- <local:IFrame id="iFrame" source="http://www.google.com" width="100%" height="100%" />