3

我有一个应用程序需要在一系列行中渲染大约 100 个 Flash 图表(以及其他 DOM 内容),这些行在当前可见窗口之外垂直延伸很多倍 - 换句话说,用户必须向下滚动才能看到所有不同的图表。

此应用程序也是动态的,当用户更改 DOM(页面上的任何位置)中的值时,它需要同时将该更改传播到所有 Flash 图形。

所以我设置了所有的 externalInterface 回调,并小心地在非常重要的“flashIsReady”调用之前不让任何 JS 开始运行,并且......它工作得很好,直到我尝试用新数据 update() 现有的 swf。

这是行为: - 所有 swfs 加载(最初)在 IE/Fox = 好。- 用新内容更新 swfs 在 IE 中有效,但在 Fox 中无效 = 不好 - 用新内容更新 swfs 在 Fox 中有效 -- 仅当 -- 我向下滚动到页面底部,然后返回顶部 -- 之前 - - 我触发了更新()。

所以我开始追踪每次 swf 调用 JS 说“flash is ready”,我意识到,Firfox 只在 swf 变得可见时才渲染它们。老实说,这很好,实际上,我很确定 IE 也可以做到这一点。但问题在于,Firefox 不仅不初始化 swf,而且如果 swf 还不可见,Firefox 甚至都不承认 swf 存在(预计在 onload 之后)。

证明是你得到 JS 错误说:

“[FlashDOMID].FlashMethod 不是函数”。

但是,向下滚动一点,等到它可见,然后轨迹突然开始亮起

“Flash Ready”、“Flash Ready”、“Flash Ready”,一旦它们都准备好,一切正常。

有人告诉我,FF 在可见之前不会初始化 swf - 我可以强制吗?如果您需要,我可以发布代码......但它非常繁重(很难从其余部分中删除相关内容),如果可能的话,我想避免它(为了您的利益)。

问题很简单——你有没有遇到过这种情况,如果有,你找到解决方案了吗?有谁现在如何强制一个不可见的 swf 进行初始化?多谢你们。

4

3 回答 3

3

所以...

经过大量的论坛搜索 - 我同意,没有优雅的方法可以做到这一点哈哈!我最终寻求的解决方案基本上是为 $(document).ready() 上的每个 swf 制作 JS 对象

基本上,JS 对象会有不同的值,其中有“data”和“isReady”。当一个 swf 变得可见并调用 JS 说“我准备好了”时,我会简单地捕获该调用,然后找到它所指的 JS 对象(我设法通过将每个 swf 的 DOM id 作为它的一个传递来做到这一点flashVars;是的,它让我觉得很脏)。从那里开始,它基本上只是一个游戏,以确保在我尝试操作之前每个 JS 都有“isReady”。

在这整个混乱中唯一的优雅之处在于,通过使用 JS 对象,我仍然可以通过简单地更新它们各自 JS 对象中的“数据”属性来将新数据应用于“隐藏”的 swf。然后,当一个 swf 最终变得可见时,我会更新它所拥有的任何数据(即当前数据)并且它工作得很好但是是的,我仍然同意这整个情况是不幸的。

所以... *回答。

于 2010-05-05T23:20:31.403 回答
1

我知道这可能是一个迟到的答案。

但是你需要将你的 wmode 从 opaque 更改为 wmode="window",这就是为什么它在 firefox 中不能正常工作,IE 做同样的事情,但只在第一页加载时。

将 wmode 设置为 opaque 会导致 firefox 在浏览器查看之前不会初始化 swf。但是,并非所有浏览器都一样。IE 只在第一页视图中使用它,chrome 和 safari 根本不这样做。

对我来说不幸的是,我发现这个问题正在寻找相反的东西。我试图让播放器在所有浏览器中都不会初始化,直到它在浏览器中可见。

于 2010-11-23T22:49:59.277 回答
-1

除了在页面初始化后重新定位元素,强制加载开始然后再次隐藏它们之外,我从未真正找到强制加载 Flash 的好方法(便宜且讨厌,但似乎有效)。

将所有 Flash 元素放在页面的左上角(以确保它们在页面加载时可见),然后使用 javascript 中的 pageLoad 函数根据需要重新定位页面下方的元素。Jquery 让您使用 addClass() 和 removeClass() 函数非常轻松地完成这一切

于 2010-05-05T07:58:43.473 回答