You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XAMPP中运行旧ActionScript版Adobe Animate项目并解决运行报错

问题背景

我有一个旧的Adobe Animate项目,想要在末尾添加一个反馈场景,支持用户提交反馈发送邮件。为实现该功能我需要将项目部署在服务器上,因此我选用了XAMPP,将整个项目放在了htdocs文件夹下。当我尝试通过localhost访问时,文件被直接下载而非正常打开。我也尝试将项目发布为HTML格式,通过localhost访问时提示需要Adobe Flash Player,但Adobe已经停止支持Flash Player,我无法下载,尝试了其他替代Flash Player的软件也都无法正常运行项目。
我知道现在的Adobe Animate基于HTML、CSS和JavaScript开发,但现有项目体量很大,我没有时间将所有ActionScript代码改写为JS,希望能找到可以在XAMPP上运行该项目的方法。

相关代码

PHP文件代码

<?php
$emailTo = "abcd@gmail.com";
$name = $_POST["name"];
$emailFrom = $_POST["email"];
$message = $_POST["message"];
$subject = "New Message from Yourwebsite!";
if( !empty( $_POST ) ) {
    $body  = "Name: " . $name . "\r\n\r\n";
    $body .= "Email: " . $emailFrom . "\r\n\r\n";
    $body .= "Message:\r\n" . $message;
    $body  = wordwrap($body, 70);
    $header = "From: " . $emailFrom . "\r\nReply-To: " . $emailFrom. "\r\n\r\n";
    
    if( mail( $emailTo, $subject, $body, $header ) ) {
        echo( "result=Successful" );
    } else {
        echo( "result=Unsuccessful" );
    }
}
?>

ActionScript代码

import fl.managers.StyleManager;
StyleManager.setStyle("textFormat", new TextFormat("Verdana", 11, 0x000000));
const SENDING:String      = "Sending";
const SENT_SUCCESS:String = "Successful";
const SENT_FAILED:String  = "Unsuccessful";
var tmr:Timer;
function resetTextFields():void {
    name_txt.text    = "";
    email_txt.text   = "";
    message_txt.text = "";
}
function resetContactForm():void {
    submit_btn.enabled  = true;
    feedback_mc.visible = false;
    clearErrors();
}
function afterTmrWait(evt:TimerEvent):void {
    tmr.stop();
    tmr.removeEventListener(TimerEvent.TIMER, afterTmrWait);
    resetContactForm();
}
function validateEmail(str:String):Boolean {
    var pattern:RegExp = /(\w|[_.\-])+@((\w|-)+\.)+\w{2,4}+/;
    var result:Object = pattern.exec(str);
    if(result == null) {
        return false;
    }
    return true;
}
function submitForm(evt:MouseEvent):void {
    clearErrors();
    var passChecks:Boolean = true;  
    if(name_txt.text.length < 1) {
        nameError_mc.visible = true;
        passChecks = false;
    }
    if(!validateEmail(email_txt.text)) {
        emailError_mc.visible = true;
        passChecks = false;
    }
    if(message_txt.text.length < 1) {
        messageError_mc.visible = true;
        passChecks = false;
    }
    if(passChecks) {
        submit_btn.enabled  = false;
        feedback_mc.visible = true;
        feedback_mc.gotoAndStop(SENDING);
        var urlVars:URLVariables = new URLVariables();
        var urlReq:URLRequest    = new URLRequest("send_email.php");
        var ldr:URLLoader        = new URLLoader();
        urlVars.name    = name_txt.text;
        urlVars.email   = email_txt.text;
        urlVars.message = message_txt.text;
        urlReq.data     = urlVars;
        urlReq.method   = URLRequestMethod.POST;
        ldr.addEventListener(Event.COMPLETE, serverFeedback);
        ldr.load(urlReq);
    }
}
function serverFeedback(evt:Event):void {
    var ldr:URLLoader = evt.target as URLLoader;
    var urlVars:URLVariables = new URLVariables(ldr.data);
    if(urlVars.result == SENT_SUCCESS) {
        feedback_mc.gotoAndStop(SENT_SUCCESS);
        resetTextFields();
    } else if(urlVars.result == SENT_FAILED) {
        feedback_mc.gotoAndStop(SENT_FAILED);
    }
    tmr = new Timer(3000, 1);
    tmr.addEventListener(TimerEvent.TIMER, afterTmrWait);
    tmr.start();
}
function clearErrors():void {
    nameError_mc.visible    = false;
    emailError_mc.visible   = false;
    messageError_mc.visible = false;
}
submit_btn.addEventListener(MouseEvent.CLICK, submitForm);
resetTextFields();
resetContactForm();

报错信息

单独运行该场景时显示正常,但测试完整项目(即便仅包含这一个场景)时无法正常运行,和我使用Ruffle运行时的表现一致。最初我以为是Ruffle不支持我的项目,但现在怀疑问题由这些报错导致:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at fl.controls::TextArea/drawLayout()
    at fl.controls::TextArea/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/drawNow()
    at fl.controls::ScrollBar/draw()
    at fl.controls::UIScrollBar/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::LabelButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/drawNow()
    at fl.controls::ScrollBar/draw()
    at fl.controls::UIScrollBar/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::LabelButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::BaseButton/draw()
    at fl.core::UIComponent/callLaterDispatcher()
TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/addChildAt()
    at fl.controls::BaseButton/drawBackground()
    at fl.controls::LabelButton/draw()
    at fl.controls::Button/draw()
    at fl.core::UIComponent/callLaterDispatcher()

解决方案

解决XAMPP访问直接下载文件的问题

  • 确认你发布的Flash项目后缀为.swf,打开xampp/apache/conf/mime.types文件,检查是否存在配置application/x-shockwave-flash swf,如果缺失手动添加后重启Apache即可解决直接下载的问题。
  • 不要直接访问SWF文件,你需要在XAMPP上部署一个嵌入SWF的静态HTML页面,在页面中添加SWF嵌入代码即可正常加载。

解决Flash运行环境的问题

  • 可以使用旧版内置Flash的浏览器便携版,例如Firefox ESR 84之前的版本、360安全浏览器旧版,不需要额外安装Flash Player即可直接打开嵌入SWF的页面。
  • 如果要使用Ruffle运行,当前报错是Ruffle对Flash原生组件库fl.controls支持不全导致的,你可以把用到的TextArea、Button等FL组件手动导出为基础MovieClip,避免使用官方FL组件库,即可兼容Ruffle运行。

解决当前代码报错的问题

你当前的报错都是Flash UI组件初始化时找不到对应的皮肤子元件导致的,按以下步骤排查:

  • 打开Animate项目库,确认fl.controls相关组件的所有依赖皮肤文件都在库中,没有被误删,如果缺失可以从其他新建的AS3项目中把组件库文件复制到当前项目。
  • 你现在的代码中StyleManager.setStyle是在组件还没初始化完成的时候就执行了,会导致空引用报错,把这行代码移动到场景加载完成的事件回调中执行,不要放在代码第一行。
  • 确认你反馈场景上的所有UI实例name_txt、email_txt、message_txt、submit_btn、feedback_mc以及对应的错误提示元件的实例名拼写完全正确,没有和代码中写的不一致的情况。
  • 测试时不要直接测试场景,要测试完整项目,确保场景跳转时所有UI元件都已经被正确实例化后再执行初始化代码,你可以在场景第一帧加个判断,等所有元件加载完成后再执行resetTextFields和resetContactForm方法。

内容的提问来源于stack exchange,提问作者r2000_na

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:57:01