我可以将swf地址设为真正的URL并且不使用#?

Gho*_*st9 3 actionscript-3 swfaddress flash-cs5

是否可以制作swfaddress或任何脚本,以允许flash将浏览器中显示的URL(实际上没有切换到新页面)更改为我选择的任何内容?我意识到swfaddress创建了url,因此它总是会返回到原始的swf文件,这很棒,但我正在处理的Web模板总是加载swf,无论你在网站上访问什么URL.不同之处在于立即加载的内容.当您浏览闪存到不同的文章时,我希望能够将URL更改为文章的URL,就像它是一个html页面一样,因为我将为SEO目的提供匹配的html内容.这将是一个大型网站,我想优化它以进行共享和搜索.

举个例子,我想要一个名为"site.com/2011/3/news-just-in"的网址,而不是"site.com/#/news-just-in".

这可能吗?

Nat*_*ard 5

您可以执行此操作,但仅限于支持新HTML5历史记录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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

在此示例中,onPopState只要路径发生更改,pushState就会调用它,并调用它来更改URL.您可以单击示例中的红色和蓝色框以更改Flash中的URL.

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