Flex 应用程序是否可以通过 ExternalInterface 获取有关 HTML 文档的任何信息?例如,Flex 能否找出特定的 DIV 是否存在?
3 回答
在回答另一个问题时,我解释了ExternalInterface
实际工作原理。你可以从中得到一个简单的“是”。
[编辑]一些示例代码:
var jsFunc:String = 'function () { return document.getElementById("test") != null; }';
var divExists:Boolean = ExternalInterface.call(jsFunc);
应该澄清事情......
ExternalInterface 是包含页面的 Javascript 接口,因此在 javascript 中可能发生的任何事情都可以通过 ExternalInterface,直接或通过托管页面上的函数实现。
Flex 应用程序是否可以通过 ExternalInterface 获取有关 HTML 文档的任何信息?
查看JSInterface - ActionScript 3 的 JavaScript API。两个首页示例被称为:
我目前使用这个库,它非常强大。我曾经问过他(Oleg Galaburda)我是否应该使用它来简单地调整 swf 的大小。他说过类似“如果您只需要在 javascript 中执行一些操作,只需坚持使用 ExternalInterface。如果您需要访问 ActionScript 中的 DOM,请使用它”。
svn 存储库中有数百个示例。他在这件事上做得很棒。它将 JavaScript 对象转换为 ActionScript 并返回,因此您可以使用完整的类。重建它需要大量的工作,所以它是跨浏览器和一切。他做到了!
JSInterface 中的所有内容基本上都是一个动态类,因此您可以轻松地钻取 DOM。下面是一些示例方法(在 ActionScript 中):
protected function testCSS():void
{
var styleTag:JSHTMLElement = JSInterface.pushCSS('.text{font-weight:bold;color:#ff00ff;font-size:90;text-decoration:underline;}');
var font:JSHTMLElement = JSInterface.document.createElement('font');
font.innerHTML = 'Hello world!';
font.setAttribute('class', 'text');
font.className = 'text';
JSInterface.document.body.appendChild(font);
trace(styleTag);
}
protected function insertIFrame():void
{
var body:JSDynamic = JSInterface.document.getElementsByTagName('body')[0];
var frame:JSDynamic = JSInterface.document.createElement("iframe");
frame.width = 300;
frame.height = 300;
if (JSInterface.navigator.appName.indexOf('Microsoft')>=0)
{
frame.onreadystatechange = function():void
{
trace(frame.readyState);
};
}
else
{
frame.onload = function():void
{
trace('iFrame loaded');
};
}
frame.src = 'http://actualwave.com';
body.appendChild(frame);
}
该库在内部使用 ExternalInterface 来处理所有内容。但是要将 DOM 序列化/反序列化到 ActionScript 或从 ActionScript 中序列化/反序列化,这是一项繁重的工作。这个库应该可以解决问题。
希望这会有所帮助,兰斯