プロが教える店舗&オフィスのセキュリティ対策術

いつもお世話になっています。
WinXPでFlash MX2004を使用しています。

ボタンクリックで別swfの任意のフレーム(ラベル)に移動したいと考えているのですが、可能でしょうか?
具体的にいうと、

01.swf上にボタンA/B/Cを設置。
リンク先の02.swfにフレームラベル「A」「B」「C」があって、01.swfのボタンをクリックすると、02.swfのそれぞれのフレームに移動。

ずいぶん以前にそういった内容の記事をWeb上で見たように思ったのですが、「Flash」「ラベル」「任意」などの単語で検索しても見つけられません。
お心当たりの方がいらしたらどうかご指導ください。

A 回答 (1件)

極々たまに,


同じような 表現 をされる方を見かけるのですが…

>> ボタンクリックで別swfの任意のフレーム(ラベル)に移動

このニュアンスが良くわからないのです。

ネット上にある Flash の場合,
普通(99.9%以上)は,HTML(PHPなどを含む) に SWF が貼ってあると思います。
だから,「別swfの任意のフレーム(ラベル)に移動」 ではなくて,
「getURL で開いた先の HTML に貼り付いている SWF を任意のフレーム(ラベル)から表示したい。」
のではないでしょうか?

よくわかりませんが,
とりあえず,その普通の場合で回答し,
後に, Flash から Flash (SWF → getURL→ SWF) の方法を回答することにします。

他にも方法はあるので,下記は一例だと思ってください。
01.swf → ブラウザ → 02.htmlのJavaScript → 02.swf
と引数をリレーさせる方法です。
また,下記の方法はローカルPC上では検証できないと思います(多分)。
作った物をWeb上にアップするか,IISなど仮想サーバで動作させると検証可能です。




◎ HTMLに SWF が貼ってある普通の場合の方法

--- ファイル構造 ---------------------------

  サーバ上の任意のディレクトリ
     ├ 01.html ( 01.swf が貼ってある )
     ├ 01.swf
     ├ 02.html ( 02.swf が貼ってある )
     └ 02.swf


--- 「01.html」 の説明 ---------------------

「01.html」 は,普通に作ってください。
「02.swf」を貼り付けるだけで良いです。


--- 「01.swf」 の説明 ---------------------

「02.html」に getURL したときに,
その「02.html」に貼ってある「02.swf」を指定フレームラベルに進めるためのボタンのスクリプトです。
「02.swf」 のフレームラベルのラベル名は "aaa","bbb","ccc" という3つであったとします。
ブラウザのURLとして,fn=aaa のような引数を付け足して getURL させます。

↓フレームラベル "aaa" を表示させるボタンのスクリプト
//////////////////////
on (release) {
getURL("02.html?fn=aaa");
}
//////////////////////

↓フレームラベル "bbb" を表示させるボタンのスクリプト
//////////////////////
on (release) {
getURL("02.html?fn=bbb");
}
//////////////////////

↓フレームラベル "ccc" を表示させるボタンのスクリプト
//////////////////////
on (release) {
getURL("02.html?fn=ccc");
}
//////////////////////


--- 「02.html」 の説明 ---------------------

JavaScript で,
引数付きURL から,引数の値の部分だけを取り出し,
SetVariable で 「02.swf」 にその値を送信します。
一応,無駄を省略した形で,JavaScriptの部分だけでなく,
HTML 全体のソースコードを書いておきます。
幅×高さ=400px × 300px の 「02.swf」 を貼り付けるときのタグ例です。

ポイントは,

 whichObj("test").SetVariable
 ( window.document.test.SetVariable の変形 )

ここの部分の,
JavaScript の SetVariableメソッド の対象とする test というオブジェクト名称と,
Flash を貼り付ける OBJECT タグ の id を一致させるところです。

 <OBJECT …略… id="test">

また,Flash を貼り付ける EMBED タグ の name も一致させておいてください。

 <EMBED name="test" …略… >

これで,SetVariable のターゲットが Flash(02.swf) になります。

/////////////////////////////////////////////////////////////
<html>
<head>
<title> 02.swf test </title>

<script type="text/javascript">
function whichObj(objName)
{
if(navigator.appName == "Netscape"){
  //Netscape用
  return window.document[objName];
}else{
  //IE、その他用
  return window[objName];
}
}
function frmJump(){
// URL の "fn=" 以降の文字を 変数frm_name に代入
var frm_name = location.href.split("fn=")[1];
// SetVariable で Flash 内の my_frm に frm_name を送信
whichObj("test").SetVariable("my_frm", frm_name);
}
</script>

</head>
<body>

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
WIDTH="400" HEIGHT="300" id="test">
<PARAM NAME=movie VALUE="02.swf">
<EMBED name="test" src="02.swf" quality=high bgcolor=#FFFFFF WIDTH="400" HEIGHT="300" TYPE="application/x-shockwave-flash"></EMBED>
</OBJECT>

</body>
</html>
/////////////////////////////////////////////////////////////

※ 上記JavaScript では,関数を定義しているだけです。
  わけあって,関数の実行は Flash からします。


--- 「02.swf」 の説明 ---------------------

次のスクリプトは,「02.swf」 の _root のタイムラインのフレーム1に書くスクリプト例です。
「02.swf」の全体の読み込みの終了と,
getURL ("JavaScript:frmJump()");" で逆送信されてくる,
変数my_frm の値の到着両方を待ってから,
指定フレームラベルにジャンプさせるスクリプトです。

/////////////////////////////////////////////////////////////
// とりあえずストップ
this.stop();

// JavaScript を実行
getURL ("JavaScript:frmJump()");

// 1フレーム進む時間ごとに毎回{ }内を実行
this.onEnterFrame = function() {

// 全てのロードが完了し
// my_frm が JS によって渡されたら
if (this.getBytesLoaded()>=this.getBytesTotal() && my_frm != undefined) {

// ↓ this.gotoAndPlay(my_frm); でも良い
this.gotoAndStop(my_frm);

// この onEnterFrame を削除
delete (this.onEnterFrame);

// それ以外の場合は ストップ を継続
} else {
this.stop();
}
};

/////////////////////////////////////////////////////////////

本当は,「02.html」 自身から
<body onLoad=frmJump()>
で,frmJump() を実行させたいところですが,
上記の場合 NN や Firefox ではそれがうまくできないので,
getURL で frmJump() を実行させる方法を取っています。


以上で,
「01.swf」から変数と値という引数がブラウザ経由で,
次の「02.html」に渡るので,「02.html」のJavaScriptでその引数を受けとり,
「02.swf」に送信するというものができます。

Flash 以外のものを数回経由させるので,少々ややこしいですが,
やっていることとスクリプト自体は非常に簡単な部類に入ると思います。


ちなみに,
上ので難しいのは引数の受け取り側である,「02.html」と「02.swf」です。
ローカルで,実験しながらの作成ができないので,
私は次のHTMLを 「01.swf」 に見たてて作っておき,実験しながらつくりました。
これだと↓,私の環境ではローカルPCでも引数の受け渡しができます。
////////////////////////////////////////
<html>

<head>
<title></title>
</head>

<body>

<p><a href="02.html?fn=aaa">aaa</a></p>
<p><a href="02.html?fn=bbb">bbb</a></p>
<p><a href="02.html?fn=ccc">ccc</a></p>
</body>

</html>
////////////////////////////////////////




◎ Flash から Flash (SWF → getURL→ SWF) の方法

これは,一度 HTML を経由しないので,上のものよりもっと簡単です。
しかし,同じく,ローカルPC上では検証できないと思います(多分)。

--- ファイル構造 ---------------------------

  サーバ上の任意のディレクトリ
     ├ 01.swf
     └ 02.swf


--- 「01.swf」 の説明 ---------------------

getURL の対象を 「02.swf」 にして,
直接 「02.swf」 に,変数とその値を送信するだけです。

↓フレームラベル "aaa" を表示させるボタンのスクリプト
//////////////////////
on (release) {
getURL("02.swf?my_frm=aaa");
}
//////////////////////

↓フレームラベル "bbb" を表示させるボタンのスクリプト
//////////////////////
on (release) {
getURL("02.swf?my_frm=bbb");
}
//////////////////////

↓フレームラベル "ccc" を表示させるボタンのスクリプト
//////////////////////
on (release) {
getURL("02.swf?my_frm=ccc");
}
//////////////////////


--- 「02.swf」 の説明 ---------------------

上の普通の場合の 「02.swf」 とほぼ同じで行けます。
getURL(""); を消すだけです。

/////////////////////////////////////////////////////////////
// とりあえずストップ
this.stop();

// 1フレーム進む時間ごとに毎回{ }内を実行
this.onEnterFrame = function() {

// 全てのロードが完了し
// my_frm が JS によって渡されたら
if (this.getBytesLoaded()>=this.getBytesTotal() && my_frm != undefined) {

// ↓ this.gotoAndPlay(my_frm); でも良い
this.gotoAndStop(my_frm);

// この onEnterFrame を削除
delete (this.onEnterFrame);

// それ以外の場合は ストップ を継続
} else {
this.stop();
}
};
/////////////////////////////////////////////////////////////


以上です。
こっちの方が簡単です。JavaScript も不要です。
しかし,SWFを直接表示というのは見ないので,
普通の HTML に貼り付ける場合 の後に書きました。




◎ その他

最初にも書いた書いた通り,上のは一例で,通り他にも方法はあります。
他のコミュニティサイトに同様の質問で面白い回答集があったので,URLを書いておきます。
上の方法とは全く違う方法です。

FLASH-JP.COM - フォーラム
「swfの中の指定した所を表示させられますか?」
http://www.flash-jp.com/modules/newbb/viewprint. …
ここでは
「LocalConnection を使う方法」
「SharedObject 使う方法」
「FlashVars を使った SWF を貼り付ける HTML を写真の数だけ用意する方法」
の3つが書かれています。
ご存じかと思いますが,一応,
笠居マッドシー(笠居トシヒロ)さん,野中 文雄さん,そしてちょろっとだけ御出没の まつむらまきおさんは,本などもたくさん出されているプロ中のプロの方々ですね。

「LocalConnectionの方法」 はかなりハイレベルです。
「SharedObjectの方法」 は私がここで書いたのよりちょっとだけハイレベルです。
「FlashVarsの方法」は確かに簡単ですが…「オイオイやたら手間じゃないか???」と思う方法です。
結局管理者権限?でFlashVarsで押し切っちゃってます(スゴイ)。
FlashVars を使う所までは特に異論はありませんが,写真の枚数だけHTMLを用意というのは…どうなのでしょう?

私が この3つで選ぶなら,「SharedObjectの方法」 を取ります。
ブラウザ環境も気にしなくていいのでその点はJavaScript経由より簡単です。
実は私がまず思いついたのも SharedObject なのですが,
ここのコミュニティで SharedObject に関してはさんざん回答したので,
あえて JavaScript経由の方法を回答しました。
    • good
    • 0
この回答へのお礼

sassakun様、ありがとうございます。
> 01.swf → ブラウザ → 02.htmlのJavaScript → 02.swf
> と引数をリレーさせる方法
まさしくこの方法が知りたかったのです。
01.htmlと02.htmlを別のディレクトリにおきたかったので、
1)01.html上の01.swfのボタンを押すと、02.htmlに情報を渡す
2)02.htmlから02.swfにその情報を渡し、gotoAndPlay()でタイムラインを移動する
という手順で考えていて、その方法が知りたかったのですが、質問文が不適切だったとしたら申し訳ありませんでした。

しかし私のようにスキルの低い人間が、1)にgetURL()を使うということも、2)にJavaScriptを使うということもわからない状態では、自分のしたいことを文章で適切に表現すること自体が非常に難しいです。
その意味でも「検索のヒントだけでもアドバイスして欲しい」と思って書き込んだのですが、大変わかりやすい解説を丁寧にしていただいたおかげで、無事に実現できました。
ありがとうございます。

教えていただいた参考URLに出てい「LocalConnection」と「SharedObject」は私には難易度が高すぎ、「FlashVars」は実用性の点から見て不適切と感じたので、試しませんでした。
もっと勉強して、「LocalConnection」と「SharedObject」の方法を実現できるようにがんばりたいと思います。

お礼日時:2006/06/22 19:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!