2011-07-10

WSH: jQuery 1.6.2を使用する

WSHはJScriptが使えるのでjQueryも使用できないかと思って調べていて、HIRACCHI H.D.さんの「fenrirで気温を確認する」という記事を見つけました。記事中にWSHでのjQueryの動かし方が書かれていたので感謝しつつ現時点で一番新しいjQuery 1.6.2で動かそうとしたんですが、エラーが出て動かなかったので動くように修正してみました。


何故動かなかったのかをコード内にコメントとして残したかったんですが見辛いのでここに書き記します。行数はjQuery 1.6.2のdevelopment (minifyされていないもの)のコードのものです。

1. documentElementの設定
4639行目、Sizzle.uniqueSort()で使用するsortOrderを定義する際のコードの一部が if ( document.documentElement.compareDocumentPosition ) となっていて、document.documentElementがnullだとエラーになるのでダミーHTMLを書き込んでdocument.documentElementを設定します。

2. ActiveXObjectの設定
7786行目、ActiveXObjectがある場合のXMLHttpRequestの作成コードが new window.ActiveXObject( "Microsoft.XMLHTTP" ) となっているので、XMLHttpRequestを生成できるようにwindow.ActiveXObjectには空オブジェクトではなくActiveXObjectを代入します。

3. setTimeout()の定義
939行目、doScrollCheck()の定義中にsetTimeout()が使用されていますがWSHにはsetTimeout()がないためsetTimeoutを定義します。ただし素直にvar setTimeout = window.setTimeout;とすると「書き込みできません」というエラーが出るため関数式でラップします。

4. jQuery.support.corsの修正
7818行目、jQuery.ajaxTransport内のクロスドメインリクエストが出来るかのチェックがif ( !s.crossDomain || jQuery.support.cors ) となっていて、クロスドメイン通信と見なされている状態(※1)でCORS(Cross Orign Resource Sharing)が有効でない(※2)場合jQuery.ajax()が"No Transport"エラーになるため、jQuery.support.corsを手動で有効(true)にします。

※1: location.hrefとjQuery.ajaxで渡されるurlの同一生成元チェックによる(7227行目)
※2: 生成したXMLHttpRequestオブジェクトにXMLHttpRequest level2のwithCredentialsがあるかどうかの判定による(7809行目)

5. セレクタの変更
Googleの構造が変わっているのでセレクタを変更します。

以上です。

jQuery.support.corsのところだけはjQuery.supportが定義されてからでないと修正できないですが、setInterval()等を使ってjQuery.supportが定義された瞬間にcorsをtrueに修正する形にすれば、修正コードを1つのファイルとしてまとめて、jQueryを読み込む前に読み込ませることができるのかなと思います。