[2010.09.20] chromeのバージョンアップにより、wmodeによってはpopupが開かなくなったり(参考記事)と、状況が変わってます。これは当時の記事なので現状と違う部分があります。すみません。
先日公開してみたURLOpener、ブラウザの挙動のあまりの違いに落としどころがわからなくなっていましたがまとまりました。
当初はJSでwindow.openを呼んだ時の動きに合わせる!と思っていましたが、別にそんな必要ないなと。
使う側になってみて考えて、とりあえずよく使う機能を楽に使えればいいや、と切り替えました。
ダウンロード
SparkProjectに初コミットしてみましたので、Sparkのリポジトリからエクスポートして下さい。
http://www.libspark.org/wiki/ikekou/URLOpener
またはzip
http://ikekou.jp/blog/wp-content/uploads/2009/11/URLOpener.zip
よくやること
僕が考えるよくやることを列挙すると、せいぜいこんなもの。
- target=_selfで開く
- target=_blankで開く
- target=_blank、サイズ指定で開く
- target=_blank、サイズ、位置指定で開く
- target=_blank、サイズ指定、位置は画面中央で開く
- target=_blank、フルスクリーンで開く
- alertでデバッグ
これらを楽にするということと、Safariでサイズ指定ある場合は先日発見した(つもりでいる)Safariでブロックを回避する方法を使って開くということ、その2点を目標としました。
できること
- window.openよりnavigateToURLのほうが実感としてレスポンスがいいので、オプション指定ない場合はnavigateToURL、オプション指定ある場合はwindow.openと呼び分け
- 今まであんまりできてなかったと思われる、ポップアップブロックON状態のSafariでの、Flashからのサイズ指定ポップアップを行う
できないこと
- もともとJSでできないことができるわけではない
- ブラウザによってはスクロールバーやらアドレスバーをオフと指定しても勝手に出る。それはどうしようもない
- Operaはブロック設定が何段階かあるが、JavascriptではブロックされないがFlashからだとブロックされる設定がある。その設定でFlashから開けるようにしたかったが、できなかった。
使い方
使い方はこんなかんじです。
import jp.ikekou.net.urlopener.URLOpener;
import jp.ikekou.net.urlopener.URLOpenerFeatures;
import jp.ikekou.net.urlopener.URLOpenerTarget;
//引数は以下の3つ
//1
//開くURL
//2
//Target window name、一応定数用意しましたが、普通に"_blank"とか"hogeWindow"とかでOK
//3
//window.openの第三引数と同じ。よく使うセットとして
//URLOpenerFeatures.FULLSCREEN メニューバーとか全部オフにしてフルスクリーン
//URLOpenerFeatures.DIALOG(width, height [, left, top]) メニューバーとか全部オフにしてサイズ指定の小窓、位置指定省略すると中央表示
//target=_self
URLOpener.open(url);
//target=_blank
URLOpener.open(url,URLOpenerTarget.BLANK);
//target=_blank、サイズ指定、位置指定省略すると中央
URLOpener.open(url,URLOpenerTarget.BLANK,URLOpenerFeatures.DIALOG(800,600));
//target=_blank、サイズ指定、位置指定nullにしても中央
URLOpener.open(url,URLOpenerTarget.BLANK,URLOpenerFeatures.DIALOG(800,600,null,100));
//target=_blank、サイズ指定、位置指定
URLOpener.open(url,URLOpenerTarget.BLANK,URLOpenerFeatures.DIALOG(800,600,100,100));
//target=_blank、フルスクリーン
URLOpener.open(url,URLOpenerTarget.BLANK,URLOpenerFeatures.FULLSCREEN);
//target=_blank、Featuresを自分で指定
URLOpener.open(url,URLOpenerTarget.BLANK,"width=800,height=600");
//alert出す
URLOpener.alert("hoge");
//alert出してるけど一時的にオフにして試したい
URLOpener.debugMode = false;
URLOpener.alert("fuga");
今後の予定
- windowモード(transparentとか)によって挙動が変わるらしいので、調べる。もしかしたら全然いらんことしてるかもしれない。
- console.log等のコンソールに出す関数を、クロスブラウザに一個の関数で出したい
- URLOpenerFeatures.DIALOGを使ったときに色々オフする記述を入れているが、それで十分なのか、もっといい記述はないのか、見直す
- バージョン表記ってどこにいれたらいいんだろうか!
- 優れたライブラリを優れたものとしているのは、ステキなドキュメントの力が大きい。ステキなドキュメント作ろう。どうせちっこいちっこいライブラリだし、そんくらいできるはず。

Comments
はじめまして 初心者なので初歩的な質問になってしまうのですが、 どうしてもFlash「fla」ファイルにあるボタンをクリックして、新しいウィンドウをサイズ指定で開きたいので ご指導お願いいたします。 以下の手順で間違っているところをご指摘ください。 1.URLOpenerフォルダを保存しする。 2.そのフォルダの中に、「fla」ファイルを作成 3.「fla」の中にシンボルでボタンを作成し、インスタンス名「btn_enter」とする 4.ASに以下の様に記述する stop(); import jp.ikekou.net.urlopener.URLOpener; import jp.ikekou.net.urlopener.URLOpenerFeatures; import jp.ikekou.net.urlopener.URLOpenerTarget; //target=_blank、サイズ指定、位置指定省略すると中央 URLOpener.open('http://google.com',URLOpenerTarget.BLANK,URLOpenerFeatures.DIALOG(800,600)); btn_enter.addEventListener(MouseEvent.CLICK, linkUrl1); function linkUrl1(evt:MouseEvent):void { } これで、パブリッシュすると、以下のエラーが出てしまいます URLOpener.as、行38 1047:パラメータ初期化子が不明か、コンパイル時定数ではありません。 5.パブリッシュ設定のFlashタブのスクリプトの設定ボタンで ステージのインスタンスを自動宣言のチェックをはずし、 ソースパス「./src」とする 6.以上のファイルとフォルダをサーバーにアップして、HTMLファイルをIEで見てみると、ボタンをクリックする前に ページが表示されると同時に、サイズ指定された新しいウィンドウも立ち上がってしまいます。 やはり、「4.」のASが間違っているのでしょうか? それとも、パブリッシュしたHTMLファイルにJavascriptを何か記述するのでしょうか? よろしくお願いいたします。
Commented by saya at 2010-05-14 14:01:28
コメントありがとうございます。 ご指摘頂いたコンパイルエラーですが、パブリッシュする環境によるようなので厳密には確認できていませんが、 とりいそぎ原因と思われる部分を対応したものをUPしました。 http://ikekou.jp/blog/wp-content/uploads/2009/11/URLOpener_100514.zip コンパイルエラーのほうはこれで出ないかと思います。(また出たらすみません 汗) 表示と同時にオープンしてしまうのは、 URLOpener.open(’http://google.com’,URLOpenerTarget.BLANK,URLOpenerFeatures.DIALOG(800,600)); btn_enter.addEventListener(MouseEvent.CLICK, linkUrl1); function linkUrl1(evt:MouseEvent):void { } の部分の問題ですね。 クリック時に開きたいので、 btn_enter.addEventListener(MouseEvent.CLICK, linkUrl1); function linkUrl1(evt:MouseEvent):void { URLOpener.open(’http://google.com’,URLOpenerTarget.BLANK,URLOpenerFeatures.DIALOG(800,600)); } とすることで、クリック時に動作させることができるかと思います。
Commented by ikekou at 2010-05-14 15:26:14