Skip navigation

Adobe AIR 提供了HTMLLoader,用以在AIR应用里嵌入html页面,虽然对标准的支持和性能都不如真正的浏览器强(此处无视本人认为不是浏览器的IE),但还是可以做很多有意思的应用,不过呢这个东东有个好郁闷的问题,它无法处理html里需要打开新窗口的链接(target=’_blank’),如果HTMLLoader的navigateInSystemBrowser属性设置了为false,点击这类链接就会完全没有反应 >____<

咁点算呢,好彩万事都有work around,网上有人说,可以在页面加载完成之后,遍历里面所有target为_blank的a标签,给它们加个onclick函数,来处理它们的点击打开操作,这个方法对简单的页面没有问题,但系对于动态生成的a标签,或者页面里嵌入的iframe里面的a标签,就无能为力了,这个问题在js层面上去解决还是很局限的

Google不负有心人,终于搜出一个比较似样的解决方法,原文见这里,这位仁兄继承了HTMLHost类,修改了其对打开新窗口链接的默认处理,终于使得_blank们重见天日,大概原理如下:

首先我们要写个HTMLHost的子类:

   1:  package com.oscartong
   2:  {
   3:      import flash.html.HTMLHost;
   4:      import flash.html.HTMLWindowCreateOptions;
   5:      import flash.html.HTMLLoader;
   6:   
   7:      public class MyHTMLHost extends HTMLHost{
   8:          public function MyHTMLHost(defaultBehaviors:Boolean = true){
   9:              super(defaultBehaviors);
  10:          }
  11:          override public function createWindow(windowCreateOptions:HTMLWindowCreateOptions):HTMLLoader{
  12:              var ldr:HTMLLoader = super.createWindow(windowCreateOptions);
  13:              ldr.addEventListener(Event.LOCATION_CHANGE, function(e:Event):void{
  14:                  trace('open window, url=' + ldr.location);
  15:              });
  16:              return ldr;
  17:          }
  18:      }
  19:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

But为什么要监听LOCATION_CHANGE事件呢上面的ldr?因为ldr创建出来之后,它的location还只是’about : blank’,还不是a标签上的href,所以要在其location发生变化之后才去读取

然后的做法的很简单啦,设置一下htmlLoader.htmlHost = new MyHTMLHost()就OK了,have fun Smile

Advertisement

One Comment

  1. thanks for your sharing.
    But when i use it in my software,there is a error.
    ======================
    TypeError: Error #1009: Cannot access a property or method of a null object reference.
    ======================
    Do u have any idea about it?


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.