-1

ページが初めて読み込まれると、兄弟の.lengthはたとえば3を返します。次に、「クリック」イベントが投稿をトリガーし、成功すると兄弟が削除され、.lengthが再度呼び出されますが、3を返し続けます。

各兄弟は、同じループ内ではなく、ランダムな時間に「クリック」イベントを介して削除されることに注意してください。

例:(ここでは手書きですが、動作を説明する必要があります)

<ul id="un33k">
    <li><a class="clicked" href="/link/1">Link 1</a></li>
    <li><a class="clicked" href="/link/2">Link 2</a></li>
    <li><a class="clicked" href="/link/3">Link 3</a></li>
    <li><a class="clicked" href="/link/4">Link 4</a></li>
</ul>

$(document).ready(function(){
    var total_li = $('#un33k').children().length; // 3 (test only)

    $('a.clicked').click(function () {
        var me = this;
        $.post('somelink', {...}, function(data, status) { // assuming success
            var new_total_li =  $(me).closest('li').siblings().length; // 3, good
            var parent = $(me).closest('li').parent() // can't hardcode id
            $(me).closest('li').remove(); // assuming the clicked li is gone now
            new_total_li =  $(parent).children().length; // 3, but should be 2 now?
        }, "json");
    });
});

数分後にクリックしても、3が表示されます。なぜですか。

更新:実際のコードをここにコピーします:

この行は、削除された兄弟の数に関係なく同じ初期番号を示す原因( console.log($(me).closest('li')。siblings()。length )です。

<script>
$(document).ready(function(){
    $('a.get2post').click(function () {
        var me = this;
        var url = $(me).attr('href');
        if ($(me).hasClass('confirm')){
            if(!window.confirm("Are you sure?")){
                return false;
            }
        }
        if ($(me).hasClass('deletion')){
            var postdata = {ajax: 'true' };
            $.post(url, postdata, function(data, status) {
                if (status == 'success'){
                    $(me).closest('li').hide('slow', function(){ $(me).remove(); });
                    console.log($(me).closest('li').siblings().length) // problem
                }
            }, "json");
       }
       return false;
    });
});
</script>
4

1 に答える 1

1

あなたの問題は$(me).remove();線です。これは、要素であるを参照して<a>いるため、要素を削除しています。何を達成しようとしているのかわかりません。またはを削除しますが、からカウントを取得すると、要素を参照していることになります。withを削除しても、要素のコレクションには影響しません。ですから、あなたは自分の状況で何を削除して数えるのかを決める必要があります。methisa.get2post<a><li>$(me).closest('li').siblings().length<li><a>$(me).remove();<li>

ワークフローは次のようになります。親を非表示にし、参照されているもの<li>を削除してから、兄弟<a>の数を取得します。<li>が削除される<li>ことはないため、一部が非表示になっている場合でも、カウントは常に同じになります。

このコードを見てください:

$(document).ready(function(){
    $('a.get2post').click(function () {
        var me = $(this);
        var parent_li = me.closest("li");
        var url = "/echo/json/";//$(me).attr('href');
        if (me.hasClass('confirm')){
            if(!window.confirm("Are you sure?")){
                return false;
            }
        }
        if (me.hasClass('deletion')){
            var postdata = {stuff: 'stuff' };
            $.post(url, postdata, function(data, status) {
                if (status == 'success'){
                    parent_li.hide('slow', function () {
                        $(this).remove();
                    });
                    console.log(parent_li.siblings().length) // problem
                }
            }, "json");
       }
       return false;
    });
});

http://jsfiddle.net/CTC3J/

非表示にした後、実際にターゲット<li>要素を削除します。

于 2013-02-14T18:35:20.480 に答える