超今更だけど新たに教わった事を含めて覚え書きとしてメモ。
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がネイティブで動かない問題はこれで解決した。