jQuery单击事件触发多次

2020/10/04 21:01 · javascript ·  · 0评论

我试图用Javascript编写视频扑克游戏,以降低其基础知识,但我遇到了一个问题,其中jQuery click事件处理程序多次触发。

它们被附加到用于下注的按钮上,并且对于在游戏中第一手下注(仅触发一次)非常有效。但是在秒针下注中,每次按下一个下注或下注按钮都会触发两次点击事件(因此,每次按下正确的赌注量是两次)。总体而言,在按一次下注按钮时,触发单击事件的次数遵循此模式-序列第i个词用于从游戏开始时下注第i个手: ,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,它也可以多次执行“某些功能”-它执行的次数将取决于其注册的次数。

对于在javascript中注册的任何事件,都是如此。

解:

确保只调用一次“ 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。

$('.bed').one(function(){ })

文件:

http://api.jquery.com/one/

我们必须stopPropagation()为了避免Clicks触发事件太多次。

$(this).find('#cameraImageView').on('click', function(evt) {
   evt.stopPropagation();
   console.log("Camera click event.");
});

它防止事件使DOM树冒泡,从而防止任何父处理程序收到该事件的通知。此方法不接受任何参数。

我们可以event.isPropagationStopped()用来确定是否曾经(在该事件对象上)调用过此方法。

此方法也适用于使用trigger()触发的自定义事件。请注意,这不会阻止同一元素上的其他处理程序运行。

更好的选择是使用off

<script>
function flash() {
  $("div").show().fadeOut("slow");
}
$("#bind").click(function() {
  $( "body" )
    .on("click", "#theone", flash)
    .find("#theone")
      .text("Can Click!");
});
$("#unbind").click(function() {
  $("body")
    .off("click", "#theone", flash)
    .find("#theone")
      .text("Does nothing...");
});
</script>

关于.on()和.one()的所有内容都很棒,而jquery很棒。

但是有时候,您希望让用户更明显一点是不允许用户单击,在这种情况下,您可以执行以下操作:

function funName(){
    $("#orderButton").prop("disabled", true);
    //  do a bunch of stuff
    // and now that you're all done
    setTimeout(function(){
        $("#orderButton").prop("disabled",false);
        $("#orderButton").blur();
    }, 3000);
}

您的按钮将如下所示:

<button onclick='funName()'>Click here</button>

发生这种情况是由于特定事件多次绑定到同一元素。

对我有用的解决方案是:

使用.die()方法杀死所有附加事件

然后附加您的方法侦听器。

从而,

$('.arrow').click(function() {
// FUNCTION BODY HERE
}

应该:

$('.arrow').die("click")
$('.arrow').click(function() {
// FUNCTION BODY HERE
}

就我而言,我使用的是“代理”,因此这些解决方案均无效。我相信正是通过ajax调用多次出现该按钮才导致多次点击问题。解决方案使用了超时,因此只能识别最后一次点击:

var t;
$('body').delegate( '.mybutton', 'click', function(){
    // clear the timeout
    clearTimeout(t);
    // Delay the actionable script by 500ms
    t = setTimeout( function(){
        // do something here
    },500)
})
$(element).click(function (e)
{
  if(e.timeStamp !== 0) // This will prevent event triggering more then once
   {
      //do your stuff
   }
}

.one在页面生命周期内仅触发一次

因此,如果您要进行验证,那么这不是正确的解决方案,因为如果您在验证后不离开页面,就永远不会回来。更好地使用

$(".bet").on('click',function() 
{ //validation 
   if (validated) { 
      $(".bet").off('click'); //prevent to fire again when we are not yet off the page
      //go somewhere
    }
});

处理此问题时,我始终使用:

$(".bet").unbind("click").bind("click", function (e) {
  // code goes here
}

这样,我在同一笔划中解除绑定并重新绑定。

https://jsfiddle.net/0vgchj9n/1/

为了确保事件始终只触发一次,可以使用Jquery .one()。JQuery one确保事件处理程序仅调用一次。此外,您可以为事件处理程序订阅一个,以便在完成当前单击操作的处理后允许进一步的单击。

<div id="testDiv">
  <button class="testClass">Test Button</button>
</div>

var subscribeClickEvent = function() {$("#testDiv").one("click", ".testClass", clickHandler);};

function clickHandler() {
  //... perform the tasks  
  alert("you clicked the button");
  //... subscribe the click handler again when the processing of current click operation is complete  
  subscribeClickEvent();
}

subscribeClickEvent();

尝试这种方式:

<a href="javascript:void(0)" onclick="this.onclick = false; fireThisFunctionOnlyOnce()"> Fire function </a>

就我而言,onclick事件多次触发,因为我将通用事件处理程序做为

  `$('div').on("click", 'a[data-toggle="tab"]',function () {
        console.log("dynamic bootstrap tab clicked");
        var href = $(this).attr('href');
        window.location.hash = href;
   });`

变成

    `$('div#mainData').on("click", 'a[data-toggle="tab"]',function () {
        console.log("dynamic bootstrap tab clicked");
        var href = $(this).attr('href');
        window.location.hash = href;
    });`

并且还必须为静态和动态点击,静态标签页点击分别设置处理程序

    `$('a[data-toggle="tab"]').on("click",function () {
        console.log("static bootstrap tab clicked");
        var href = $(this).attr('href');
        window.location.hash = href;
    });`

在我的情况下,我已经*.js<script>标签中两次在页面上加载了相同的文件,因此这两个文件都将事件处理程序附加到元素上。我删除了重复的声明,并解决了该问题。

我发现的另一个解决方案是,如果您有多个类,并且在单击标签时正在处理单选按钮。

$('.btn').on('click', function(e) {
    e.preventDefault();

    // Hack - Stop Double click on Radio Buttons
    if (e.target.tagName != 'INPUT') {
        // Not a input, check to see if we have a radio
        $(this).find('input').attr('checked', 'checked').change();
    }
});

我在动态生成链接时遇到了这个问题:

$(document).on('click', '#mylink', function({...do stuff...});

我发现更换 document'body'为我解决的问题

$('body').on('click', '#mylink', function({...do stuff...});

Unbind()可行,但是将来可能会导致其他问题。该处理程序在另一个处理程序中时会多次触发,因此请将您的处理程序置于外部,如果您想嵌套的处理程序的值,请将它们分配给一个全局变量,您的处理程序将可以访问该变量。

万一这工作正常

$( "#ok" ).bind( "click", function() {
    console.log("click"); 
});

以下代码在我的聊天应用程序中为我工作,可以多次处理多个鼠标单击触发事件。
if (!e.originalEvent.detail || e.originalEvent.detail == 1)
{ // Your code logic }

本文地址:http://javascript.askforanswer.com/jquerydanjishijianchufaduoci.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!