Могу ли я сделать адрес SWF реальным URL и не использовать #? - PullRequest
3 голосов
/ 15 марта 2011

Можно ли сделать swfaddress или любой другой скрипт, чтобы Flash мог изменять отображаемый URL (без фактического перехода на новую страницу) в браузере на что-либо, что я выбрал? Я понимаю, что swfaddress делает URL так, что он всегда будет ссылаться на исходный файл swf, и это здорово, но веб-шаблон, над которым я работаю, всегда загружает swf, независимо от того, какой URL вы посещаете на сайте. Разница будет в том, какой контент загружается сразу. Когда вы перемещаетесь по флэш-памяти к различным статьям, я хочу иметь возможность изменить URL-адрес на статью, как если бы это была HTML-страница, так как у меня будет соответствующий HTML-контент для целей SEO. Это будет большой сайт, и я хочу оптимизировать его для совместного использования и поиска.

Так, в качестве примера, вместо "site.com/#/news-just-in" я хочу указать URL "site.com/2011/3/news-just-in".

Возможно ли это?

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

Вы можете сделать это, но только в браузерах, которые поддерживают новый 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 для чего-то подобного, так как она будет обрабатывать откат хеша для вас.

0 голосов
/ 15 марта 2011

вы можете изменить хеш-тег на любой другой, но для его работы требуется постоянный символ или строка:

/*
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") может вызвать проблемы.

...