3

我们正在为 Facebook 编写应用程序。这是一个用flash编写并嵌入了wmode window的游戏。我们遇到了Firefox 6的问题,但仅限于Windows XP。当用户调用一些 facebook 对话框(例如:支付对话框或购买更多积分对话框)时,flash 消失。当用户单击通知(顶部 facebook 菜单中的地球图标)并按住它一段时间(但这不是那么重要)时,也会发生同样的情况。

在 flash 消失后,它仍然在 DOM 中作为<object>. 创建墙贴对话框时不会发生这种情况。

如何解决?

我们不能改变 wmode,所以这种方式是不可能的。

4

1 回答 1

4

FB.init 文档:https ://developers.facebook.com/docs/reference/javascript/FB.init/#flash为您提供了一些选项,如果您的应用程序无法与 wmode= 一起使用,则可以做一些比显示白色背景更好的事情“不透明”。

facebook.com 上的 Adob​​e Flash 应用程序

对于使用 Adob​​e Flash 的 Canvas 应用程序,尽可能首选 wmode="opaque"。我们发现,在具有硬件合成的现代浏览器上,使用 wmode="opaque" 通常不会降低性能。否则,默认情况下,Facebook 将在弹出事件发生时隐藏您的 Flash 对象,并在弹出窗口消失时重新显示它们。

如果您需要使用 wmode="window",并且想控制此行为(例如在发生这种情况时还显示文本或图像),您可以在 FB.init 的 hideFlashCallback 参数中提供一个函数。hideFlashCallback 将状态字段作为传入参数的一部分,表示窗口是打开还是关闭。如果您提供一个,这是您将覆盖的默认实现,但也可以让您了解覆盖的外观:

function(params) {
  var candidates = window.document.getElementsByTagName('object');
  for (var i = 0; i < candidates.length; i++) {
    var elem = candidates[i];
    if (elem.type != "application/x-shockwave-flash") {
      continue;
    }

    var good = false;
    for (var j = 0; j < elem.childNodes.length; j++) {
      if (elem.childNodes[j].nodeName == "PARAM" && elem.childNodes[j].name == "wmode") {
        if (elem.childNodes[j].value != "window" && elem.childNodes[j].value != "default") {
          good = true;
        }
      }
    }
    if (!good) {
      if (params.state == 'opened') {
        elem.style.old_visibility = elem.style.visibility;
        elem.style.visibility = 'hidden';
      } else if (params.state == 'closed') {
        elem.style.visibility = elem.style.old_visibility;
        elem.style.old_visibility = '';
      }
    }
  }
}

注意:某些 UI 方法(如 stream.publish 和 stream.share)无需注册应用或调用此方法即可使用。如果您使用的是应用程序 ID,则必须在此方法之后调用所有方法。

于 2011-09-08T09:04:58.047 回答