0

jQuery コード: Sortable 設定をすべて削除しました。それらが適切であると思われる場合は、それらを元に戻すことができます.

$('#navsort').sortable({ ... });

$("#content").on('click', '#submit_menu', function (event){
    event.preventDefault();
    $.ajax({
        type: "POST",
        url: "menu-ajax.php",
        data: { data:$('#form').serialize() }
    }).done(function (response) {
        $('#content').hide().html(response).fadeIn('slow');
    });
});

HTML コード: 実際のコードには多くの PHP やその他の処理が含まれているため、これは単純化されたバージョンです。

<div id="content">
    <form method="post" id="form">
        <a href="#" id="submit_menu">Save</a>
        <ol id="navsort">
            ...
        </ol>
    </form>
</div>

ご覧のとおり、Sortable に添付された要素を含むフォーム全体が、フォームの送信時に AJAX を介して (それ自体の同一のコピーで) 置き換えられます。これは、Sortable が機能しなくなったときです。

Sortable が初期化されたとき、新しいフォームは DOM の一部ではなかったため、置き換えられたフォームと同一であるにもかかわらず、添付されていないことを理解しています。.on()また、ページが最初にロードされたときに存在する要素とその後に追加された要素との間で を使用して委任する方法も理解しています。私が理解していないのは、この概念を Sortable の初期化に適用する方法です。

汚いハックで動作するようになりましたが、正しい方法を理解したいです。

ダーティハック

function dirtyhack(){
    $("selector").on('event', 'target', function (){ ... });
}
dirtyhack();

$("#content").on('click', '#submit_menu', function (event){
    event.preventDefault();
    $.ajax({
        type: "POST",
        url: "menu-ajax.php",
        data: { data:$('#form').serialize() }
    }).done(function (response) {
        $('#content').hide().html(response).fadeIn('slow');
        dirtyhack();
    });
});

そのため、Sortable はページが読み込まれると初期化され、AJAX が Sortable がアタッチされている要素の置換が完了すると再初期化されます。これは正しいかもしれませんが、間違っているように感じます。

開示:私は実際にはSortableの代わりにnestedSortableプラグインを使用していますが、プラグインの作成者は、プラグインを通じて「jQuery Sortableのすべてのオプション、イベント、およびメソッドが利用可能」であると主張しています。また、テストのために標準のソート可能なウィジェットに切り替えましたが、同じ問題が発生したため、プラグインではないと思います。

プラグイン URL: https://github.com/mjsarfatti/nestedSortable/tree/2.0alpha

4

0 に答える 0