[javascript] 여러 번 실행되는 jQuery 클릭 이벤트

비디오 포커 게임의 기초를 내리는 방법으로 자바 포커로 비디오 포커 게임을 작성하려고하는데 jQuery 클릭 이벤트 핸들러가 여러 번 실행되는 문제가 발생했습니다.

베팅을하기위한 버튼에 부착되어 있으며, 게임 중에 직접 베팅을 할 때 좋습니다 (한 번만 발사). 그러나 초침 베팅에서는 베팅 또는 플레이스 베팅 버튼을 누를 때마다 클릭 이벤트가 두 번 발생합니다 (따라서 매번 정확한 금액이 베팅됩니다). 베팅 버튼을 한 번 누르면 클릭 이벤트가 발생하는 횟수에 대해 전반적으로이 패턴을 따릅니다 . 시퀀스 의 i 번째 항은 게임 시작부터 i 번째 손을 베팅 한 것입니다 . 1, 2, 4 표시, 7, 11, 16, 22, 29, 37, 46, N (N + 1) / 2 + 1은 무엇을 위해 그 가치가 수 – 내가 그림을 그 밖으로 스마트 충분하지, 내가 사용 OEIS을 . 🙂

작동하는 click 이벤트 핸들러가있는 함수는 다음과 같습니다. 바라건대 이해하기 쉽기를 바랍니다 (그렇지 않다면 알려주세요.

/** The following function keeps track of bet buttons that are pressed, until place button is pressed to place bet. **/
function pushingBetButtons() {
    $("#money").text("Money left: $" + player.money); // displays money player has left

    $(".bet").click(function() {
        var amount = 0; // holds the amount of money the player bet on this click
        if($(this).attr("id") == "bet1") { // the player just bet $1
            amount = 1;
        } else if($(this).attr("id") == "bet5") { // etc.
            amount = 5;
        } else if($(this).attr("id") == "bet25") {
            amount = 25;
        } else if($(this).attr("id") == "bet100") {
            amount = 100;
        } else if($(this).attr("id") == "bet500") {
            amount = 500;
        } else if($(this).attr("id") == "bet1000") {
            amount = 1000;
        }
        if(player.money >= amount) { // check whether the player has this much to bet
            player.bet += amount; // add what was just bet by clicking that button to the total bet on this hand
            player.money -= amount; // and, of course, subtract it from player's current pot
            $("#money").text("Money left: $" + player.money); // then redisplay what the player has left
        } else {
            alert("You don't have $" + amount + " to bet.");
        }
    });

    $("#place").click(function() {
        if(player.bet == 0) { // player didn't bet anything on this hand
            alert("Please place a bet first.");
        } else {
            $("#card_para").css("display", "block"); // now show the cards
            $(".card").bind("click", cardClicked); // and set up the event handler for the cards
            $("#bet_buttons_para").css("display", "none"); // hide the bet buttons and place bet button
            $("#redraw").css("display", "block"); // and reshow the button for redrawing the hand
            player.bet = 0; // reset the bet for betting on the next hand
            drawNewHand(); // draw the cards
        }
    });
}

아이디어 나 제안 사항이 있거나 내 문제에 대한 해결책이 여기의 다른 문제에 대한 해결책과 비슷한 지 알려주십시오. 나를 위해).



답변

한 번만 클릭 동작을 수행하려면 다음을 사용하십시오.

$(".bet").unbind().click(function() {
    //Stuff
});


답변

.unbind()더 이상 사용되지 않으며 .off()대신 메소드를 사용해야합니다 . 전화 .off()하기 직전에 전화하십시오 .on().

모든 이벤트 핸들러가 제거됩니다.

$(element).off().on('click', function() {
    // function body
});

등록 된 ‘click’이벤트 핸들러 만 제거하려면 다음을 수행하십시오.

$(element).off('click').on('click', function() {
    // function body
});


답변

.하나()

더 나은 옵션은 다음과 .one()같습니다.

핸들러는 이벤트 유형 당 요소 당 최대 한 번 실행됩니다.

$(".bet").one('click',function() {
    //Your function
});

여러 수업이 있고 각 수업을 한 번 클릭해야하는 경우,

$(".bet").on('click',function() {
    //Your function
    $(this).off('click');   //or $(this).unbind()
});


답변

.off () .unbind () 또는 .stopPropagation ()이 여전히 특정 문제를 해결하지 못한다면 .stopImmediatePropagation ()을 사용해보십시오. 버블 링없이 또는 이벤트없이 이벤트를 처리하려는 경우에 효과적입니다. 이미 처리중인 다른 이벤트에 영향을줍니다. 다음과 같은 것 :

$(".bet").click(function(event) {
  event.stopImmediatePropagation();
  //Do Stuff
});

트릭을 수행합니다!


답변

“클릭”할 때마다 해당 함수를 호출하면 각 호출에 다른 핸들러 쌍이 추가 됩니다.

jQuery로 핸들러를 추가하는 것은 “onclick”속성의 값을 설정하는 것과 다릅니다. 하나의 원하는만큼 많은 핸들러를 추가 할 수 있습니다.


답변

이벤트가 여러 번 등록되면 이벤트가 여러 번 발생합니다 (같은 핸들러에 있더라도).

예를 들어 $("ctrl").on('click', somefunction)페이지를 부분적으로 새로 고칠 때마다이 코드 조각이 실행되면 매번 이벤트도 등록됩니다. 따라서 Ctrl 키를 한 번만 클릭해도 “일부 기능”을 여러 번 실행할 수 있습니다. 실행 횟수는 등록 된 횟수에 따라 다릅니다.

이것은 자바 스크립트에 등록 된 모든 이벤트에 해당됩니다.

해결책:

“on”을 한 번만 호출하십시오.

어떤 이유로 든 아키텍처를 제어 할 수없는 경우 다음을 수행하십시오.

$("ctrl").off('click');
$("ctrl").on('click', somefunction);


답변

마크 업으로 인해 문제가 발생했습니다.

HTML :

<div class="myclass">
 <div class="inner">

  <div class="myclass">
   <a href="#">Click Me</a>
  </div>

 </div>
</div>

jQuery

$('.myclass').on('click', 'a', function(event) { ... } );

html에 동일한 클래스 ‘myclass’가 두 번 있으므로 div의 각 인스턴스에 대해 click을 호출합니다.