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));
}


VBScript

<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も中国から拾ってきました。


今回の問題はもしかしたらうちの環境固有かもしれません。
確認環境は以下とおり。

  1. Windows2003 ServerEE IE6.0 SP1
  2. WindowsXP Pro IE6.0 SP2


※ via JavaScriptDebugForIE Officeについてたのねw http://ido.nu/kuma/category/debug/