• ベストアンサー

JavaScriptからsetVariable()で変数が設定できない。

Flash 4 を使用しています。 次のようなコードでJavaScriptからFlashに変数を渡すようにしているのですが、ブラウザによってはsetVariable()の行でJavaScriptの実行が停止してしまいます(前後にalert()を入れて確認しています)。 <head> <script type="text/javascript"> <!-- function myFunc() { var jsVar = "sample"; document.myFlash.setVariable("flVar", jsVar); } // --> </script> <body onLoad="myFunc()"> <object id="myFlash" ※以下中略。Flash表示用のコードが入る。 </object> </body> ところで、具体的には、 A:Firefox 1.5、Safari 2.0 ……常にうまくいかない。 B:Opera 8.5 ……うまくいくときもある。 という状況で、Aだけであればブラウザ依存の問題で片付けるところなのですが、Bから、Flashの読み込みのタイミングに問題があって、setVariable()実行時にFlash側の変数が見つけられないところからエラーになるのではないかと仮説を立てました。 しかし、onLoadでJavaScriptの関数を呼ばず、Flashの読み込みが完了した頃合を見計らってフォームのボタンから手動でmyFunc()を呼び出すようにしても、やはり当該箇所でJavaScriptが停止してしまいます。 なお、Flashの方は50KBほどのサイズで、フレームレートは12fps。変数flVarは最初のフレームのアクションで使用しています(宣言はしていません)。 どのような問題があると考えられるでしょか? また解決方法にはどのようなものがあるでしょうか?

  • Flash
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.2

NetScape & Firefox ではなんとかできました。 ◎ まずHTMLです。 勝手に命名した「0011.swf」をパブリッシュした場合です。 HTMLは現物のコピーです↓。 --------------------------------------------- <HTML> <HEAD> <TITLE>0011</TITLE> <script type="text/javascript"> <!-- function myFunc() { var jsVar = "sample"; document.myFlash.SetVariable("flVar", jsVar); return(jsVar); } // --> </script> </HEAD> <BODY onLoad="myFunc()"> <!-- URL's used in the movie--> <!-- text used in the movie--> <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0" id="myFlash" WIDTH=550 HEIGHT=400> <PARAM NAME=movie VALUE="0011.swf"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED NAME="myFlash" src="0011.swf" SWLIVECONNECT="true" quality=high bgcolor=#FFFFFF WIDTH=550 HEIGHT=400 TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></EMBED> </OBJECT> </BODY> </HTML> ------------------------------------------- まず,JavaScript 部分ですが, SetVariable です。 setVariable では動作しません。最初のSは大文字です。 次に,Flashを貼り付けるタグ部分ですが, OBJECT タグの id="myFlash" とともに, EMBEDタグの NAME="myFlash" が必要です。 ◎ 次にFlash IEの場合, ステージ上に flVar という変数名のテキスト入力のテキストフィールド(注1↓)を用意するだけで, flVar の値,つまり "sample" を確認できますが,NetScape や Firefox ではうまく行きません。 これは, > setVariable()実行時に > Flash側の変数が見つけられないところからエラーになる というのが正解です。 ステージ上に ---コピペ不可(注2↓)-------------- On (Release)    Get URL ("javascript:void(myFunc())") End On ------------------------------------ というアクションをボタンを作って, それをクリックすると,flVar という変数名のテキスト入力のテキストフィールドに値が表示されます。 しかし, ボタンをクリックしなければ表示しないというのは困ったものなので,自動表示させるしくみをFlashで作らなければならないと思ったので考えてみました。 Flash5以降では,EnterFrame という便利なものがありますが,Flash4ではないので, フレームをループさせて読み込ませます。 まず,メインムービーを3フレームにします。 そしてアクションを書く専用のレイヤーを1つ追加してください。 フレーム1 のスクリプトに ----------------------------------- Get URL ("javascript:void(myFunc())") ----------------------------------- と書きます。 これで,Flashから JavaScript を実行します。 そして フレーム2 のアクションを書くレイヤーをキーフレームにして, ----------------------------------- If (flVar eq "")    Go to and Play (1) Else    Go to and Stop (3) End If ----------------------------------- と書きます。 これで,変数 flVar に値が入らない限り,フレーム1 に戻ります。 flVar に値が入ると,フレーム3 に進んで止まります。 だからちゃんとテキスト入力のテキストフィールドには値が入ります。 実際は,何フレームあるのかわかりませんから,適当にこの辺の数字は変えてもらうと使えると思います。 一応,Operaでも動作確認済みです。 注1:Flash4では,ダイナミックテキストが存在しないのでテキスト入力のテキストフィールドです。 注2:Flash4では,アクション(現ActionScript)をテキストエディタなどからコピペできません。 === P.S ================= しかし,またなんでFlash4なのですか? 個人的には使いやすくて大好きですけど。 Flash Basic 8 などは2万円台ですし, http://www.macromedia.com/jp/software/studio/productinfo/upgrade/upgrade_fp.html によると Flash Professional 8 にも比較的安価(39,900円)でアップグレードできますよ(と言っても高いですね)。 Flash4 で何が辛いかというと,一番はネットで検索してもアクション(現ActionScript)などの情報がさっぱり得られないところです。 次に,制約が少し多すぎます。 制約が多い分,「Flash4 でやってやろうじゃないか!」という妙な闘志は湧きますけどね。 P.S以降は大きなお世話でした。すみません。

greetinggreentea
質問者

お礼

御礼遅くなりまして申し訳ありません。 面白い方法をありがとうございます。 常時Flash側からJavaScriptに変数を取得しに行くようにするのですね。 ただ、結局、(#1の方に教えていただいたように)SetVariable()が使えないケースも少なくないので、別の方法で解決することにしました。 >しかし,またなんでFlash4なのですか? 単にむかし買ったものを使い続けているだけなのです。 ほとんど絵や図を描くくらいにしか使用していなかったもので……。 2万円くらいなら、新しいのも買ってみようかなあ。

その他の回答 (1)

  • perse
  • ベストアンサー率74% (113/152)
回答No.1

setVariable()の行でJavaScriptの実行が停止するということはFlash側の問題(バージョンとか変数の宣言がないとか受け取り方が悪い)ではなく、 やはりJavaScript側に問題があるかと勝手に思い調べてみました。 ttp://www.3enhancedesigners.com/forum/forum_posts.asp?TID=1115&PN=1 によると JavaScript とプラグインの通信は、  ・LiveConnect/XPConnect 経由でのプラグインとの通信  ・DOM 経由でのプラグインとの通信 をサポートしているブラウザのみ可能。 とのことです。

greetinggreentea
質問者

補足

回答ありがとうございます。 紹介してくれたURLのおかげで、一部のブラウザではサポートされていない、ということについては納得いたしました。 ただ、気になってならないのは、質問で挙げたBの状況(Opera)なのです。 昨日うまくいったかと思えば、今日はうまくいかず、そうかといって、1時間後に試してみると今度はうまくいく――という具合なのです。ローカルで試してみても、インターネットにアップロードして試してみても同じです。まったく同じコードを実行しているのに、どうしてなのでしょう? 不思議です。

関連するQ&A

  • javascript 初心者です

    javascript 初心者です 設定したグローバル変数を引数に指定したいのですが、うまくいきません。 下記のスクリプトのように書いてみたのですが、○が返ってきてしまいます。 どうすればうまくいくでしょうか?よろしくお願いします。 <html> <head> <script type="text/javascript"> <!-- i = false; function myFunc(hensu){ if(hensu){ alert("○"); } else{ alert("×"); } } --> </script> </head> <body> <p onclick="myFunc('i')">[btn]</p> </body> </html>

  • FlashにJavascriptで動的に変数を付加したい

    Flashでカウントダウンするムービーを作成し、その初期値をJavascriptで動的に付加しようとしています。 -親ページに子ページを<iframe>で読み込む -親ページの読み込みは都合最初の1回のみ -子ページはcgiで書き出し、その際にカウントダウン初期値を動的に設定 -子ページの内容を書き換える度、カウントダウン初期値を動的に変更して行くイメージです。 -子ページに設定したinitValueの値を、親フレームのFlashに付加してその値からカウントダウンさせたい。 -下記のような記述で、IE6.0のみ動作不可 □親ページ ■Flash埋込部 -<object>、<embed>各々に"id"を設定 -付加するカウントダウン用変数restの初期値は60 <object classid=(以下省略)> <param name="movie" value="countdown.swf?rest=60" id="fls"> <param name="quality" value="high"> <embed src="countdown.swf?rest=60" id="fls2"(以下省略)></embed> </object> ■Javascript <head> <script language="javascript" type="text/javascript"> <!-- function setPrm(rNum){ rv = "countdowm.swf?rest=" + rNum; document.getElementById("fls").setAttribute("value",rv); //<object>用 document.getElementById("fls2").setAttribute("src",rv); //<embed>用 } --> </script> </head> □子ページ <head> <script language="javascript" type="text/javascript"> <!-- initValue = 30;//サーバーより動的に取得 //親に記述している関数を実行 window.parent.setPrm(initValue); --> </script> </head> ■ブラウザ毎の動作状況 □WIN -IE6.0・・・× -Firefox2.0・・・○ □Mac -Safari2.0・・・○ -Firefox2.0・・・○ IE6.0のsetAttributeでつまづいているような気がしますが、代替となる記述法がわかりません。 IE6.0で動作させる方法等、お知恵をお借り出来ればと存じます。 よろしくおねがいします

  • javascript 初心者です 引数と変数について

    下記のスクリプトで○と×交互に表示されるようにしたいのですが、 hensu = !hensu;のところがうまく機能してくれません。 i = !i;だとうまくいくのですが、引数を使いたいです。 どのように記述すればよいのでしょうか? よろしくお願いします。 <html> <head> <script type="text/javascript"> <!-- i = true; function myFunc(hensu){ if(hensu){ alert("○"); } else{ alert("×"); } hensu = !hensu; } --> </script> </head> <body> <p onclick="myFunc(i)">[btn]</p> </body> </html>

  • javascriptで<object>タグのリンクを変えたいのですが

    <object>タグで指定したリンクをjavascriptで変えたいのですが・・・。 以下のように記述しているのですが上手くいきません。 <html> <head> <script langage="javascript"> function a(){ obj=document.getElementById("Link"); obj.getAttribute("data")=c.html; } </script> </head> <body onLoad="a()"> <object data="d.html" id="Link" width="700" height="500"></object> </body> </html> どなたかご教授宜しくお願いします。

  • グローバル変数とローカル変数について

    今JavaScriptを勉強している初心者です。 実は、ある本に書かれているソースコードでグローバル変数とローカル変数の違いがよく分からなくなりましてここに質問させて頂く次第です。 まずは、ソースコードを書きます。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title>変数のスコープ</title> <script type="text/javascript"> function testFunc(){ var num; num=5; } </script> </head> <body bgcolor="#FFFFFF"> <p style="font-size:200%"> <script type="text/javascript"> var num=3; testFunc(); document.write(num, "<br>") </script> </p> </body> </html> このままだとブラウザに表示されるのはグローバル変数「3」になるというのも今一分からないのですが。 この次に<head>部分の var num; をコメントにします。 すると、何故かローカル変数「5」がグローバル変数になり、<body>部分のtestFunc()メソッドの結果ブラウザに表示される値が「5」になるというものです。 var num; をコメントとする事はnumは変数宣言されていないことになります。 なのに num = 5; が成り立つのもよく分かりません。 そこでアドバイスを頂きたくここに書き込む事にしました。 是非とも宜しくお願い致します。

  • フォーカスする際のテキストフィールド名を変数で渡したい

    表のような入力フォームがあって、submitした際にあるプログラムが走り、HTML本体を再読み込みしています。 画面が表示されたときに、テキストフィールドにあらかじめフォーカスを合わせるには、以下のOnloadとfocus()を使いますよね? <body onLoad="document.Form.Field.focus()"> で、再読み込み時には、次の入力用テキストフィールドへフォーカスを合わせたいのですが、どうすればいいでしょうか? 例えば A1 A2 A3 というとき、A1を入力後、後ろでプログラムが走り、再読み込みして画面が再表示されたときに、A2にフォーカスがうつっている、という感じです。通常の書き方だとBodyにはひとつか(A1しか)かけないので・・・変数を使ったらどうかと思ってやってみましたがうまくいきません。 <SCRIPT LANGUAGE="JavaScript"> <!-- var f; f = "A1"; window.alert(f); //--> </SCRIPT> <body onLoad="document.Form.(f).focus()"> 又は <body onLoad="document.Form.var(f).focus()"> <body onLoad="document.Form.f.focus()"> フィールドにindextabをしてみましたがダメでした。又A1にonBlurが入っております。 そもそも変数なんて使えるのでしょうか? 変数以外の方法でも、他にアイディアがあればお願いします。 締切りが明日で非常にあせっています。 よろしくお願いいたします。

  • ASPからJavaScriptへの受け渡し方法は?

    ASPを利用し、WEB-APを作っている初心者です。サーバサイドのスクリプトはVBScriptを使っているのですが、クライアントブラウザの制御に関する部分は、職場のブラウザ環境がNetscapeCommunicator4.7なので、JaveScriptを使わざるを得ません。 私、JaveScriptが苦手で良く分からないのですが、サーバサイドでADO経由でDBから取得した値を、クライアントサイドで実行されるJaveScriptのコードの中に埋め込む方法はあるのでしょうか? 具体的には、次のコード中、 01 <SCRIPT LANGUAGE="JavaScript"> 02 <!-- 03 myMsg = "あああああ"; 04 myMsg = myMsg + myMsg; 05 myCnt = 0; 06 myChar = "1"; 07 myApp = myChar.length; 08 function myFunc(){ 09 document.notice.noticeMes.value = myMsg.substring( myCnt , myMsg.length ); 10 myCnt = ( myCnt == (myMsg.length/2)-myApp ) ? 0 : myCnt+myApp; 11 setTimeout( "myFunc()" , 200 ); } // --> </SCRIPT> 03行目のmyMsgという変数にサーバサイドで実行するVBScriptのコードから 動的に値を受け渡したいのです。 よろしくお願いします。

  • SSIをJavascriptの変数に割り当てる方法

    はじめまして!JavaScriptで質問があります。 JavaScriptで質問があります。 以下のようなwindowを生成し、HTMLを出力するJavaScriptコードをJSファイルとして登録し、 <script type="text/javascript" src="..."></script> で参照しています。 JSファイル内の[[ここに改行コード]]はSSIファイルを読み込んでいます。 SSIファイルの内容は改行コード、"(ダブルクォーテーション)を含んでいます。 この場合win.document.write(に続く'(シングルクォーテーション)で囲った文字列が改行してしまうので、 JavaScriptエラーとなってしまいます。 このエラーを解決できる手段はないでしょうか。 ↓JSファイル ---------------------------------- function windowOpen() { var win; win = window.open(); win.document.write('<html><head><title>title</title></head><body>[[ここに改行コード]]</body></html>'); } ---------------------------------- function内で以下のようにコメントを出力し、windowOpenの関数のコードを読み取ることができれば、 windowOpenCommentStart~windowOpenCommentEndまでの文字を切り取り、変数に代入することができる のですが、関数のコードを取得することなんてできませんよね。。 ---------------------------------- function windowOpen() { /* windowOpenCommentStart [[ここに改行コード]] windowOpenCommentEnd */ var win; win = window.open(); win.document.write('<html><head><title>title</title></head><body>' + [[ここに改行コードを変数化]] + '</body></html>'); } ---------------------------------- JSファイル内に[[ここに改行コード]]を出力することが条件ですが、 どんな方法でもよいので実現する方法はないでしょうか。 環境:WindowsXP ブラウザ:IE6,FireFox2

  • javascript 初心者です 関数について

    javascript 初心者です。 下記のスクリプトでmyFunc()の部分に引数をつかって、 function myFunc(arg){ document.arg.src = "pic_b.jpg"; } <p onclick="myFunc('stage')">Bに入れ替え</p> のようにしたいのですが、うまくいきません…。 正しいスクリプトを教えてください。 よろしくお願いします。 <html> <head> <script type="text/javascript"> <!-- function myFunc(){ document.stage.src = "pic_b.jpg"; } --> </script> </head> <body> <p onclick="myFunc()">Bに入れ替え</p> <img src="pic_a.jpg" name="stage"> </body> </html>

  • PHPの文字列変数をJavaScriptのalertで表示させたい

    <?php  $mes = 123; print<<<EOF  <script Language="JavaScript">  <!--   JavaScript:alert( $mes );  //-->  </script> EOF; ?> ↑のコードを実行すると123というメッセージボックスが表示されます。 <?php  $mes = "aaa"; print<<<EOF  <script Language="JavaScript">  <!--   JavaScript:alert( $mes );  //-->  </script> EOF; ?> しかしこのように数値変数でははく文字列変数を渡すと表示できません。 JavaScriptにPHPの文字列変数を受け渡すことはできるのでしょうか?

    • ベストアンサー
    • PHP