1

再帰が多すぎるというエラーメッセージが表示されます。なんで?

次のコードは、画像をクリックするとテーブルの行を展開/折りたたむことになっています。画像が存在しない場合は、クリックするとdivが表示され、最後の行が展開/折りたたまれます

$(document).ready(function() {
    $(".ui-dialog-titlebar").hide(); 
    //$(".lvlcollapse .level4").hide();
    $("tr.lvlcollapse").click(function() {
        //alert($(this).find("img").attr("src"));
        if ($(this).find("img").attr("src") != undefined) {
            var tnow = $.now();
            var allClass = $(this).attr('class');
            var level = getLevel($(this));
            var state = getClass($(this), '^clicked\\d+$');
            if (state == undefined) {
                state = "closing";
                $(this).addClass("clicked" + tnow);
            }
            else {
                $(this).removeClass(state);
                tnow = state.substr(6);
            }
            switchImage($(this));
            $(this).nextAll(".lvlcollapse").each(function() {
                var sublvl = getLevel($(this));
                var subtnow = 0;
                var substate = getClass($(this), '^closed\\d+$');
                if (substate != undefined) subtnow = substate.substr(5);
                if (sublvl > level) {
                    if (state == "closing" && subtnow == 0) {
                        $(this).addClass("closed" + tnow);
                        $(this).toggle();
                    }
                    else if (subtnow == tnow) {
                        $(this).removeClass(substate);
                        $(this).toggle();
                    }
                }
                else {
                    return false;
                }
            });

        } else {
            //alert('No Image ');
            $(".button").click(function(event) {
                //var $this2 = $(this);
                var allLevel4 = $(this).next(".lvlcollapse.level4");
                $($(this)).toggle('fast', function() {
                    if (allLevel4.is(":visible")) {
                        $(this).html("Show Attempts");
                        alert('hello2');
                        return false;
                    } else {
                        $(this).html("Hide Attempts");
                        alert('hello3');
                        return false;
                    }

                }) event.preventDefault();
            }).trigger("click");
        }
    });
    $(".lvlcollapse.level2").filter(function() {
        return $(this).next(".lvlcollapse.level3").is(":visible");
    }).trigger("click");
    //$(".button").filter(function() { return $(this).next(".lvlcollapse.level4").is(":visible"); }).hide();
});​
4

2 に答える 2

0

コメントアウトされたアラートはどうなりますか?コメントを外すと、何度も繰り返されるのを見ていますか?elseの$('。button')。click()は見栄えが悪いです。登録する必要があるのは1回だけですが、クリックリスナーにあるため、ユーザーがリンクをクリックするたびに登録されます。それを引き出して、ドキュメントの準備ができたとき、またはテーブルが作成されたときに登録します。ユーザーが何かをクリックしたことに応答しません。

于 2012-12-05T20:03:28.517 に答える
0

面白そうなことの1つは、のクリックハンドラー内のボタンにクリックハンドラーを追加していることですtr.lvlcollapse。これにより、クリックするたびに新しいハンドラーが作成され、呼び出したときに以前のすべてのハンドラーがトリガーされますtrigger.click()

クリックイベントがバブルするため、すべての親のクリックハンドラーもトリガーされます。ボタンが内側tr.lvlcollapseにある場合は、それが問題である可能性があります。

あなたがする必要がある2つのこと:

  • 何をしているのかを本当に理解していて、ハンドラーのバインドを解除するか、少なくともバインドする前に既存のバインドを削除する計画がある場合を除いて、ハンドラー内からハンドラーを設定しないでください。これはあまり一般的ではないことに注意してください。通常、ハンドラー内からハンドラーを追加することはありません。

  • event.stopPropagation()祖先ノードにクリックを処理させたくない場合は、呼び出します

于 2012-12-05T20:03:42.910 に答える