S2SJFがレンダリングした結果のHTMLをAjaxで取得する
id:mopemopeさんにご教授頂いた Kumu.AjaxでHTMLにアクセスする方法 でS2SJFがレンダリングした結果のHTMLを取得していたのですが、IEの場合うまくいかないようです。
自分はFirefox使いなので全然気づきませんでした。
原因はIEのActiveXObjectは、データがShift-JISの場合、うまく取得できないためです。(たぶんw)
JavaScriptをデバッグ(※)してみると、ajax.jsの195行目あたりでこけてます。
req.responseTextが空です。
if (self.HTTP_STATUS_OK == req.status) { if (self.DEBUG) self.debugPrint(req.responseText); if (self.RESPONSE_TYPE_JSON == ajaxComponent.responseType) { var resText = req.responseText; ajaxComponent.doAction(eval('(' + resText + ')')); } else if (self.RESPONSE_TYPE_XML == ajaxComponent.responseType) { var responseText = req.responseXML; ajaxComponent.doAction(responseText); } else { ajaxComponent.doAction(req.responseText); ← ここ !!! } } else { self.debugPrint("AjaxError! status["+req.status+"] message["+req.responseText+"]", true); }
ActiveXObjectのレスポンスをresponseTextで取得するのは、定石のはずなんだけど。なぜ?
ということで、暫定対応。responseTextから取得できない場合は、responseBodyから取得します。
responseBodyはバイトコードなんで、VBScriptでデコードをかけます。
暫定対応
try { ajaxComponent.doAction(req.responseText); } catch (e) { ajaxComponent.doAction(bytes2bstr(req.responseBody)); }
<SCRIPT LANGUAGE="VBSCRIPT" > function bytes2bstr(vin) strreturn = "" for i = 1 to lenb(vin) thischarcode = ascb(midb(vin,i,1)) if thischarcode < &h80 then strreturn = strreturn & chr(thischarcode) else nextcharcode = ascb(midb(vin,i+1,1)) strreturn = strreturn & chr(clng(thischarcode) * &h100 + cint(nextcharcode)) i = i + 1 end if next bytes2bstr = strreturn end function </SCRIPT>
responseBodyのことをgoogleで調べてたら、ひたすら中国のサイトに飛ばされましたw
VBScriptも中国から拾ってきました。
今回の問題はもしかしたらうちの環境固有かもしれません。
確認環境は以下とおり。
- Windows2003 ServerEE IE6.0 SP1
- WindowsXP Pro IE6.0 SP2
※ via JavaScriptDebugForIE Officeについてたのねw http://ido.nu/kuma/category/debug/