4

我有一个使用 Flash 和动画的页面(这些不是重要的,而是附加的)。

一切正常,如果我不使用激活 Turbo 的 Opera。然后 Flash 电影显示为一个大而丑陋的箭头,圆圈中的大小与 Flash 电影的大小相同,旨在充当 Flash 的播放按钮。

我正在使用 SWFobject,所以如果我知道是否使用了 Opera 的 turbo 机制,我可以轻松地关闭动画,但是我该如何在 JavaScript 中执行此操作(或者如果是这样的话,可能是 CSS)


如何重现?
使用 Opera 浏览此页面(或使用 Flash 的任何其他页面)
http://www.adobe.com/software/flash/about/
没有 Opera Turbo 您会看到 Flash 动画和 Flash 版本信息 使用 Opera Turbo 您会看到两个白色箭头在灰色圆圈中


编辑 1 我现在很确定,没有纯 JS 解决方案,也没有 PHP 解决方案。最好的猜测是组合 AS/JS 解决方案。

4

3 回答 3

5

客户端检测:无法通过 javascript 访问它。Opera turbo 的客户端检测目前是不可能的,也许将来会支持,但谁知道呢?

服务器端检测:当启用opera turbo 时,来自客户端的所有请求都发送到opera 服务器,opera 服务器将访问您的应用程序(进行压缩)并将处理后的内容转发到最终客户端(用户的计算机)。

考虑到这一点,让我们做一些网络嗅探,看看你的连接在哪里:

~$ nslookup opera10beta-turbo.opera-mini.net
>Server:        189.40.226.80
>Address:   189.40.226.80#53
>Non-authoritative answer:
>opera10beta-turbo.opera-mini.net   canonical name = global-turbo-1.opera-mini.net.
>Name:  global-turbo-1.opera-mini.net
>Address: 141.0.11.252

~$ nslookup 64.255.180.252
>Server:        192.168.1.254
>Address:   192.168.1.254#53
>Non-authoritative answer:
>252.180.255.64.in-addr.arpa    canonical name = 252.0-24.180.255.64.in-addr.arpa.
>252.0-24.180.255.64.in-addr.arpa   name = global-turbo-1-lvs-usa.opera-mini.net.

如您所见,Opera 服务器的名称和规范名称可用于检测您的应用程序是否正在通过 Opera 服务器中介进行访问。我认为服务器端编码可以处理这个问题(不确定你在服务器上使用什么语言)。

请记住,如果您访问本地服务器中的某些内容,Opera Turbo 不会为您的请求提供中介。

希望能帮助到你。

于 2012-01-14T03:11:33.250 回答
2

我相信速度问题的答案是最初没有下载 Flash 内容。您必须手动单击图标才能下载它。动画 GIF 也是如此。这是提高速度的策略的一部分。(参见这篇 Opera Desktop Team 帖子。)

这就是为什么您想知道如何检查 Opera Turbo而不仅仅是 Opera。从我的本地测试中,我无法区分使用 PHP 的 _SERVER["HTTP_USER_AGENT"] 变量。我认为这类似于 Opera 列出的用户代理字符串,如此处此处所示。

Opera 似乎不是通知网站浏览器状况,而是以不同的方式默默地管理请求结果。

于 2012-01-13T23:43:44.377 回答
2

您可以尝试检查 flash 对象是否加载了一些 javascript。此代码适用于我的带有 Opera 11 的计算机:

<html>
<head>
  <script language=JavaScript>
    function isFlashBlocked(){
      var blocked;
      try {
        // Can test this on any flash object on the page
        window.document.myFlash.SetVariable("dummy", "dummy");
        // Flash not blocked
        blocked = false;
      }
      catch(err) {
        // Flash blocked
        blocked = true;
      }

      return blocked;
    }

    function removeBlockedFlash() {
      if (isFlashBlocked()) {
        // Hide all flash objects
        window.document.myFlash.setAttribute("style", "display: none");
        // ...

        // Display replacement content
        window.document.myImage.setAttribute("style", "display: inline");
        // ...
      }
    }
  </script>
</head>
<body onload="removeBlockedFlash()">
  <object type="application/x-shockwave-flash" data="HelloWorld.swf" 
          width="100" height="100" id="myFlash">
  </object>
  <img src="image.jpg" style="display: none" id="myImage" />
</body>
</html>

如果您检测到 flash 被阻止,您将隐藏每个 flash 对象并显示您想要的内容。

编辑:此代码不适用于 Firefox,您可能需要在使用此功能之前检测浏览器。

于 2012-01-19T22:09:39.243 回答