常連 居住地: Akiruno-shi 投稿: 155
使用環境: :AS3: - Adobe Flex SDK, Eclipse, AIR GEAR - LB.Log AS3, Alcon2 :AS2: - AMES(ASDT, MTASC, Eclipse, swfmill) - Natural Entry Point Method - LB.Log, Zeroi Pro, Firefox, Chromium(Iron), IE ---------------- Pro,
|
動きますが不安です[SWFAddress+Firefox+クロスドメイン] 質問とは少し違うのですが、SWFAddressを使っているSWFファイルがありまして、これを別ドメインにあるHTMLファイルからアクセスした時、SWFAddress.setValue関数が効かないという問題に直面しました。 効かないといっても全くではなく、setValue後におこるchangeイベントは発生しています。しかし、ブラウザのロケーションバー(URLが表示される部分)が変化しません。
しかもIEとFirefoxではFirefoxだけにこの問題がおき、IEの時や各ファイルが同じドメイン上にあれば問題ありません。 ここが変化しないと、ブックマークやヒストリーバックが使えないので悩みました。 アドオンなしのFirefoxで見たり、SWFAddressのバージョンを変える、緩いポリシーファイルを置いてみたりしましたが解決されず、もしやと思い、最近始めだしたAS3で試してみるも結果は同じです。
SWFAddressのソースを見ると、setValue関数はExternalInterfaceを使用していたので、それ絡みで検索してみると参考になるページを見つけ、最終的にはFlashのallowDomain関数を使用することにより大丈夫になりました。
・ExternalInterface@FireFox - フォーラム - Flex User Group ・ExternalInterfaceとかの落とし穴まとめ - 0-9
しかし、たまたま自分の環境で動いているだけかもしれないのでは?という思いがあり、なんというか…とても不安です(苦笑)。また、Firefoxだけというのも気になります。
実際にテストで使っていたページを置きましたので、もし時間が空いておられるかたに確認して頂けたらと思い、投稿しました(すみませんが、リンク先は無料サーバなので上部に広告が出てしまいます)。 なお、FlashPlayerが9.0.124.0以上でないと更新画面になります(これは下げたほうがいいでしょうか?)。
以下はActionScriptの各ソースです。
(AS2のソースコード)
import mx.managers.DepthManager;
import mx.controls.Button;
import com.asual. * ;
//====================================================================//
class Main extends MovieClip{
//----------------------------------------------------------------//
function Main() {
var self : MovieClip = this;
trace("i Main");
//
System.security.allowDomain("vraihmfx.s267.xrea.com");
}
//----------------------------------------------------------------//
function onLoad() {
var self : MovieClip = this;
trace("i complete");
//URL変更時やsetValue時に呼ばれる
SWFAddress.onChange = function () {
trace("i swfaddr_change");
trace("d getValue:" + SWFAddress.getValue());
};
//Buttonをクリック時に呼ばれる
var buttonListener : Object = new Object();
buttonListener.click = function (a_event : Object) {
trace("i button_click");
trace("d label:" + a_event.target.label);
SWFAddress.setValue(a_event.target.label);//URL変更
SWFAddress.setTitle(a_event.target.label);//タイトル変更
};
//Buttonを縦に並べて表示
var button_list : Array = ["HOGE", "FUGA", "PIYO"];
var button_height : Number = Math.floor(Stage.height / button_list.length);
var button_margin : Number = 8;
for (var i : Number = 0; i < button_list.length; i++) {
var btn : Button = self.createClassChildAtDepth(Button, DepthManager.kTop, {
label : button_list[i]
});
btn.move(button_margin + 0, button_margin + button_height * i);
btn.setSize(Stage.width - button_margin * 2, button_height - button_margin * 2);
btn.addEventListener("click", buttonListener);
}
}
}
(AS3のソースコード)
package{
import flash.display. * ;
import flash.events. * ;
import flash.system. * ;
import mx.core. * ;
import mx.events. * ;
import mx.controls. * ;
import com.luminicbox.log. * ;
import com.asual.swfaddress. * ;
import my. * ;
//========================================================================//
public class Main extends Application{
private var _logger : Logger;
//--------------------------------------------------------------------//
public function Main() {
super();
DefaultComponent.stylesInit();
//ログ出力の準備
_logger = new Logger("test_swfaddr_as3");
var cp : ConsolePublisher = new ConsolePublisher();
_logger.addPublisher(cp);
//
Security.allowDomain("vraihmfx.s267.xrea.com");
//
var self : Application = this;
_logger.info("Main");
//Applicationの設定
self.layout = "absolute";
self.styleName = "plain";
self.setStyle("backgroundColor", 0xDEE2E2);
self.addEventListener(FlexEvent.APPLICATION_COMPLETE, app_complete);
}
//--------------------------------------------------------------------//
private function app_complete(a_event : FlexEvent) : void{
var self : Application = this;
_logger.info("complete");
//SWFAddressイベントの設定
SWFAddress.onChange = swfaddr_change;
//Buttonを縦に並べて表示
var button_list : Array = ["HOGE", "FUGA", "PIYO"];
var button_height : int = Math.floor(self.stage.height / button_list.length);
var button_margin : int = 8;
for (var i : int = 0; i < button_list.length; i++) {
var btn : Button = new Button();
btn.label = button_list[i];
btn.x = button_margin + 0;
btn.y = button_margin + button_height * i;
btn.width = self.stage.width - button_margin * 2;
btn.height = button_height - button_margin * 2;
btn.addEventListener(MouseEvent.CLICK, button_click, false, 0, true);
self.addChild(btn);
}
}
//--------------------------------------------------------------------//
//Buttonをクリック時に呼ばれる
private function button_click(a_event : Event) : void{
_logger.info("button_click");
_logger.debug("label:" + a_event.target.label);
SWFAddress.setValue(a_event.target.label);//URL変更
SWFAddress.setTitle(a_event.target.label);//タイトル変更
}
//--------------------------------------------------------------------//
//URL変更時やsetValue時に呼ばれる
private function swfaddr_change() : void{
_logger.info("swfaddr_change");
_logger.debug("getValue:" + SWFAddress.getValue());
}
}
}
---------------- :961832p: - だんだんAS3に慣れてきた“なんちゃって”AMES使いの日曜プログラマー
|