- 締切済み
JavaScriptで可能でしょうか?
キー操作がメインのFlashアプリを作っています。 ブラウザで表示した際には、Flash以外何も置いていません。 アプリ実行中に、他に開いているウインドウをアクティブにし、再度Flashのブラウザをアクティブにすると、そのままではキー操作ができません。Flashの画面のどこかをクリックすればキー操作できるようになるのですが、知らない人だとフリーズしたと勘違いしそうなので、できればFlashのウインドウがアクティブになったら、Flashにフォーカスをセットするようなことをして、クリックしたのと同じ状態を作り出し、何もしなくてもキー操作ができるようにしたいのですが、JavaScriptを使ってこういうことをするのは可能でしょうか? どなたかお分かりになる方がいらっしゃいましたらよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
Flashゲームではよくある話だと思います。 試したわけではないですが、これでどうでしょうか。 <script> function setFocus(){ var obj=document.getElementById('flashobject')||document.getElementById('flashembed'); if(!!obj){ obj.focus(); } } window.onfocus=setFocus; //以下 余計なお世話 window.onload=function(){ var obj=document.getElementById('flashobject')||document.getElementById('flashembed'); if(!!obj){ obj.onblur=setFocus; } } </script> <object id="flashobject"> <param 略> <embed id="flashembed" 略> </object> <p>ゲーム開始後にここをクリック。<br> ”余計なお世話”があるとゲームを続けられるかも知れない。<br> ”余計なお世話”の弊害は不明</p>
- cmc32000
- ベストアンサー率41% (103/251)
cmc32000です。 document.write(" で書き出すのは、<object>から</object>まですべてです。"で挟むので<object以降の"は'に書き換えます。 ANb2さんの回答にあるように、セキュリティのためにflashの機能を制限しているので、このようにしないと動かなくなりました。 こうしなくても、「アクティブにするならクリックしてください」が表示され、もう一度クリックすれば動くようになりますが、分かりにくいですね。
お礼
ご回答ありがとうございました。 外部ファイルの関数からobjectを書き出すというのはおかげさまでうまくいきました。しかし、私が知りたいこととは若干違っております。ANo.2のお礼の欄に再度詳しく状況を書かせていただきました。もしよろしければご一読いただき、何かお分かりになるようでしたらお教えいただけますと幸いです。 よろしくお願いします。
- MAN_MA_RUI
- ベストアンサー率41% (426/1024)
> 私がやりたいことは、表示したい訳ではないのですが、タイミングとしては、一旦非アクティブになったFlashのブラウザが再度アクティブになった時です。そもそもブラウザがアクティブになった際というのは、何かイベントは発生するものなのでしょうか? Flashのブラウザって言うからしばらく考えました。Flashの場合ブラウザとは言いませんよ? Flash Playerを使って操作を行う部分だからコントロールと表現したり、Flash Playerの機能を埋め込んでるからオブジェクト表現したりとかそういう感じ(大雑把に言っての話) あと非アクティブとアクティブの意味を取り違えているようにもそうでないようにも見えます。 確認のためなので気を悪くしないでほしいですが、クリックして枠の表示されなくなった状態がアクティブ、枠の表示される常態が非アクティブです。 で、このアクティブ状態はページを表示している間だけ保持される仕組みとなっており、ページを一度移動すると再び非アクティブ状態となるため再度のアクティブ化が必要です。 最初からコントロールをアクティブ状態にし、いちいちクリックせずともいいようにするためにはコントロールを表示するため(埋め込むため)のタグ、embedなりobjectなりparamなり全てを外部JavaScriptファイルへ追いやる必要があります。 どんな方法でもいいから外部JavaScriptからタグを吐き出させるようにすれば問答無用でアクティブ状態となり、クリックしろと言うメッセージが出る非アクティブ状態にはなりません。 ちなみにこの原因はセキュリティ対策、とのことらしい。
お礼
ご回答ありがとうございました。 私の表現が適切でなかったせいで、私がやりたいことが伝わっていないようですので、再度詳しくご説明させていただきます。 ちなみに、Flashオブジェクトのタグを外部JavaScriptファイルから書くことで、オブジェクトを最初からアクティブ状態にするというのはうまくできました。 しかし私がどうにかしたいと思っているのは、最初からオブジェクトをアクティブ状態にすることではありません。 私の作ったFlashアプリは、起動時にタイトル画面が表示され、そこからメニュー画面に進み、さらにそこからメインの画面に進みます。このメインの画面では、主な操作をキー入力で行います。 それで例えば、メイン画面で操作を行っている途中で、Flashオブジェクトを表示しているブラウザをそのままにして、メーラーを前面に表示してメールを確認し、終わったら再度Flashオブジェクトを表示しているブラウザを前面に表示します。そこで続きの操作を行おうとして何かキーを押したとしてもFlashオブジェクトは何の反応も示しません。見た目はアクティブ状態と同じなのに、もう1度Flashオブジェクトをクリックしないとアクティブ状態になりません。起動時であれば、枠線とクリックしてください、のメッセージが表示されるためクリックが必要であることは分かりますが、この場合はアクティブ状態と同じであるため非アクティブ状態になっていることが分からず、フリーズしてしまったと勘違いしてしまうかもしれません。 ですので、このような場合に再度クリックをしなくても続けてキー操作をできるようにJavaScriptを使ってオブジェクトをアクティブ状態にしたいと考えています。 まとめますと、私が知りたいのは、Flashオブジェクトを最初からアクティブ状態で表示する方法ではなくて、すでに表示されている、枠線が無い非アクティブ状態のFlashオブジェクトを、クリック以外の方法でアクティブにする方法およびそのScriptを実行するタイミングです。 長ったらしい文章で誠に恐縮ですが、お分かりになるようでしたらお教えいただけますと幸いです。よろしくお願いします。
- cmc32000
- ベストアンサー率41% (103/251)
先ず、javascriptで関数を作ります。 function RunSWF(){ document.write(" ここにflashのembetコマンドなどを書く ")} これを、htmlの外に外部ファイル.jsとして書き出し、さらにhtmlのヘッダーの中に <SCRIPT language=JavaScript src="外部ファイル.js"></SCRIPT> のように書き、 表示したいところで、 <script language="JavaScript" type="text/javascript">RunSWF();</script> のように関数を実行するスクリプトを書きます。 要するに、htmlの中にembetタグを書かないようにします。
お礼
早速のご回答ありがとうございました。 私JavaScriptやHTMLに関してはほとんど素人でして、せっかくのご回答なのですが、分からない部分が多々ございます。 誠に恐縮ですが、追加で質問させていただきますので、ご面倒でなければお教えいただけますと幸いです。 1.ご回答の中に、「表示したいところで」とありましたが、私がやりたいことは、表示したい訳ではないのですが、タイミングとしては、一旦非アクティブになったFlashのブラウザが再度アクティブになった時です。そもそもブラウザがアクティブになった際というのは、何かイベントは発生するものなのでしょうか? 2.Flashでパブリッシュして作成されたhtmlファイルでは、Flashに関する記述は概略次のようになっています。 <object classid="XXX" codebase="http://XXX" width="800" height="600" id="xxx" align="middle"> <param name="allowScriptAccess" value="sameDomain" /> <param name="movie" value="xxx.swf" /><embed src="xxx.swf" /> </object> この内、どこまでをRunSWF()関数の中で書けばいいのでしょうか?embedタグの部分だけでいいのですか? よろしくお願いします。
お礼
ご回答ありがとうございました。 いただきましたアドバイスを参考に、色々試してみたのですが、どうやってもうまくいきませんでした。 調べた結果分かったのですが、Flashオブジェクトがアクティブな状態で、他のウインドウを前面に表示し、再度Flashオブジェクトのブラウザウインドウを前面に表示しても、window.onfocusイベントは発生しませんでした。ウインドウ内のどこかをクリックした時に初めてイベントが発生しました。ちなみにFlashオブジェクトのステージ外の何も無い所をクリックした状態(Flashオブジェクトは非アクティブ状態)からであれば、同様の操作でonfocusイベントは発生しました。ただしこの場合でも、「obj.focus();」を実行しているにも関わらずFlashオブジェクトがアクティブになることはありませんでした。 まだ他に方法が考えられるようでしたら、また教えていただけますと幸いです。よろしくお願いします。