【问题标题】:Flash Player deep linking problemFlash Player 深层链接问题
【发布时间】:2010-11-10 13:10:00
【问题描述】:

我正在处理这个 Flash 项目,并且我构建了一个 swf,其中所有资源都导出到第 5 帧,第一帧包含预加载器。预加载器完成后,它会跳转到第 10 帧,从那里开始实际站点。这很好用。

但是,在我迄今为止测试过的每个浏览器(FF、IE、Chrome 和 Safari)中,当我在 url 上放置 # 时,行为似乎是浏览器首先下载整个 swf,然后开始播放它最终结果是加载 swf 需要一段时间(空白屏幕),预加载器以 100% 的速度启动,然后 swf 继续加载到站点。

如果有人能确认此行为并提供任何意见以阐明此问题,我将不胜感激。

更新:

感谢rhtx 指出这种烦人的 Flash Player 行为。在某种程度上我可以理解为什么会这样,但它只有在你制作线性电影时才有效,而我没有。目前这意味着我需要为第一帧上的每个深层链接位置创建一个标签,如果您的路径是内容驱动的,这当然是不可能的。

有没有办法克服第二个问题?

【问题讨论】:

  • 也许您可以检查 JS 中的 URL,如果存在空哈希,请导航到没有哈希的相同位置。或者,您可以尝试使用“#/”而不是“#”导航到相同的 URL,但我认为这可能最终会产生相同的行为。
  • 你也可以试试 asperous.us 的建议。可能会有点笨拙,但至少应该可以。

标签: flash actionscript-3 preloader


【解决方案1】:

您可以制作一个“容器”swf,其唯一工作就是加载真正的 swf。这样一来,页面上的 swf 在运行之前是否完全加载都没关系,因为它的大小只有几 kb。

【讨论】:

  • 这就是我在“过去”的习惯。现在我只喜欢将这种方法作为最后的手段。
【解决方案2】:

当 URL 中有 # 时,我在写入和读取本地 SharedObjects 时遇到了一个非常疯狂的问题。这很痛苦,我无法完全确定它。与您正在处理的内容不同,但我可以确认,当 URL 中有“#”时,FP 在某些情况下可能会有所不同。

认为在您的情况下可能发生的情况是 Flash Player 正在寻找一个锚点,因为 '#' 符号。我的猜测是,它会一直查找,直到整个 SWF 加载完毕,并且发现 SWF 中没有任何锚点可以匹配。

你可以试试这样的:

在主时间轴上的 FLA 中添加一个新图层。在第一帧上,创建一个锚点(添加关键帧,命名帧并在命名时选择“锚点”选项)。尝试再次加载您的页面,但将锚点的名称放在井号之后。如果它按需要加载,那么我的猜测可能会有所不同。

希望对您有所帮助。

【讨论】:

  • 看准了!然而,这带来了下一个问题。查看我的更新。
  • 是的。啊。我只是进行了几次搜索,看看是否可以了解有关禁用 DeepLinking 的任何信息,但没有提出任何建议。在 Flex 中,您可能会遇到这种情况,但看起来 Flash 中并没有公开的方式。至少不是我在 20 分钟内看到的。不过,似乎您应该能够定义如何处理“空”锚。
  • @rhtx:是的,我希望有某种通配符锚,但我找不到任何东西。我想知道 Flex 是如何做到这一点的。也许有一种方法可以将一些设置注入到 swf 中,或者我可以编译一些元数据。到目前为止,我也找不到任何东西。如果您在此处发布您的发现,如果您能找到与此问题相关的任何内容,我将不胜感激。谢谢!
  • Keith Peters 在他的博客上对如何使用 Flex 编译器(纯 AS3)进行预加载有很好的解释 (bit-101.com/blog/?p=946)。但是,当您使用 Flash 时,它似乎并不适用。
【解决方案3】:

我的猜测是this bug 给你带来了麻烦。 This guy 一直在报告此错误的性质。

虽然听起来您没有使用 flex,但如果此错误也影响纯 as3 闪存,我不会感到惊讶。

该错误最近已关闭。解决方案:建议制作一个小型 swf 预加载器来加载您的主 swf(如 asperous.us)。

另见this s.o. q & a

【讨论】:

  • 你似乎已经为自己赢得了赏金。恭喜!
【解决方案4】:

我已经知道这个错误一段时间了,并使用容器方法来规避它。但我讨厌容器方法,所以我偶尔会在网上搜索解决方案。

Rhtx 来救援..

没有它应该的那么干净,但我很高兴它的工作方式..

我现在实现它的方式是我有一个名为“正在加载”的框架标签类型锚 在第 1 帧(第 2 帧是我的应用程序所在的位置)。

然后我使用一段 javascript 来加载我的 flash 站点,它基本上是这样做的:

//pseudo javascript
var path = "";
function buildFlash() {
   path = location.hash.length > 1 ? location.hash.substr(1) : "";
   location.hash = "loading";
   $(document).ready(onDOMReady); //could probably directly load the swf now
}

function onDOMReady() {
   swfobject.embedSWF(... with path flashvar ...);
}

这对我有用的原因是我从 flash 中调用了一个函数 ExternalInterface("setPath", path) 来设置哈希值,而哈希值又将路径传递给 googleanalytics。

访问 url http://www.site.com/#about/ 的人会在网站加载时看到 url /#loading,加载完成后,flash 应用程序会确定用户应该去哪里并相应地更改 url。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2016-07-13
    • 1970-01-01
    相关资源
    最近更新 更多