如何加载 swf 并与之交互?
How to load a swf and interact with it?
我试过 SWFLoader,但问题是加载的内容是 MovieClip,我不知道如何与之交互,而且 MovieClip#numChildren 为零。
顺便说一下,我无法将 flashvars 传递给 swf。
首先,你应该知道你的问题没有确切的答案,因为它取决于你加载的 SWF(你知道与否,它的显示列表,......)但我会举一个简单的例子解释事情,你必须根据你的情况进行调整。
对于这个例子,假设我们有一个非常简单的 SWF(加载的 SWF),它包含一个 TextField(称为 txt_url
)和一个按钮(一个 MovieClip,称为 btn_go
)。
btn_go
按钮将打开在 txt_url
文本字段中输入的 URL。
对于我们的第二个 SWF(加载程序),我们将使用 Loader
对象来加载我们的第一个(在本例中为 Loader.content
),然后我们将设置URL(txt_url
文本)并触发 btn_go
按钮上的点击事件。
所以这里是我们 loader.swf
的代码示例:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_SWFLoad);
loader.load(new URLRequest('loaded.swf'));
addChild(loader);
function on_SWFLoad(e:Event): void
{
// get our loaded SWF
var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content);
// because we know our target objects, we can use "getChildByName()"
// set the URL
TextField(loaded_swf.getChildByName('txt_url')).text = 'http://www.example.com';
// open the URL in the browser by triggering the click event on the "btn_go" button
MovieClip(loaded_swf.getChildByName('btn_go')).dispatchEvent(new MouseEvent(MouseEvent.CLICK));
}
这个例子会在加载SWF后直接在浏览器中设置并打开URL,当然我们可以在点击按钮或其他东西后执行该动作,但这只是一个简单的例子来展示如何你可以做...
现在,问题是当我们对加载的 SWF 及其子项(名称、深度等)一无所知时,在这种情况下,我们应该更加努力地做我们想做的事情:我们应该遍历加载的SWF的整个显示列表,识别目标对象。
回到我们的例子,假设我们只知道舞台上有一个 TextField 和一个按钮,所以我们的代码可以像这样:
function on_SWFLoad(e:Event): void
{
var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content);
var num_children:int = loaded_swf.numChildren;
for(var i:int = 0; i < num_children; i++)
{
var child:DisplayObject = loaded_swf.getChildAt(i);
if(child is TextField)
{
trace(child.name); // gives : txt_url
TextField(child).text = 'http://www.example.com';
}
else
{
if(child.hasEventListener(MouseEvent.CLICK))
{
trace(child.name); // gives : btn_go
child.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
}
}
}
}
同样,这是一个非常简单的例子,只是为了展示我们如何继续......
...
然后关于在 SWF 之间传递值(参数),请查看 ,其中有一个小示例。
有关Display programming (display list, display object, display object container, ...) take a look here的更多信息。
希望能帮到你。
我试过 SWFLoader,但问题是加载的内容是 MovieClip,我不知道如何与之交互,而且 MovieClip#numChildren 为零。
顺便说一下,我无法将 flashvars 传递给 swf。
首先,你应该知道你的问题没有确切的答案,因为它取决于你加载的 SWF(你知道与否,它的显示列表,......)但我会举一个简单的例子解释事情,你必须根据你的情况进行调整。
对于这个例子,假设我们有一个非常简单的 SWF(加载的 SWF),它包含一个 TextField(称为 txt_url
)和一个按钮(一个 MovieClip,称为 btn_go
)。
btn_go
按钮将打开在 txt_url
文本字段中输入的 URL。
对于我们的第二个 SWF(加载程序),我们将使用 Loader
对象来加载我们的第一个(在本例中为 Loader.content
),然后我们将设置URL(txt_url
文本)并触发 btn_go
按钮上的点击事件。
所以这里是我们 loader.swf
的代码示例:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_SWFLoad);
loader.load(new URLRequest('loaded.swf'));
addChild(loader);
function on_SWFLoad(e:Event): void
{
// get our loaded SWF
var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content);
// because we know our target objects, we can use "getChildByName()"
// set the URL
TextField(loaded_swf.getChildByName('txt_url')).text = 'http://www.example.com';
// open the URL in the browser by triggering the click event on the "btn_go" button
MovieClip(loaded_swf.getChildByName('btn_go')).dispatchEvent(new MouseEvent(MouseEvent.CLICK));
}
这个例子会在加载SWF后直接在浏览器中设置并打开URL,当然我们可以在点击按钮或其他东西后执行该动作,但这只是一个简单的例子来展示如何你可以做...
现在,问题是当我们对加载的 SWF 及其子项(名称、深度等)一无所知时,在这种情况下,我们应该更加努力地做我们想做的事情:我们应该遍历加载的SWF的整个显示列表,识别目标对象。
回到我们的例子,假设我们只知道舞台上有一个 TextField 和一个按钮,所以我们的代码可以像这样:
function on_SWFLoad(e:Event): void
{
var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content);
var num_children:int = loaded_swf.numChildren;
for(var i:int = 0; i < num_children; i++)
{
var child:DisplayObject = loaded_swf.getChildAt(i);
if(child is TextField)
{
trace(child.name); // gives : txt_url
TextField(child).text = 'http://www.example.com';
}
else
{
if(child.hasEventListener(MouseEvent.CLICK))
{
trace(child.name); // gives : btn_go
child.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
}
}
}
}
同样,这是一个非常简单的例子,只是为了展示我们如何继续......
...
然后关于在 SWF 之间传递值(参数),请查看
有关Display programming (display list, display object, display object container, ...) take a look here的更多信息。
希望能帮到你。