ActiveX が有効か? を js から調べる
このページは ie8 以下用の テストページです.
ActiveX が有効か? 調べるために以下のような script を使用していましたが、new ActiveXObject
の辺りで ie の設定によっては警告が出てしまうためよろしくないみたいです.(ie7 で遭遇)
ActiveX が使えなくても他の手段でユーザーのサポートは行える(はずな)ので、警告を表示しない方法で ActiveX が有効か? 取得したいところです.
<!--[if lt IE 9]>
<script type="text/javascript">
(function(){
var b = document.body || (function(){document.write('<body>');return document.body;})(),
x = (function(){
try {var t = new ActiveXObject('DXImageTransform.Microsoft.gradient');}catch(e){}
return 'pettanr-ActiveX-' +( t ? 'enabled' : 'disabled');
})();
if( !b.className.match(x)) b.className += ( b.className.length === 0 ? '' : ' ') +x;
})();
</script>
<![endif]-->
css の書き方を見直して ie については ActiveX のチェックが済むまで画像を読み込まないようにした.これにより domReady 前のチェックは取りやめ、domReady 後に行うことで十分になった.併せて ie 専用となるコードを html から減らせた.
ちなみに上記のコードは <body> の直下に書かれていて、domReady イベントすら待たずに、即座にActiveX の有無を調べて <body> にクラスをセットします.
基本的に スクリプトは html の最後の方に書いて、domReady イベント後に動作するようにしているので、これは異例です.
ActiveX が有効時・無効時で css 指定から読み込まれる画像が異なる場合に、不要な画像へのアクセスを避けるためにこのようなタイミングにしています.(でも実は未検証)
filter 指定による html 要素のサイズ変化を調べる
filter で影を追加した要素の offsetHeight が大きくなっている場合、ActiveX が有効になっている、といえる.
blue.style.filter = 'progid:DXImageTransform.Microsoft.Shadow()';
以上を元にした ActiveX チェック用のスクリプト
上記の理由のため以下のコードは ぺったんクライアントでは現在、使われていない.以下のコードを元にしたものが pettanr.ua.ACTIVEX で使われていて ActiveX が有効か? 判定を行っている.
<!--[if lt IE 9]>
<script type="text/javascript">
(function(){
var b = document.body || (function(){document.write('<body>');return document.body;})(),
c = b.className || '',
x = document.createElement('div');
b.appendChild(x);
x.style.cssText = 'width:1px;height:1px;line-height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';
b.className += [ c !== '' ? ' ' : c, 'pettanr-ActiveX-', x.offsetHeight > 1 ? 'enabled' : 'disabled'].join( '');
b.removeChild(x);
})();
</script>
<![endif]-->
付録
ActiveX が切られている場合の影響
ActiveX が切られている場合、 filter 指定による css3 相当のデザインが使えなくなるほかに、ActiveX オブジェクトとして提供される Flash が使えなくなる.これにより pettanR にとって重要な機能、画像の反転や ie6 以下への pngfix が難しくなる.
さらに、ie6 以下では ActiveX オブジェクトとして提供される XmlHttpRequest も使えなくなる.( この場合サーバとの通信手段は、動的に生成したフォーム部品によるもの などに限られてくる )
Silverlight や VML がどうなるか?は不勉強.(おそらく VML は ActiveX と無関係、Silverlight も同様なら Silverlight の重要度が少し上がる)
ActiveX が切られている場合、Silverlight や VML も使えなくなり かなり難しい状況になる.サーバーの画像変換機能の助けを借りてなんとか表示している状態になってしまう.
VBscript に使える機能ないかな??
【一応】js が有効だからといって ActiveX も有効とは限らない
ActiveX は js と同時に切られることが多いが、これは ie のデフォルトのセキュリティ設定のためで、ActiveX と js はそれぞれ独立して on / off ができる.
そのため js が有効だからといって ActiveX も有効とは限らない.
追記 2012/03/24
ie6 でうまく動かなかったため修正.ie6~8 のデフォルト設定が localhost では ActiveX が切になっているようで気付いた.
x.style.cssText = 'width:1px;height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';
↓
x.style.cssText = 'width:1px;height:1px;line-height:1px;filter:progid:DXImageTransform.Microsoft.Shadow()';