やりたかったこと:
ページ上部にフィルタリングオプションを配置し、サブミットしたときにページ下部を含めたページの一部を更新
なお、フィルタリングに使用した値は保存しておきたかったので、フィルタリング部も合わせてAjaxで書き換え。
はまったこと:
FirebugとかChromeのコンソールでエラーとだけ書かれた内容がリターンされる。
元コード
client.js
$('#search').click(function() {
var $form = $('#form-search');
var data = $form.serializeArray();
submit_action('search', data, 'getdata');
});
$("#data-container").on('click', 'button#search', function() {
var $form = $('#form-search');
var data = $form.serializeArray();
submit_action('search', data, 'getdata');
return false;
});
common.js
function submit_action(url, input_data, mode) {
$.ajax({
type : 'POST',
url : url,
data : input_data,
dataType : 'html',
timeout : 360000, // milliseconds
beforeSend : function(xhr, settings) {
// disturb double submit
$("*[type=button]").attr('disabled', true);
},
complete : function(xhr, textStatus) {
// allow resubmit
$("*[type=button]").attr('disabled', false);
}
}).done(function(data, dataType) {
switch (mode) {
// 中略 //
case 'getdata':
$("#data-container").html(data);
loadingView(false);
break;
}
}).fail(function(XMLHttpRequest, textStatus, errorThrown) {
console.log( textStatus + errorThrown);
});
};
2行目のはAjaxで再描画した後同じボタンをクリックする場合にはonで指定する必要があるらしい。
それはともかく、サーバー側のコードとか、コード1行ずつconsole.log入れていった結果、DOMに既に値があったらAjaxで再描画できないのではないか、という結論に至りました。
そこでこの1行をそれぞれのclient.jsに入れてみます。
$('#data-container').html('');
どうやら上手くいったようです。
最終的なclientのコードは以下の通り。
client.js
$('#search').click(function() {
var $form = $('#form-search');
var data = $form.serializeArray();
$('#data-container').html('');
submit_action('search', data, 'getdata');
});
$("#data-container").on('click', 'button#search', function() {
var $form = $('#form-search');
var data = $form.serializeArray();
$('#data-container').html('');
submit_action('search', data, 'getdata');
return false;
});