1

ここにコードがあります

    $('#print').click(function(){
        $('#compatibility h2').each(function(){
                var clicked = $(this);
                if($(this).hasClass('collapsed'))
                {
                    $(clicked).removeClass('collapsed');
                    if($($(this)[0].nextSibling).is('ul'))
                    {
                        $(this).next().slideToggle();
                    }
                    else
                    {
                    $.get("getproducts.php", {cid: $(this).attr('id'), did: $("#deviceId").val()},
                          function(data)
                          {   
                            $(clicked).after(data).next().slideToggle(); //adds a <ul> <li> </li> </ul>  
                          });
                    }
                }
            });

        $('#expandCollapse').attr('value','Collapse All');
        print();        
});

これが印刷の機能です

それがすることの例

印刷コマンドを実行しようとする前に、トグルが完全に完了するのを待ちません。誰かがこれを修正するためのアイデアを持っていますか?ありがとう。

4

1 に答える 1

2

を呼び出すと、多くの非同期タスク(アニメーションとAJAX呼び出し)がトリガーされますeach(...)clickそれらは非同期であるため、JavaScriptは、ハンドラー内の残りのタスクを完了する前に、それらが終了するのを待ちません。

解決策は、開始する必要のある非同期タスクの数をカウントし、完了するたびに1つずつデクリメントすることです。ゼロに達すると、すべてのタスクが終了し、print()すべての非同期作業が完了したことを確認して安全に呼び出すことができます。

免責事項:私はこのコードをテストしていませんが、動作するはずです。そうでない場合、これは正しいアイデアを得るのに十分なはずです。

$('#print').click(function(){
    var titles = $('#compatibility h2'),
        titlesLeftToProcess = titles.length;

    function finishedToggling() {
        titlesLeftToProcess--;
        if (titlesLeftToProcess < 1) {
            print();
        }
    }

    titles.each(function() {
        var clicked = $(this);
        if(clicked.hasClass('collapsed')) {
            clicked.removeClass('collapsed');
            if(clicked.next().is('ul')) {
                clicked.next().slideToggle(finishedToggling);
            } else {
                $.get("getproducts.php", 
                    {cid: clicked.attr('id'), did: $("#deviceId").val()},
                    function(data)
                    {   
                        clicked.after(data).next().slideToggle(finishedToggling);
                    });
            }
        }
    });

    $('#expandCollapse').attr('value','Collapse All');
});
于 2011-04-07T18:48:13.723 に答える