1

我有一个用 Flex 开发的 web 项目,我必须使用 AIR 独立工作。

我创建了 Air 项目并使用 flash.html.HTMLLoader 加载了 Web 应用程序。内容加载正常且工作正常。

有几个按钮可以使用 javascript 函数 window.open 打开不同的链接。

链接打不开。使用 ExternalInterface 调用 javascript 函数,我在显示的内容中放置了警报。

该函数包含简单的 window.open

window.open("http://www.google.co.in","Google");

我尝试了几种提到的解决方案,但都没有奏效。

http://digitaldumptruck.jotabout.com/?p=672
http://soenkerohde.com/2008/09/air-html-with-_blank-links/
http://cookbooks.adobe.com/index.cfm?event=showdetails&postId=9243

我什至尝试使用 window.open 方法在 HTMLLoader 组件中加载一个简单的页面,但它仍然无法正常工作。在按钮单击时,仅警报有效,但 window.open 未打开链接。

<html>
<head>
<title>Test</title>
<body scroll="no">
<input type="button" value="Click" onClick="window.open('http://www.google.co.in');">
</body>
</html>

有人可以帮我吗

4

2 回答 2

0

window.openAIR Webkit 环境对该方法的支持非常严格。请参阅有关调用 JavaScript window.open() 方法的限制的Adob​​e 文档。

处理这个问题的最简单方法就是让系统的默认浏览器打开链接。Adobe 记录了这个问题,并展示了如何从 AIR 中弹出打开的 url:

var url = "http://www.adobe.com"; 
var urlReq = new air.URLRequest(url); 
air.navigateToURL(urlReq);

概括这一点:

function openExternalLink(href:String):void {
  var urlReq = new air.URLRequest(href);
  air.navigateToURL(urlReq);
}

一种选择:假设您在页面上运行 jQuery,您可以在外部打开所有链接,如下所示:

var html:HTMLLoader = new HTMLLoader(); 
var urlReq:URLRequest = new URLRequest("whatever.html"); 
html.load(urlReq); 
html.addEventListener(Event.COMPLETE,
  function completeHandler(event:Event):void { 
    html.window.jQuery('a').click(clickHandler); 
  });

function clickHandler( e:Object ):void { 
  if (e.target && e.target.href) {
    openExternalLink(e.target.href);
  }
  e.preventDefault();
}

有关在 ActionScript 中处理 DOM 事件的更多信息,请参阅相关的 Adob​​e 文档

这些都没有经过测试,但希望它给出一个粗略的轮廓。


否则,如果你想做一些花哨的事情,比如弹出带有 HTMLLoader 框架的 AIR 窗口,我确实找到了一篇博客文章讨论这个问题:Open links in AIR's HTML loader

于 2012-06-27T05:24:48.723 回答
0

这是一个激进的建议,可能有效,也可能无效,但我认为值得一试。

覆盖window.open方法本身

和以前一样,等到Event.COMPLETE被解雇,然后从那里拿走它:

var html:HTMLLoader = new HTMLLoader();
var urlReq:URLRequest = new URLRequest("whatever.html");
var oldWindowOpen:Object; // save it, just in case

html.load(urlReq);

html.addEventListener(Event.COMPLETE,
  function (event:Event):void {
    oldWindowOpen = html.window.open;

    html.window.open = asWindowOpen;
  });

function asWindowOpen(href:String, name:String="_blank", specs:Object=null, replace:Object=null):void { 
  var urlReq = new air.URLRequest(href); 
  air.navigateToURL(urlReq);
}

您可能应该填写一些函数来处理W3Schools Reference for Window open() Method中指定的其他输入。为了安全起见,您可能必须(或想要)将所有参数类型更改为Object,因为与 ExternalInterface 交互不同,JavaScript-ActionScript 类型不会在 AIR-WebKit 交换中自动进行类型转换。

于 2012-06-27T17:26:14.710 回答