当前位置:首页 > 前端开发 > 正文

swf 如何获取html传递进来的参数

SWF通过HTML的FlashVars或URL参数接收数据,使用Parameters类或getQueryParam()提取参数值

SWF(Flash应用程序)中获取HTML传递的参数,通常需要结合HTML、JavaScript和ActionScript的协作,以下是详细实现方法和注意事项:


参数传递的核心原理

SWF文件本身无法直接解析HTML中的参数,需通过以下流程实现:

  1. HTML层:通过<param>标签、flashvars属性或JavaScript动态传递参数。
  2. JavaScript桥接:使用ExternalInterfaceSetVariable将参数从HTML/JS传递到ActionScript。
  3. ActionScript接收:在SWF内部通过事件或API捕获参数。

具体实现方法

方法1:通过 flashvars 传递参数(推荐)

适用场景:静态参数传递,如用户ID、配置项等。
实现步骤

  1. HTML中定义SWF标签

    <object id="mySwf" width="800" height="600" data="mySwf.swf">
        <param name="movie" value="mySwf.swf" />
        <param name="flashvars" value="uid=123&uname=JohnDoe" />
    </object>

    或使用embed

    <embed src="mySwf.swf" flashvars="uid=123&uname=JohnDoe" />
  2. ActionScript接收参数

    swf 如何获取html传递进来的参数  第1张

    // 在SWF的主类中
    private var params:Object = Root.params;
    trace("uid: " + params.uid); // 输出:uid: 123
    trace("uname: " + params.uname); // 输出:uname: JohnDoe

优势:简单直接,参数在SWF加载时自动解析。
限制:仅支持字符串类型,需手动解析复杂参数(如JSON)。


方法2:通过 JavaScript 的 SetVariable 方法

适用场景:动态参数传递,或需要在SWF加载后修改参数。
实现步骤

  1. HTML中嵌入SWF

    <div id="flashContent">
        <script type="text/javascript">
            var swf = document.getElementById("mySwf");
            swf.SetVariable("_root.info_str", "Hello from HTML");
        </script>
    </div>
  2. ActionScript定义接收变量

    // 在SWF的主时间轴或主类中
    var info_str:String;
    trace(info_str); // 输出:Hello from HTML

优势:可动态更新参数,支持实时交互。
限制:需确保SWF与JavaScript的命名空间一致,且变量名需匹配。


方法3:通过 ExternalInterface 调用JS函数

适用场景:从HTML获取动态数据(如URL参数、用户输入)。
实现步骤

  1. HTML中定义参数获取函数

    <script type="text/javascript">
        function getUrlParams() {
            var params = new URLSearchParams(window.location.search);
            return {
                uid: params.get("uid") || "default",
                uname: params.get("uname") || "guest"
            };
        }
    </script>
  2. ActionScript调用JS函数

    import flash.external.ExternalInterface;
    var params:Object = ExternalInterface.call("getUrlParams");
    trace("uid: " + params.uid); // 输出URL中的uid参数
    trace("uname: " + params.uname); // 输出URL中的uname参数

优势:灵活处理复杂逻辑,可读取浏览器环境数据。
限制:需跨域权限配置,且依赖JavaScript函数稳定性。


参数传递方式对比

方法 适用场景 优点 缺点
flashvars 静态参数初始化 简单易用,自动解析 仅支持字符串,需手动处理复杂类型
SetVariable 动态参数更新 实时交互,可多次调用 需维护变量名一致性
ExternalInterface 获取动态数据(如URL参数) 灵活性高,可集成复杂逻辑 依赖JS函数,需处理跨域问题

常见问题与解决方案

问题1:参数未正确传递到SWF

  • 原因
    • SWF路径或ID错误。
    • flashvars参数格式错误(需为key=value形式,用&分隔)。
    • ActionScript未正确引用参数(如直接调用Root.params而非Root.params.key)。
  • 解决方案
    • 检查HTML标签路径和参数语法。
    • 在ActionScript中添加日志输出,确认参数是否被解析。

问题2:传递特殊字符或中文参数

  • 原因:URL编码问题导致参数截断。
  • 解决方案
    • 在HTML中对参数进行encodeURIComponent编码:
      <param name="flashvars" value="msg=你好世界" />
    • 在ActionScript中用decodeURIComponent解码:
      var msg = decodeURIComponent(params.msg);

相关问答FAQs

Q1:如何在SWF中获取HTML中的复选框状态?

A1

  1. 在HTML中为复选框绑定change事件,并通过SetVariableExternalInterface传递状态。
    <input type="checkbox" id="myCheckbox" onchange="sendCheckboxState()" />
    <script>
        function sendCheckboxState() {
            var state = document.getElementById("myCheckbox").checked ? "true" : "false";
            mySwf.SetVariable("_root.checkboxState", state);
        }
    </script>
  2. 在ActionScript中接收并处理:
    var checkboxState:Boolean = (_root.checkboxState == "true");

Q2:如何传递对象或数组参数到SWF?

A2

  1. 将对象序列化为JSON字符串,通过flashvarsSetVariable传递:
    <param name="flashvars" value="data={"name":"John","age":30}" />
  2. 在ActionScript中反序列化:
    import com.adobe.serialization.json.JSON;
    var data:Object = JSON.parse(params.data);
    trace(data.name); // 输出:John
0