これは可能ですが、新しい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 を変更するために呼び出されます。例の赤と青のボックスをクリックして、URL を Flash から変更できます。
これを行い、古いブラウザーをサポートする必要がある場合は、履歴 API がサポートされていないときにハッシュ タグにフォールバックする必要があります。理想的には、これを JS レイヤーで抽象化して、Flash コードがどちらが使用されているかを知る必要がないようにすることができます。このような場合は、 History.jsなどのサードパーティ ライブラリを使用することをお勧めします。これは、ハッシュ フォールバックを処理してくれるからです。