WSHでdocumentオブジェクト

超今更だけど新たに教わった事を含めて覚え書きとしてメモ。

var document= new ActiveXObject("htmlfile");
document.write(content);
var window = document.parentWindow;

これでdocumentオブジェクトとwindowオブジェクトを作ることが出来る。ここでcontentはHTMLのtext。つまりIEプロセスを立ち上げることなくHTMLをパース出来る訳だ。ただしcontentを食わせる時はscriptタグを削除しといた方が良い。innerHTMLに直接タグを食わせる等、scriptタグ内にタグが書かれているとパースエラーを起こす。

なんとかquerySelectorが使いたい

document.querySelector(css);

querySelectorを使おうとするとエラーが返る。そんなメソッドないそうな。これは一体どういう事だろうか。いくら調べてもいまいち分からないので2chで聞いてみた。するとこんな答えが返ってきた。
お前ら、wsh使ってますか? Part8の672

new ActiveXObject("htmlfile")で得られるTridentエンジンそれ自体がMSIE7系統のものなんじゃないの?
アプリケーションとしてインストールされているIEと、コンポーネントとして動くIEは別だったりもする。
document.parentWindow.navigator.userAgentを見ればIE7の互換モードらしいことが分かる。
IE7ないしその互換状態のIEコンポーネントではquerySelectorは実装されて無いはず。
metaタグでIE=edgeを食わせるのに成功しててもその場合取得したdocumentとwindowは別物になるんじゃないかと。
そのうえwindow.location.hrefを書き換えてもdocumentはそのまま参照できる状態が続いてしまう。

オブジェクト作る時点で互換モードじゃないオブジェクト作る方法があれば出来そうな気がするけどよく分からん。

え?これってIEコンポーネントをキックしてるんじゃないの?レジストリを見てみるとこうなってる。まず該当部分のキーはここ
HKEY_CLASSES_ROOT\CLSID\{25336920-03F9-11CF-8FD0-00AA00686F13}
そのサブキーInprocServer32には
C:\Windows\System32\mshtml.dll
Microsoft.mshtml, Version=7.0.3300.0
とある。つまりmshtml.dllのVerが7.0.3300.0という事なんでしょうな。それでmshtml.dllとはなんだ。TridentによるとIEレンダリングエンジンの事でVerからそれはIE7相当の物と分かる。おー2chで教わった事はやっぱり正しかった訳だ。querySelectorがネイティブで動かない問題はこれで解決した。

じゃあjQueryで代用しよう

contentに予めscriptタグでjQueryを食わせて置けばいいはず。しかしこれもエラーが返る。jQuery2.xはレガシーIEをサポート外にしてるからか、と思いきやjQuery1.xも動かない。まあ無理矢理動かしてるんだから当然と言えば当然か。

<meta http-equiv="X-UA-Compatible" content="IE=edge">

これをcontentのheadに追加してやれば一応動くようになる。が、細かく検証すると動作はきっと怪しいだろう。querySelectorが動けば今のところ満足なのでこれでよしとする。