菜鸟科技网

Flash如何获取网页参数?

  1. 获取完整的 URL 字符串
  2. 解析这个字符串,提取出你需要的参数值

下面我将详细介绍几种方法,从最常用、最推荐的方法到其他可行的方法。

Flash如何获取网页参数?-图1
(图片来源网络,侵删)

核心方法:使用 URLVariables 类 (最推荐)

这是 ActionScript 3.0 (AS3) 官方提供、也是最标准、最强大的方法,它专门用于解析 URL 查询字符串(即 后面的部分)。

步骤 1:获取完整的 URL

你需要获取包含参数的完整 URL,你可以通过 stage.loaderInfo.url 来获取当前 SWF 文件被加载的 URL。

// 获取当前 SWF 文件的完整 URL
var fullURL:String = stage.loaderInfo.url;
trace("完整 URL: " + fullURL);
//  "http://www.example.com/myMovie.swf?name=John&age=30"

步骤 2:解析 URL 并提取参数

URLVariables 类需要一个只包含查询字符串( 之后的部分)作为构造函数参数,所以我们需要先从完整 URL 中把查询字符串分离出来。

// 1. 获取完整 URL
var fullURL:String = stage.loaderInfo.url;
// 2. 检查 URL 中是否包含查询字符串(即问号 ?)
if (fullURL.indexOf("?") != -1) {
    // 3. 提取查询字符串部分
    // 使用 substring 方法从问号之后开始截取,直到字符串末尾
    var queryString:String = fullURL.substring(fullURL.indexOf("?") + 1);
    trace("查询字符串: " + queryString);
    //  "name=John&age=30"
    // 4. 创建 URLVariables 对象并解析查询字符串
    var variables:URLVariables = new URLVariables(queryString);
    // 5. 现在你可以像访问对象属性一样访问参数了
    // 注意:所有参数值都会被解析为 String 类型
    var userName:String = variables.name;
    var userAge:String = variables.age; // 注意:age 是字符串 "30"
    trace("用户名: " + userName);
    trace("用户年龄: " + userAge);
    // 如果需要将参数转换为数字,可以使用 Number() 函数
    var userAgeAsNumber:Number = Number(variables.age);
    trace("用户年龄 (数字): " + userAgeAsNumber);
    trace("年龄是否为数字: " + !isNaN(userAgeAsNumber));
} else {
    trace("URL 中没有查询参数。");
}

完整代码示例 (FLA 文件第一帧)

你可以将以下代码直接复制到 Animate/Flash 文件的第一帧中。

Flash如何获取网页参数?-图2
(图片来源网络,侵删)
// 导入必要的类(URLVariables 在 flash.net 包中,通常不需要显式导入)
// import flash.net.URLVariables;
// 定义一个函数来解析 URL 参数,方便重用
function getURLParam(name:String):String {
    // 获取查询字符串
    var query:String = stage.loaderInfo.url.substring(stage.loaderInfo.url.indexOf("?") + 1);
    try {
        // 创建 URLVariables 对象
        var params:URLVariables = new URLVariables(query);
        // 返回请求的参数值
        return params[name];
    } catch (e:Error) {
        // 如果查询字符串格式不正确,返回 null
        trace("解析 URL 参数时出错: " + e.message);
        return null;
    }
    return null;
}
// --- 使用示例 ---
// 假设网页 URL 是: http://localhost/preview.html?productId=12345&user=guest
// 获取单个参数
var productId:String = getURLParam("productId");
var user:String = getURLParam("user");
var nonExistentParam:String = getURLParam("foo");
if (productId) {
    trace("产品 ID 是: " + productId);
} else {
    trace("未找到 'productId' 参数。");
}
if (user) {
    trace("当前用户是: " + user);
} else {
    trace("未找到 'user' 参数。");
}
if (nonExistentParam) {
    trace("参数 'foo' 的值是: " + nonExistentParam);
} else {
    trace("参数 'foo' 不存在。");
}
// --- 另一种直接访问所有参数的方式 ---
trace("\n--- 所有参数 ---");
if (stage.loaderInfo.url.indexOf("?") != -1) {
    var query:String = stage.loaderInfo.url.substring(stage.loaderInfo.url.indexOf("?") + 1);
    var allParams:URLVariables = new URLVariables(query);
    // 遍历所有参数
    for (var paramKey:String in allParams) {
        trace("参数名: " + paramKey + ", 值: " + allParams[paramKey]);
    }
}

手动解析 (不推荐,但有助于理解原理)

如果你不想使用 URLVariables,或者在一个非常旧的项目中(AS2),也可以手动解析字符串,这种方法代码更繁琐,且容易出错,不推荐在生产环境中使用。

var fullURL:String = stage.loaderInfo.url;
if (fullURL.indexOf("?") != -1) {
    var queryString:String = fullURL.substring(fullURL.indexOf("?") + 1);
    // 1. 按 & 分割成键值对数组
    var pairs:Array = queryString.split("&");
    for (var i:int = 0; i < pairs.length; i++) {
        // 2. 按 = 分割每个键值对
        var keyValue:Array = pairs[i].split("=");
        if (keyValue.length == 2) {
            var key:String = keyValue[0];
            var value:String = keyValue[1];
            // 处理 URL 编码 (%20 空格)
            value = unescape(value);
            trace("找到参数 - Key: " + key + ", Value: " + value);
            // 在这里你可以用 if/else 或 switch 来判断你需要的 key
            if (key == "name") {
                var userName:String = value;
                trace("用户名是: " + userName);
            }
        }
    }
}

通过 ExternalInterface 与 JavaScript 交互 (高级用法)

如果你的 Flash 影片被嵌入到一个 HTML 页面中,并且你希望通过 JavaScript 来获取 URL 参数,然后传递给 Flash,可以使用 ExternalInterface,这种方法更灵活,因为它可以利用 JavaScript 强大的 URL 解析能力。

HTML 部分 (index.html)

<!DOCTYPE html>
<html>
<head>Flash 与 JS 交互</title>
    <script>
        // 获取 URL 参数的 JavaScript 函数
        function getUrlParam(name) {
            name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
            var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
            var results = regex.exec(location.search);
            return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
        }
    </script>
    <!-- 确保 SWFObject 或其他嵌入脚本的路径正确 -->
    <script src="swfobject.js"></script>
    <script>
        swfobject.embedSWF("myMovie.swf", "flashContent", "550", "400", "9.0.0", "expressInstall.swf");
    </script>
</head>
<body>
    <div id="flashContent">
        <!-- Flash 内容将在这里显示 -->
    </div>
</body>
</html>

ActionScript (AS3) 部分

import flash.external.ExternalInterface;
// 检查是否在 Flash Player 容器中运行,并且是否可以调用 JavaScript
if (ExternalInterface.available) {
    try {
        // 调用 JavaScript 函数 "getUrlParam" 并传入参数名 "id"
        var idFromJS:String = ExternalInterface.call("getUrlParam", "id");
        var userFromJS:String = ExternalInterface.call("getUrlParam", "user");
        if (idFromJS) {
            trace("通过 JS 获取到的 ID: " + idFromJS);
        } else {
            trace("JS 中未找到 'id' 参数。");
        }
        if (userFromJS) {
            trace("通过 JS 获取到的 user: " + userFromJS);
        }
    } catch (error:SecurityError) {
        trace("安全错误: 无法与 JavaScript 通信。");
    } catch (error:Error) {
        trace("发生错误: " + error.message);
    }
} else {
    trace("ExternalInterface 不可用,可能不是在浏览器中运行。");
}

总结与最佳实践

方法 优点 缺点 推荐场景
URLVariables 官方标准、代码简洁、健壮、自动处理 URL 编码 无明显缺点 绝大多数情况下的首选和最佳实践
手动解析 不依赖任何类,逻辑直观 代码冗长、易出错、需手动处理 URL 编码 学习目的或极特殊环境
ExternalInterface 极其灵活,可利用 JS 生态,功能强大 依赖浏览器环境,增加 JS 代码复杂度,有安全域限制 需要 JS 和 Flash 深度交互,或利用 JS 特定库时

对于绝大多数开发者来说,请直接使用 URLVariables,它是最安全、最可靠、最符合 AS3 编程思想的方式。

Flash如何获取网页参数?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇