[js][ruby] jQueryの挙動を調べた
js書くのが久々すぎて完全に忘れてたので、コード汚いけど気にしない。
HTTP Status 2xx系なのにjQueryがエラー扱いするような現象を見かけたので検証してみた。
結論としては1.6.3だと204, 205はエラー扱い。.failでも error : でも同様。
1.7.2なら2xx系は全部成功扱いになってた。バージョンに注意。
少し気になるのがerror扱いになってるはずなのに errorparsererror となっているところ。エラー扱いのコードではパース処理をかけてないはずなのだが...?
xmlが帰ってくることを期待しているので、レスポンスコード2xx系だとパースしようとするも、レスポンスボディはno contentなのでパースに失敗、エラーとして処理、という流れだろうか。
1.7.2では、そこら辺を考えず、2xx系のレスポンスコードが帰ってくれば成功扱い、となっている気がする。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Demo</title>
<script src="jquery-1.6.3.min.js"></script>
<!-- <script src="jquery-1.7.2.min.js"></script> -->
<script>
baseurl = "http://localhost:4567/res/";
$('document').ready(function(){
$('#run').click(function(event){
var codelist = new Array(200, 201, 202, 203, 204, 205, 206, 400, 401, 402, 403, 404, 405, 406);
for(var i = 0; i < codelist.length; i++){
$('#result').append("req:" + baseurl + codelist[i] + "<br/>");
var jqxhr = $.ajax({
url : baseurl + codelist[i],
dataType : "xml",
async : false,
success : function(msg){
$('#result').append("success" + new XMLSerializer().serializeToString(msg) + "<br/>");
},
error : function(xmlhttpreq, msg){
$('#result').append("error" + msg + "<br/>");
}
});
// .fail(function() { $('#result').append("error" + "<br/>"); });
}
});
});
</script>
</head>
<body>
<p>jQueryのレスポンスコードとAjaxのエラー処理の検証コード</p>
<p>1.6.3だと204, 205はエラー扱い。.failでも error : でも同様</p>
<input type="button" id="run" value="RUN"/>
<div id="result"></div>
</body>
</html>サーバの方はRubyでsinatra使ってさっくりと。(最初知らなくてWEBrickでごりごり書いてたのは秘密)
require 'sinatra' require 'rubygems' get '/res/:code' do status params[:code] headers \ 'Content-Type' => 'application/xml' body "<code>#{params[:code]}</code>" end
実行結果
req:http://localhost:4567/res/200 success200 req:http://localhost:4567/res/201 success201 req:http://localhost:4567/res/202 success202 req:http://localhost:4567/res/203 success203 req:http://localhost:4567/res/204 errorparsererror req:http://localhost:4567/res/205 errorparsererror req:http://localhost:4567/res/206 success206 req:http://localhost:4567/res/400 errorerror req:http://localhost:4567/res/401 errorerror req:http://localhost:4567/res/402 errorerror req:http://localhost:4567/res/403 errorerror req:http://localhost:4567/res/404 errorerror req:http://localhost:4567/res/405 errorerror req:http://localhost:4567/res/406 errorerror