その辺が原因で jQuery で Ajax を使おうとすると Opera Mobile でコケるのだが、元々 Opera Mobile 自体が jQuery でサポート対象外のせいかオフィシャルではここの生成処理が修正されないらしい。
で、jQuery は $.ajaxSetup() で XMLHttpRequest オブジェクト生成処理を上書きしたりできるようになっているので、そこを各自摩り替えて使ってね、という話らしい。
$(function(){
$.ajaxSetup({
xhr:function(){
return window.ActiveXObject && !jQuery.browser.opera ?
new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
}
})
});
元々の処理に !jQuery.browser.opera を追加して opera の時は常に new XMLHttpRequest() を使うようにしたコードだけど、これで問題なく動くようになった(参照元)。
ただし jQuery 1.3 以降 jQuery.browser が Deprecated になっているので、これが本当に望ましい処理かというと結構微妙で、XMLHttpRequest の有無で判断するようなコードの方が今後はいいのかもしれない、と思ってこんなコードを書いてみた。
$(function(){
$.ajaxSetup({
xhr:function(){
return typeof XMLHttpRequest != 'undefined' ?
new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
})
});
動作確認:
IE6
Firefox(1.0.8, 1.5.0.10, 2.0.0.20, 3.0.10)
Chrome(1.0.154.65, 2.0.172.30)
Opera9.6
Safari(Win/OSX共に3.2.1)
Opera Mobile 9.5 for WILLCOM03
Konqueror 3.5.8
本来のサポート環境以外も手元にあるもので色々と試してみたが、この部分のコードだけに限っていえば以上の環境で上手く動いている模様。
日本語でこの辺の話が見当たらなかったので一応書いておいた。