LoginSignup
8
11

More than 5 years have passed since last update.

jQueryでページの内容を動的に書き換えようとしたときにハマったこと

Posted at

やりたかったこと:
ページ上部にフィルタリングオプションを配置し、サブミットしたときにページ下部を含めたページの一部を更新
なお、フィルタリングに使用した値は保存しておきたかったので、フィルタリング部も合わせて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;
});

8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11