Actionscript 3 我可以将swf地址设置为真正的URL而不使用#吗?

Actionscript 3 我可以将swf地址设置为真正的URL而不使用#吗?,actionscript-3,flash-cs5,swfaddress,Actionscript 3,Flash Cs5,Swfaddress,有没有可能让swfaddress或任何脚本真的允许flash将浏览器中显示的URL(无需实际切换到新页面)更改为我选择的任何内容?我意识到SWFadAddress生成的url总是引用原始swf文件,这很好,但是我正在处理的web模板总是加载swf,无论您在站点上访问什么url。区别在于立即加载的内容是什么。当您在flash中浏览到不同的文章时,我希望能够将URL更改为文章的URL,就像它是一个html页面一样,因为我将为SEO目的提供匹配的html内容。这将是一个大型网站,我想优化它的共享和搜索

有没有可能让swfaddress或任何脚本真的允许flash将浏览器中显示的URL(无需实际切换到新页面)更改为我选择的任何内容?我意识到SWFadAddress生成的url总是引用原始swf文件,这很好,但是我正在处理的web模板总是加载swf,无论您在站点上访问什么url。区别在于立即加载的内容是什么。当您在flash中浏览到不同的文章时,我希望能够将URL更改为文章的URL,就像它是一个html页面一样,因为我将为SEO目的提供匹配的html内容。这将是一个大型网站,我想优化它的共享和搜索能力

因此,作为一个例子,我希望URL为“site.com/2011/3/news just-in”,而不是“site.com/#/news just-in”


这可能吗

您可以将散列标记更改为任何您想要的内容,但它需要一个常量字符或字符串才能正常工作:

/*
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”)替换它可能会导致问题。

您可以这样做,但只能在支持新值的浏览器中进行。您需要使用
ExternalInterface
与JavaScript层协作。事情的闪光面可能是这样的:

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);
    }
  }
}
<!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>
JavaScript方面可能如下所示:

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);
    }
  }
}
<!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>

if(!!(window.history&&history.pushState)){
var测试={
onPopState:函数(事件){
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',函数(事件){
测试状态(事件);
},假);
}否则{
警报(“此浏览器不支持历史API”);
}
需要闪光灯

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


如果您想这样做,并且必须支持较旧的浏览器,那么当历史API不受支持时,您可能希望使用哈希标记。理想情况下,您可以在JS层中对其进行抽象,这样Flash代码就不必知道正在使用哪一个。我建议您使用类似的第三方库来实现类似的功能,因为它将为您处理哈希回退。

您创建flash网站的原因是什么?创建一个超越标准无聊html的网站。Flash在文本布局和图形方面提供了更多的功能,但是如果没有人有Flash的话,我想拥有所有的替代内容,以提高搜索能力和可用性。基本上,我会有flash版本和html版本,我已经完成了大部分的后勤工作,但我仍然停留在web地址部分。我意识到有些人不喜欢flash,可能会贬低它,但这是我目前正在使用的平台,我只是想在这个问题上寻求帮助,而不是关于flash的辩论。我不是想贬低flash,但我感觉你把一个方钉塞进了一个圆孔,问为什么它不合适。如果你使用了一点DHTML和特效,“标准无聊的html”就不一定无聊了。Flash确实在字体管理和文本呈现方面提供了更多功能,但我不会说Flash在图形方面比HTML更有意义。此外,flash站点的可访问性显著下降。我建议你用HTML制作这个网站,并为那些需要华丽的部分嵌入flash。我很感激你尝试帮助你表达自己的观点,但是你不知道这个项目的全部内容,也不知道我在用它做什么。我在这篇文章中所寻找的,是对上述问题的帮助。你可以用任何你喜欢的方式使你的决定合理化。您要寻找的效果需要在每个新页面上加载flash movieclip,此外,您还需要使用服务器脚本来识别请求的页面,并在加载期间为flash设置一个参数。或者,您可以使用javascript检查窗口位置,并通过ExternalInterface将其传递给flash(除非flash具有确定网页位置的内置机制,在这种情况下,您可以使用该机制)。如果您希望保持flash加载,您必须坚持使用哈希标记。