我可以在没有重新加载的情况下移动DOM中的Flash对象吗?

时间:2010-10-18 20:52:36

标签: flash jquery-ui dom

我正在尝试在包含Flash对象的包装元素上使用jQuery UI库中的缩放效果。

我遇到的问题是我的包装器的内容会自动移动到另一个包装器(.ui-effects-wrapper),当发生这种情况时,Flash对象会重新加载。

当然,这里的具体问题与jQuery UI采用的策略有关 - 但一般来说,是否可以在不重新加载的情况下在DOM中移动Flash对象?

2 个答案:

答案 0 :(得分:13)

我只知道Gecko(Firefox的渲染引擎)是如何工作的。在该引擎中,不,您无法在不重新加载关联的Flash对象的情况下移动DOM树中的<object><embed>。它实际上比这更糟糕:你不能做任何会导致Flash对象绘制的 CSS框被破坏的事情。 Gecko将CSS框视为短暂的;几乎任何涉及包含<object>的子树的DOM修改都会破坏相关的CSS框,因此任何数量的CSS操作都会从显而易见的(设置display:none)到模糊(更改{{1 }或opacity)。但插件的状态是附加到盒子树而不是DOM树,因此如果盒子被销毁并重新创建,插件将被重新加载。

这被认为是一个错误 - bug 90268,在撰写本文时已有九年了。见,特别是,comment 80为这是为什么,为什么,伤心地说了很长的解释,我也不会感到惊讶,如果它去另外九个多年没有搞定了。

您可以通过将所有插件状态导出到包含页面中的JavaScript来解决此问题。

更新:仅仅两年后,该错误已得到修复!该修复程序将在Firefox 13中进行,目前计划于2012年6月5日发布;如果你想早点,它将在4月24日处于“测试阶段”,并在3月13日(今天)之后不久就会出现“极光”。 Josh Aas值得赞扬的是,将这个问题摔倒在地 - 修复程序经历了54次修订并修改了超过3,000行代码。

答案 1 :(得分:2)

我不知道你是否可以在遭受这个问题的浏览器中使用它 - 在一些测试中似乎包括在编写最新版本的Chrome(Linux),Firefox(Win / Linux),Safari时(Win)和Opera(Win / Linux)) - 但在Internet Explorer中(或者至少在IE6和IE8中,在Windows XP上)不会重新加载Flash小程序。但是在IE中,当SWFObject重新插入文档树时,会有两次调用'embed'回调的怪异。所以我决定永远不要尝试做这样的事情,并将我的Flash状态存储在JavaScript中,如第一个答案所示。

无论如何,抱歉没有提供真正的答案,但由于这是谷歌搜索相同问题时的第一个结果,我觉得列出哪些我认识的浏览器有这个问题可能是有用的(我会回复jayarjo的评论,但我还没有足够的声誉:/)