点击事件多次触发问题,如何?

时间:2013-12-22 20:18:32

标签: javascript jquery click bind unbind

我有一个按钮。当我点击它时,我将一些按钮附加到DOM。

我遇到的问题是那些我多次追加的按钮。

$(el).on('click', function (e) {
    key();
});

function key() {
    $(document).on('click', '#key li', function () {
        console.log($(this));
    });
}

第一次调用key()时,console.log会触发一次

我第二次拨打key() console.log两次点火

等等

我尝试添加$(document).find('#key li').unbind('click'),但这似乎不起作用

有什么想法吗?

编辑:

这是jsfiddle example(如下所示)。

$('button').on('click', function () {
    $('.cont').remove();
    $('.container').remove();
    var html = '<button class="cont">click</button><div class="container">placeholder</div>';
    $('body').append(html);
    key();
});

$(document).on('click', '.cont', function () {
    var html = '<div id="but_placeholder"><button class="one">1</button><button class="two">2</button><button class="three">3</button></div>';
    $('.container').html(html);
});

function key() {
    $(document).on('click', '#but_placeholder button', function () {
        $('input').val($('input').val() + $(this).html());
    });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input" />
<button>test</button>

要重现,请点击test按钮,然后点击click,然后点击一个1 2 3并重复此过程

您会注意到,第二次完成整个过程时,文本会翻倍

3 个答案:

答案 0 :(得分:5)

这样做

function key() {
    $('#key li').unbind('click');
    $('#key li').bind('click', function () {
        console.log($(this));
    });
}

或者你可以做到

function key() {
    $('#key').find('li').unbind('click');
    $('#key').find('li').bind('click', function () {
        console.log($(this));
    });
}

我猜第二个肯定会奏效。

更新方法

function key() {
    $(document).off('click', '#but_placeholder button');
    $(document).on('click', '#but_placeholder button', function () {
        $('input').val($('input').val() + $(this).html());
    });
}

答案 1 :(得分:0)

尝试为所有按钮指定唯一ID。

答案 2 :(得分:0)

尝试在文档上设置on,应该这样做,并且只绑定一次,包括将来(生成的)元素。例如:

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

关键是,使用key()函数继续重新绑定click事件。当您将on事件绑定到文档时,您不需要将其包装在函数中。像这样的绑定(我上面的代码)将告诉jQuery将动作(在我的情况下'// do stuff')绑定到它在文档中找到的'#key li'上的每个click事件。它是否存在,是否有一个或多个。我希望这可以解释一下。

Fiddle

在我的小提琴中,我稍微修改了你的其他代码,并将插入的按钮预先包装为jQuery对象,这样你不仅可以附加一个按钮,而且已经在其上设置了动作。