■Windows XP SP2 (Service Pack2)でのJavaScriptの動作に関して

Last update : 2004/11/7 PM 11:54

 Windows XP SP2(以後SP2と略)では、様々なセキュリティ面での変更があります。もちろんJavaScriptも例外ではなく、従来ブラウザクラッシュ(ブラクラと略され表記される事が多い)を引き起こしていたサブウィンドウを延々と生成したり、サブウィンドウを閉じる事ができなかったりするなどの処理が利用者の許可なしにはできなくなっています。
 SP2とJavaScriptに関してはマイクロソフト社のページに記述があります。

http://www.microsoft.com/japan/msdn/windows/windowsxp/xpsp2websites.asp#xpsp2webs_topic5

 2004年11月7日現在、このサイトにアクセスしてくるユーザーでWindows XP SP2の割合は、だいたい1/3くらいのユーザー数になっています。以下のページで、リアルタイムにアクセス状況を見る事が出来ます。Windowsのバージョンの部分でSP2の割合をチェックすると良いでしょう。

リアルタイムアクセス情報(統計)

■サブウィンドウに関する動作

 私のサイトにあるJavaScript例文辞典なども例外ではなく従来とは違う動作になるものが多数あります。例えば複数のサブウィンドウをまとめて開く、という例文のサンプルスクリプトを実行すると以下のようなセキュリティ警告が表示されます。(クリックすると拡大表示されます)



OKボタンを押しても、サブウィンドウは開かれません。サブウィンドウを開くためにはウィンドウ上部にある情報バーをクリックします。すると以下のような表示になります。(クリックすると拡大表示されます)



ここでサブウィンドウを開くには、ユーザーにポップアップを一時的に許可の項目を選択してもらうか、このサイトでのポップアップを常に許可するように設定してもらう必要があります。

サブウィンドウが複数でなく一枚であっても同様の警告が表示されます。また、ブラウザ上の「戻る」「進む」ボタンをクリックしてもページが表示されるたびに毎回警告が表示されます。対象となるのはサブウィンドウだけでなく、モーダルダイアログ、モードレスダイアログを表示するshowModalDialog、showModelessDialogもブロックの対象となるため、実行すると同様の警告が表示されます。ただし、alert()、confirm()、prompt()は対象外で従来通り利用することができます。あと、createPopup()に関してはセキュリティ警告は表示されません。無理矢理やるならばSP2ではcreatePopup()を使ってサブウィンドウの代用(広告。後述)、それ以外のブラウザでは従来どおりにサブウィンドウで表示するというのは可能です。

Webサイトを制作する側としては、従来使用されていたサブウィンドウによるポップアップ広告やサブウィンドウにメニューを表示させ親ウィンドウを操作する手法は使えないと考えた方が良いでしょう。特に不特定多数を相手にするサイトのような場合にはサブウィンドウ関連を使うのは無理です。今までサブウィンドウを利用して作成されているページはサブウィンドウを利用しないものに書き換える必要があります。

使えるものと使えないのをまとめると以下のようになります(スクリプトで自動的に処理する場合)。

○alert
○confirm
○prompt
○createPopup
○showBrowserUI
○document.execCommand("SaveAs")
△window.open
×showModalDialog
×showModelessDialog


 スクリプトで自動的にサブウィンドウを開くのではなく、以下のようにaタグでターゲットウィンドウを指定した場合にはセキュリティの警告は出ません。ユーザーがクリックして開く場合には問題がない=セキュリティブロックはしないということになります。

<a href="sub.html" target="sbwin">サブウィンドウで開く</a>

■サブウィンドウのパラメータに関する動作

サブウィンドウを開く場合に指定できるオプションの1つにフルスクリーン表示モードがあります。fullscreen=yesを指定するとタスクバーなどが消えフルスクリーンモードになります。しかし、このオプションを指定した場合の表示がSP2では異なっています。SP2以前ではフルスクリーンモードでしたが、SP2ではフルスクリーンモードに近い状態になります。ウィンドウのメニューやタイトルバーなどは表示され完全なフルスクリーンにはなりません。フルスクリーンモードを使ってプレゼンテーションを行う、映像を見せているような場合にはSP2を導入しないか、作り直す必要があります。以下にJavaScript Tips & Tricksのフルスクリーンモードのサンプルの表示結果を示します。(クリックすると拡大表示されます)

【Windows XP SP2以前】


【Windows XP SP2】



■createPopup()について

 createPopup()を使うとスクリーン上に任意の位置に文字や画像などのデータを表示させることができます。createPopup()はウィンドウ外にも表示させることができますが、ポップアップは同時に1つしか作成し表示することができません。また、createPopup()で作成、表示された領域以外をクリックすると消えて見えなくなります。Windows XP SP2 (Professional)で動作テストしたところ、createPopup()に関してはネットワーク上ではセキュリティ警告は出ませんが、ローカル上で実行した場合には警告(Active X)が表示されます。
 createPopup()を使って別ファイルをインラインフレームで表示するということも駄目なようです。(下記スクリプト。妙な点があったらメールをいただければ助かります)

【サンプルコード】→実行する

<html>
<head>
<title>ポップアップ広告</title>
</head>
<body>
ポップアップ広告<br>
<script language="JavaScript"><!--
flag = 0;
popup = window.createPopup();
popup.document.body.style.backgroundColor = "yellow";
popup.document.body.innerHTML = '■Web広告<br><iframe src="sub.html" width="180" height="100"></iframe><hr>';
popup.show(100, 60, 200, 225, document.body);
// --></script>
</body>
</html>


 createPopup()を使って、文字や画像を表示するには別ファイルでなく、ちゃんとファイル内に書かないと駄目なようです。

【サンプルコード】→実行する

<html>
<head>
<title>ポップアップを1つ作成する</title>
<script language="JavaScript"><!--
flag = 0;
var popup = window.createPopup();
function openPP()
{
popup.document.body.style.backgroundColor = "yellow";
popup.document.body.innerHTML = "■Web広告<br> 宣伝広告です。";
popup.show(100, 60, 200, 225, document.body);
}
// --></script>
</head>
<body onLoad="openPP();">
ポップアップを1つ作成する<br>
</body>
</html>


■強制クリックと異なるドメイン間での動作

 Windows版Internet Explorer 5.5以降にはイベントをオブジェクトに送信するfireEvent命令があります。これを使うとフォームにあるボタンを自動的にクリックさせるといった事が可能です。これ以外にも同様の命令があります。では、このような自動的にクリックした事にするものを利用した場合は、どうなるでしょうか。以下がサンプルです。

【サンプルコード】→実行する
<html>
<head>
<title>Open Sub Window</title>
<script language="JavaScript"><!--
function subwin()
{
window.open("http://www.google.co.jp/","GL");
}
// --></script>
</head>
<body onLoad="document.testForm.testBtn.fireEvent('onclick')">
<a href="javascript:subwin()" >Open Sub Window</a><br>
<form name="testForm">
<input type="button" name="testBtn" value="test" onClick="subwin()">
</form>
</body>
</html>

 ここでは入力フォームのボタンをページが読み込まれたらクリックするようにしました。実行結果は以下のようになりました。(クリックすると拡大表示されます)



やはり、ブロックされてしまいサブウィンドウは開かれません。


サブウィンドウを開くかどうか、開けるかどうかはユーザーが許可しないといけませんが、一旦許可してしまえば許可されたサイトのサブウィンドウを別サイトのページからインラインフレームを使って開くことができます。実際のコードは以下のようになります。(URLにあるサンプルはfireEventを使って自動クリックするようになっています。)

【サンプルコード】(www.openspc2.orgが許可されている場合)
<html>
<head>
<title>iframe and sub window</title>
</head>
<body>
<iframe src="http://www.openspc2.org/JavaScript/WinXPsp2/code2.html">TEST</iframe>
</body>
</html>

 こうなると、どこかにサブウィンドウを開くサイトを用意しユーザーを、誘導して設定させてしまえば他サイトから自由にサブウィンドウを開く事ができます。こうなるとサブウィンドウは開きたい放題という事になります。


■VBScriptとの連携(Flash関連)

 Windows版JavaScript (JScript) はVBScriptを呼び出して利用する事ができます。しかし、SP2では動作しなくなっているようです。(クリックすると拡大表示されます)

【SP2以前】


【SP2】



 JavaScriptからVBScriptを呼び出すことは少ないでしょう。ただし、FlashムービーからJavaScriptを利用している場合には、このような方法を使います。このため、従来はFlashムービーからブラウザを操作したりすることができましたが、SP2ではできないようになっています。動作しなくなりましたが、これによってエラーが表示されることもありません。もし、この機能を利用しているのであればSP2は対象外として制作するか、SP2も考慮してこのような手法は取らないようにする必要があります。実際のサンプルのページも用意してあります。以下の結果画面はFlash Plugin ver 7を利用しています。(クリックすると拡大表示されます)

【SP2以前】


【SP2】



■ローカル上での動作

 SP2ではローカルにファイルがあり<script>タグが含まれている場合にセキュリティの警告が出ることがあります。例えば以下のサンプルではセキュリティ警告が表示されます。ローカルでなくインターネット上では警告は出ません。createPopup()などもインターネット上では警告は出ませんが、ローカルでは警告が表示されます。

<html>
<head>
<title>document.write()テスト</title>
</head>
<body>
<h1>document.write()テスト</h1>
<br>
<script language="JavaScript"><!--
document.write("Sample");
// --></script>
<br>
</body>
</html>



■Windows XP SP2の判別

 JavaScriptを使ってWindows XP SP2かどうかを調べることができます。マイクロソフト社のページにも載っていますが、ユーザーエージェントの文字列内にSV1があればSP2という事みたいです。判別プログラムに関してはJavaScript例文辞典の■ブラウザ編の17番に用意してあります。


■Windows XP SP2関連リンク

 http://www.microsoft.com/japan/msdn/windows/windowsxp/xpsp2web.asp
 http://www.microsoft.com/japan/msdn/windows/windowsxp/xpsp2websites.asp#xpsp2webs_topic5
 http://pcweb.mycom.co.jp/special/2004/winxpsp2/006.html