actionscript-3 - 我可以将 swf 地址设为真实的 URL 而不使用# 吗?

标签 actionscript-3 flash-cs5 swfaddress

是否有可能制作 swfaddress 或任何脚本,以允许 flash 将浏览器中显示的 URL(无需实际切换到新页面)更改为我选择的任何内容?我意识到 swfaddress 生成 url,以便它始终引用原始 swf 文件,这很好,但我正在处理的 Web 模板将始终加载 swf,无论您在网站上访问什么 URL。不同之处在于立即加载的内容。当您通过 Flash 导航到不同的文章时,我希望能够将 URL 更改为文章的 URL,就好像它是一个 html 页面一样,因为我将有匹配的 html 内容用于 SEO 目的。这将是一个大型网站,我想针对共享和可搜索性对其进行优化。

举个例子,我想要的 URL 不是“site.com/#/news-just-in”,而是“site.com/2011/3/news-just-in”。

这可能吗?

最佳答案

您可以这样做,但只能在支持新的 HTML5 History API 的浏览器中进行.您需要使用 ExternalInterface 与 JavaScript 层协作。 Flash 方面的内容可能如下所示:

package {
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  import flash.external.ExternalInterface;
  import flash.text.TextField;
  import flash.text.TextFieldAutoSize;

  public class Test extends Sprite {
    protected var _text:TextField;

    function Test() {
      var b:Sprite = new Sprite;
      b.graphics.beginFill(0xff0000);
      b.graphics.drawRect(0, 0, 32, 32);
      b.graphics.endFill();
      b.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void {
        pushState('/test/foo');
      });
      addChild(b);

      b = new Sprite;
      b.x = 64;
      b.graphics.beginFill(0x0000ff);
      b.graphics.drawRect(0, 0, 32, 32);
      b.graphics.endFill();
      b.addEventListener(MouseEvent.MOUSE_DOWN, function(e:MouseEvent):void {
        pushState('/test/bar');
      });
      addChild(b);

      _text = new TextField();
      _text.autoSize = TextFieldAutoSize.LEFT;
      _text.y = 64;
      addChild(_text);

      if (ExternalInterface.available) {
        ExternalInterface.addCallback('onPopState', onPopState);
        ExternalInterface.call('test.onReady');
      } else {
        _text.text = 'external interface not available';
      }
    }

    protected function onPopState(path:String):void {
      _text.appendText("flash onPopState: " + path + "\n");
    }

    protected function pushState(path:String):void {
      _text.appendText("flash pushState: " + path + "\n");
      ExternalInterface.call('history.pushState', null, null, path);
    }
  }
}

JavaScript 端可能是这样的:

<!DOCTYPE html>
<html>

<body>
  <script type="text/javascript">
  if (!!(window.history && history.pushState)) {
    var test = {
      onPopState: function(event) {
        if (this.embed) {
          this.embed.onPopState(location.pathname);
        }
      },

      onReady: function() {
        var embed = document.getElementById('flash');
        this.embed = embed.getElementsByTagName('object')[0] || embed;
        this.embed.onPopState(location.pathname);
      }
    };

    window.addEventListener('popstate', function(event) {
      test.onPopState(event);
    }, false);
  } else {
    alert('This browser does not support the history API');
  }
  </script>
  <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
          id="flash" width="780" height="420">
    <param name="movie" value="test.swf" />
    <!--[if !IE]>-->
    <object type="application/x-shockwave-flash"
            data="test.swf" width="780" height="420">
    <!--<![endif]-->
      <p>Flash is required</p>
    <!--[if !IE]>-->
    </object>
    <!--<![endif]-->
  </object>
</body>

</html>

在这个例子中,每当路径改变时调用onPopState,并且调用pushState来改变URL。您可以单击示例中的红色和蓝色框来更改来自 Flash 的 URL。

如果您想这样做并且必须支持较旧的浏览器,那么当不支持历史 API 时,您会希望回退到散列标签。理想情况下,您可以在 JS 层对此进行抽象,这样 Flash 代码就不必知道正在使用哪个。我建议使用第三方库,如 History.js对于这样的事情,因为它将为您处理哈希回退。

关于actionscript-3 - 我可以将 swf 地址设为真实的 URL 而不使用# 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5304994/

相关文章:

iphone - 如何从 Flash (AS3) iPhone 应用程序发送短信

Flash AS3 在尝试获取外部 swf 时获取安全沙箱违规

apache - 如何使用 mod_rewrite/htaccess 通过 anchor 检测 URL 并重定向?

javascript - swfaddress-optimizer.js 的文档在哪里?

flash - Google 如何读取 SWFAddress 深层路径?

actionscript-3 - 动态 xml 文本和图像不会在 Flash 中刷新

ios - 我怎样才能使用 AIR 获得任何 ios 设备的分辨率..?

actionscript-3 - 如何将文本字段居中并在末尾添加空格?

xml - Flex 中多首歌曲的问题 - AS3

iphone - 闪存 CS5.5 : Photo is rotated when capture a photo using CameraUI on iPhone