【问题标题】:click event fires multiple times issue, how to?点击事件触发多次问题,怎么办?
【发布时间】:2017-10-24 06:54:55
【问题描述】:

我有一个按钮。当我单击它时,我将一些按钮附加到 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 并重复该过程

您会注意到第二次执行该过程时,文本会加倍

【问题讨论】:

  • 你试过用keyup()代替click()吗?
  • 我也遇到了同样的问题,然后我把.on改成.bind,问题就解决了
  • 为什么每次点击el时都在文档中添加一个新的事件处理程序?
  • 用户 adeneo 已经回答了您的问题。如何解决?删除函数 key() 并放入 console.log()。但这不是(很可能)你想要的。您为什么不分享更多代码并解释您想要实现的目标?
  • 我编辑了我的问题并添加了一个示例

标签: javascript jquery click bind unbind


【解决方案1】:

这样做

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());
    });
}

【讨论】:

  • 这个解决方案将解除我的第一个$(el).on('click' ...
  • 好像没有效果
  • 你的意思是点击还是被多次触发?
  • @Patrioticcow :尝试第二种方法。正如 Adeneo 建议的那样,避免将点击绑定到文档“n”次
  • 您的最后一次编辑稍微改变了我的脚本,$(this) 不是元素,而是文档。而且我必须使用$(document),否则我无法获取元素
【解决方案2】:

尝试给所有按钮一个唯一的ID。

【讨论】:

  • 这是否意味着您有多个具有相同 id 的元素?
【解决方案3】:

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

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

关键是,你不断地使用 key() 函数重新绑定到 click 事件。当您将on 事件绑定到文档时,您不需要将其包装在函数中。像这样的绑定(我上面的代码)将告诉 jQuery 将操作(在我的情况下为“//do stuff”)绑定到它在文档中找到的“#key li”上的每个点击事件。不管它有没有,是有还是有很多。我希望这能有所解释。

Fiddle

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

【讨论】:

  • 当然。我在解释您的代码时遇到了一些麻烦(您可以通过选择(和设置)id 使事情更清楚)。我认为这就是您所需要的:jsfiddle.net/c_kick/3LRBX
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多