是否可以使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”。
这可能吗?
答案 0 :(得分:5)
您可以执行此操作,但仅限于支持新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这样的第三方库,因为它会为你处理哈希回退。
答案 1 :(得分:0)
您可以将哈希标记更改为您想要的任何内容,但需要一个常量字符或字符串才能使其按预期工作:
/*
Provides the deep linking value without the query string.
*/
public static function getPath():String {
var value:String = SWFAddress.getValue();
if (value.indexOf('?') != -1) {
return value.split('?')[0];
} else if (value.indexOf('#') != -1) {
return value.split('#')[0];
} else {
return value;
}
您还必须更改 SWFAddress.js 和 SWFAddressOptimizer.js 中的所有“#”实例,以匹配您的新字符或字符串值。
请记住,不鼓励更改此值,并将其替换为简单值(如“3”)可能会导致问题。