押すとActionScriptで新しいウィンドウを指定サイズで開くflashボタンをhtml上に置しクリックした後、同じドキュメント内のimgでのbackボタンjavascript:history.go(-1)が機能しなくなりました。このflashボタンではなく通常の画像ボタンに差し替えるとbackボタンも通常通り機能します。またflashボタンをクリックしなければ、通常通りbackボタンは機能します。
この2つのJavaScriptの両方が機能する方法を教えてください。
・flashボタンのActionScript内での記述は
on (release) {
getURL("javascript:newWindow()");
}
・html内での記述は
function newWindow(url,name,options) {
window.open('test.html','color','scrollbars=yes,width=500,height=400');
}
・flash ver.8使用
記述の仕方が間違っているのでしょうか?
宜しくお願いします。
この質問に関してましては、別のサイトに実行例を含めたものをアップしましたのでご覧ください。なお、本来ならばこのURL内ですべての回答をすませるべきですが、はてなの仕様上Javascriptが使えませんので、便宜的にこのようにさせて頂きました。
私の試した環境がFirefoxで、かつTab Mix Plusを導入した環境であったため、おっしゃる現象が起こらなかったようです。IEで確認したところ、確かにそういった現象に遭遇しました。なお、以下のブラウザでの状況も確認しました。
NetscapeNavigator7
Opera9
いずれも問題なく機能しました。つまりこれは、またしてもIEの独自仕様です。IEハックを行わなければなりません(私の環境はWinです。Macはどう逆立ちしても調べられませんので、あらかじめご容赦を)。
方法01:
<!--[if lt IE 7]>
<script type="text/javascript" language="javascript">
Javascriptの内容
</script>
<![endif]-->
こうすると、<!--[if lt IE 7]>の部分がIE系列以外は反応しなくなり、かつ、IE7以前のブラウザのみに適用されるようになります。具体的には、前回の回答で参照URLに挙げた(http://q.hatena.ne.jp/1156325183)SWFObjectを使い、まず、あらかじめFlashをJavascriptで描画します。
var so = new SWFObject("hatena500overLink.swf", "hoLink", "300", "200", "8", "#FFFFFF");
so.write("flashmenu");
そして、<!--[if lt IE 7]>を使って、IE6以下のバージョンにのみ反応するスクリプトを組みます。
<!--[if lt IE 7]>
var so = new SWFObject("hatena500overLink.swf", "hoLink", "300", "200", "100", "#FFFFFF");
so.write("flashmenu");
<![endif]-->
赤字で書かれたところに注目してください。ここはFlashバージョンを表す場所ですが、Flashバージョンは現行9までしかありませんので、100を指定した場合は当然エラーが出ます。すると、エラーとなった場所には何も描画されず、Flashの下に用意してあったDHTMLイメージボタンが顔をだす、というわけです。なぜわざわざスクリプトを書き直しているのか疑問に思うかもしれませんが、IE判定の部分で最初のスクリプトを上書きする必要性があるからです(Javascript自体のif else文のようには動作しない)。
しかし、これは複雑な上マニアックですね(前回のソースもかなりの量ですし)。書いてる私自身が混乱し始めています。そんなわけで、これとは別に、ユーザーエージェントを判別する方法はいかがでしょう。
方法02:
『ユーザエージェントからブラウザの種類やバージョンを判断する』
http://codezine.jp/a/article.aspx?aid=342
『userAgent一覧』
http://www.openspc2.org/userAgent/
上記URL先の方法とIF文を組み合わせ、『××ブラウザであるらならば、真 またはelse』とする判定を作り、判定が真ならばdocument.writeでobjectタグを(またはSWFObjectライブラリの関数を使って)描画。そうでないならば・・・・・・といった風に繰り返します。結果的にすべて偽であった場合は、元々その場所に用意されていたイメージボタンのみが表示され、Flashはその上には表示されません。正直申し上げますと、ユーザーエージェント判別関連はかなり専門外ですので、説明が荒いのはご容赦ください(Ajax関連の処理は普段からライブラリに頼りっきりなのが災いしました・・・・・・)。
方法03(というよりは、むしろ可能性):
もう一つの原因も考えました。ボタンを押した時点で、ナビゲーションがFlashの制御に移ってしまっている可能性があります。この場合、いくらDHTMLがアクティブであっても実際の命令はFlash側に渡されたままですので、FlashからWindowオープン後、再び何らかの変数と引数をDHTMLへと渡し、DHTML側のJavascriptに制御を戻さなくてはならないかもしれません。これは全くの推論の域をでず、また、私自身もFlashからDHTMLに変数を渡す、などという高度な技を実行したことがありません。ですので、これについては言及に留めるだけとします。
※今回は代用方法に終始してしまい、申し訳ありません。ずばりの答えにはなっていませんので、ポイントは低めでも文句は言いません。
詳しい説明有難うございます。
やはり、アップして頂いた実行例も、flashによるオープンウィンドウによるボタンのクリックの次にバックボタンを押すと、ページが戻りません。
最後にあげていただいた3つの問題点をもう少し考えてみます。
また自分は、バックボタンは
<a href="javascript:history.go(-1)"><img src="img/back.gif" width="35" height="25" border="0"></a>で記述しています。
やはり他の人にこの実行例を試してもらいましたが、flashボタンのクリック後はバックボタンが効かなくなりました。
win2000IEとwinXPは駄目で、macIEのひとはバックが成功しました。
特にポップアップブロックはしていませんでした。