我正在处理使用Actionscript 3构建的Flash横幅广告。它将嵌入到网页中。
广告需要有一个关闭按钮。当用户点击该按钮时,广告就会消失。
这需要完全在横幅中完成,因为我们无法控制将要嵌入的网页。
在Actionscript 2中,我曾经通过在用户点击按钮时运行此代码来执行此操作:
unloadMovie(this);
这似乎不再适用于Actionscript 3.如何在AS3中实现此功能?
感谢您的帮助。
答案 0 :(得分:1)
出于文档目的,以下是安德鲁和我就此问题达成的结论:从swf中卸载/删除swf文件,以允许用户访问swf下的元素。
一种选择是使用ExternalInterface将js代码注入:
就代码而言,这是使用Zeh Fernando's blog上描述的技术 由Andreyu修改为包括删除DOM元素:
// Based on work by Zeh Fernando: http://zehfernando.com/2011/getting-the-swfs-html-objectembed-id-from-within-the-flash-movie-itself/
function getSWFObjectName(): String {
// Returns the SWF's object name for getElementById
// Based on https://github.com/millermedeiros/Hasher_AS3_helper/blob/master/dev/src/org/osflash/hasher/Hasher.as
var js:XML;
js = <script><![CDATA[
function(__randomFunction) {
var check = function(objects){
for (var i = 0; i < objects.length; i++){
if (typeof(eval("objects["+i+"]." + __randomFunction)) != undefined) {
return objects[i].id;
}
}
return undefined;
};
return check(document.getElementsByTagName("object")) || check(document.getElementsByTagName("embed"));
}
]]></script>;
var __randomFunction:String = "checkFunction_" + Math.floor(Math.random() * 99999); // Something random just so it's safer
ExternalInterface.addCallback(__randomFunction, getSWFObjectName); // The second parameter can be anything, just passing a function that exists
return ExternalInterface.call(js, __randomFunction);
}
// Function to remove the SWF from the webpage
function destroyEverything(event:MouseEvent): void {
var js:XML;
js = <script><![CDATA[
function(__SWFContext) {
var element = document.getElementById(__SWFContext);
element.parentNode.removeChild(element);
}
]]></script>;
ExternalInterface.call(js, getSWFObjectName());
}
// Add function to click event of button
close_button.addEventListener(MouseEvent.CLICK, destroyEverything);
答案 1 :(得分:0)
如果unloadMovie
对您来说足够了,您可以直接删除舞台上的所有内容:
//In button click handler, call "removeEverything" function
//function onClickClose(e:MouseEvent):void{
// removeEverything()
//}
//As a result you will get empty stage
function removeEverything():void {
while (stage.numChildren) {
stage.removeChildAt(0);
}
}