簡體   English   中英

jQuery單擊觸發兩次

[英]jQuery click fires twice

我有這個jsfiddle: http : //jsfiddle.net/us28bg4u/1/

怎么了,當我按"First" -> "Left" ,動作只觸發一次。 但是,當我再次執行此操作時,該動作將觸發兩次,第三次按相同的動作時,它將觸發三次,依此類推。

我不知道為什么它堆積。 有人可以啟發我嗎? :)

我嘗試過:
e.stopPropagation();
e.preventDefault();
-但似乎沒有什么可以阻止點擊次數的累積。

我的js看起來像這樣:

    var side = '';
    var action = '';

    $(document).ready(function () {
        $(".first").click(function (e) {
            logit("First pressed");
            preStart('first');
        });

        $(".second").click(function (e) {
            logit('Second pressed');
            preStart('second');
        });

        function preStart(action) {
            $("#overlay").fadeIn(200);

            $(".leftside").click(function (e) {
                side = "left";
                $("#overlay").fadeOut(200);

                logit('Starting ' + action + ' (' + side + ')');
             });

            $(".rightside").click(function (e) {
                side = "right";
                $("#overlay").fadeOut(200);

                logit('Starting ' + action + ' (' + side + ')');
            });
        }

        function logit(logtxt){
            $("#log").append("<li>"+logtxt+"</li>");

        }
    });

與click()函數在另一個函數中有關嗎?

您正在將處理程序綁定到click處理程序內部的事件,這就是發生這種情況的原因,

像波紋管一樣做

    var side = '';
    var action = '';

    $(document).ready(function () {
        $(".first").click(function (e) {
            logit("First pressed");
            preStart('first');
        });

        $(".second").click(function (e) {
            logit('Second pressed');
            preStart('second');
        });

        $(".leftside").click(function (e) {
                side = "left";
                $("#overlay").fadeOut(200);

                logit('Starting ' + action + ' (' + side + ')');
             });

            $(".rightside").click(function (e) {
                side = "right";
                $("#overlay").fadeOut(200);

                logit('Starting ' + action + ' (' + side + ')');
            });

        function preStart(action) {
            $("#overlay").fadeIn(200);
        }

        function logit(logtxt){
            $("#log").append("<li>"+logtxt+"</li>");

        }
    });

固定演示

事件綁定可以堆疊。 preStart內部,通過在事件再次綁定之前將.unbind()添加到方法鏈中preStart清除先前的綁定,如下所示:

    function preStart(action) {
        $("#overlay").fadeIn(200);

        $(".leftside").unbind("click").click(function (e) {
            side = "left";
            $("#overlay").fadeOut(200);

            logit('Starting ' + action + ' (' + side + ')');
         });

        $(".rightside").unbind("click").click(function (e) {
            side = "right";
            $("#overlay").fadeOut(200);

            logit('Starting ' + action + ' (' + side + ')');
        });
    }

像這樣用OWN參數處理click事件。 試試這個

 $(".leftside").click(function (e) {
     if(!e.handled){
         e.handled = true;
         side = "left";
         $("#overlay").fadeOut(200);

         logit('Starting ' + action + ' (' + side + ')');
     }

});

$(".rightside").click(function (e) {
      if(!e.handled){
            e.handled = true;
             side = "right";
             $("#overlay").fadeOut(200);

            logit('Starting ' + action + ' (' + side + ')');
       }   

  });

更新小提琴

這取決於您調用preStart的次數,第一次單擊時,將$(“。leftside”)。click()$(​​“。rightside”)。click()綁定一次,一次又一次單擊則綁定一次。在$(“。leftside”)和$(“。rightside”)上創建了另一個綁定,依此類推。

您始終可以先解除綁定,然后再重新綁定。

$(".leftside").unbind('click').click(function (e) {
    // your code
}

小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM