- 获取完整的 URL 字符串。
- 解析这个字符串,提取出你需要的参数值。
下面我将详细介绍几种方法,从最常用、最推荐的方法到其他可行的方法。

核心方法:使用 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 文件的第一帧中。

// 导入必要的类(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 编程思想的方式。

