Javascript 为什么jQuery会多次触发单击事件

Javascript 为什么jQuery会多次触发单击事件,javascript,jquery,html,Javascript,Jquery,Html,我这里有这个示例代码 如果您单击“创建”按钮3次,并且每次在确认中单击“是”,则每次单击都会多次触发警报,而不是仅触发一次 如果您单击“创建”按钮3次,每次单击“否”,第4次单击“是”,则会针对之前的每次单击而不是一次触发警报 这种行为对我来说似乎很奇怪,因为我希望每次单击都会触发一次警报。我必须使用.unbind()还是有更好的解决方案 有人能告诉我为什么会发生这种情况以及如何解决它吗 谢谢,因为您要多次绑定它。单击事件内的单击事件意味着每次单击时,新的单击事件将绑定到以前绑定的事件之上。除

我这里有这个示例代码

如果您单击“创建”按钮3次,并且每次在确认中单击“是”,则每次单击都会多次触发警报,而不是仅触发一次

如果您单击“创建”按钮3次,每次单击“否”,第4次单击“是”,则会针对之前的每次单击而不是一次触发警报

这种行为对我来说似乎很奇怪,因为我希望每次单击都会触发一次警报。我必须使用.unbind()还是有更好的解决方案

有人能告诉我为什么会发生这种情况以及如何解决它吗


谢谢,因为您要多次绑定它。单击事件内的单击事件意味着每次单击时,新的单击事件将绑定到以前绑定的事件之上。除非单击事件创建了元素,否则不要在单击事件中绑定单击事件。也不需要反复重新初始化模式

$(document).ready(function ($) {

    $('#confirmCreateModal').modal({show: false});

    $('#confirmCreateYes').click(function () {
        $('#confirmCreateModal').modal('hide');

        var test = "123";
        alert(test);
        console.log(test);             
    });

    $('.creategene').click(function () {

        $('#confirmCreateModal').modal('show');

    });
});

将此添加到您的代码中:

$( "#confirmCreateYes").unbind( "click" );
像这样:

$(document).ready(function ($) {

$('.creategene').click(function () {

    $('#confirmCreateModal').modal();

    $('#confirmCreateYes').click(function () {
        $('#confirmCreateModal').modal('hide');

        var test = "123";
        alert(test);
        console.log(test);
        $( "#confirmCreateYes").unbind( "click" );
    });
});
}))

它将解除对事件的绑定,这样它就不会绑定到上一个事件的顶部。这允许事件仅在原始单击事件中触发

这不是一个好方法。它将解除绑定附着到元素的所有单击事件。我将把它留在这里以供学习之用。


像这样更改代码

$(document).ready(function ($) {

    $('.creategene').click(function () {

        $('#confirmCreateModal').modal();


    });
    $('#confirmCreateYes').click(function () {
            $('#confirmCreateModal').modal('hide');

            var test = "123";
            alert(test);
            console.log(test);             
        });
});


您不必绑定
$(“#confirmCreateYes”)。在每个按钮中单击

您也可以尝试此操作-

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

这是行不通的。如果选择此方法,则解除绑定需要在绑定之前,而不是在函数实现内部(?)。但出于多种原因,这仍然是一种糟糕的方法,第一个原因是,您盲目地解除与此项目相关的所有点击事件的绑定,而不一定只是问题中的一个。不,它放在@kylealonius放置的位置比放在其他任何地方都更有意义。它将在尽可能早的时候解除绑定。不过,进一步减少使用
.one()
比使用
.click()
更有意义,这样你甚至不必自己解开它。但你要知道,为什么要解开它呢?它只能在模态可见时触发。Robert关于解除所有单击事件的绑定是正确的。我没有想到这一点。我试图保留原来的设计。但是由于create yes按钮有一个ID,其他方法要好得多,因为click事件不会为任何其他元素触发。如果主click事件(.creategene)发生在knockoutjs click binding self.creategene=function(){}中,您将如何处理此问题?我会使用数据属性而不是javascript来完成此操作,然后绑定到关闭事件。不是关闭事件,只是“是”按钮。根本不需要初始化模式,也不需要单击事件来打开它。仅仅一个代码块并不能提供一个好的答案。请添加解释(为什么解决问题,错误在哪里等…)
$("#confirmCreateYes").unbind().click(function() {
//Stuff
});