【问题标题】:JavaScript Event Listener runs twiceJavaScript 事件监听器运行两次
【发布时间】:2014-09-24 15:21:34
【问题描述】:

作为参考,请在下面的 JSFiddle 中查看我的示例。每次有人单击加号按钮时,都应在下方插入一个新行。除了插入的新行数始终是当前现有行数的两倍之外,这很好用。我怎样才能避免这种奇怪的行为,或者它的原因是什么?请点击第一行按钮查看问题。

http://jsfiddle.net/jrxeua6L/

var answers = [{
    order: 1,
    content: "placeholder"
}],
    appendAnswer = function() {

    answers.push({
        order: answers.length + 1,
        content: $(this).parent().prev().val()
    });

    $("#answers").empty();

    $.each(answers, function(key, value) {
        $("#answers").append('<div class="input-group"><input type="text" class="form-control" placeholder="Enter your answer"><span class="input-group-btn"><button type="button" class="btn btn-default" title="Add a question" data-action="add"><span class="glyphicon glyphicon-plus"></span></button><button type="button" class="btn btn-default" title="Delete this question" data-action="delete" disabled><span class="glyphicon glyphicon-trash"></span></button></span></div>');

        $("#answers button[data-action='add']").one("click", appendAnswer);
    });
};

$("#answers button[data-action='add']").one("click", appendAnswer);

【问题讨论】:

  • 您将附加到每个 answers,而不是附加到答案容器。
  • 你使用one而不是on有什么原因吗?
  • 是的,我使用 .one() 因为我认为这可以解决问题。在此之前,我使用了 .on()。不过问题还是解决了。谢谢!

标签: javascript jquery events listener


【解决方案1】:

使用事件委托

$("#answers").on("click", "button[data-action='add']",appendAnswer);

问题的原因是您在每个循环中的相同元素上绑定了多个事件,因此请删除那里的委托。

.each() 循环中删除下面的这一行

$("#answers button[data-action='add']").one("click", appendAnswer);

DEMO

【讨论】:

  • 谢谢,这很好用。但我不明白怎么做,因为我一直认为如果我动态地将一个元素附加到 DOM,则必须重新附加事件侦听器。编辑:啊,我明白了。现在我了解您的解决方案,这很有意义。感谢您的快速帮助。
【解决方案2】:

这是一个有效的解决方案http://jsfiddle.net/jrxeua6L/4/

var answers = [{
            order: 1,
            content: "placeholder"
        }],
            appendAnswer = function() {

            answers.push({
                order: answers.length + 1,
                content: $(this).parent().prev().val()
            });

            $("#answers").empty();

            $.each(answers, function(key, value) {
                $("#answers").append('<div class="input-group"><input type="text" class="form-control" placeholder="Enter your answer"><span class="input-group-btn"><button type="button" class="btn btn-default" title="Add a question" data-action="add"><span class="glyphicon glyphicon-plus"></span></button><button type="button" class="btn btn-default" title="Delete this question" data-action="delete" disabled><span class="glyphicon glyphicon-trash"></span></button></span></div>');

                //$("#answers button[data-action='add']").on("click", appendAnswer);
            });
        };

        $('body').on("click", "#answers button[data-action='add']", appendAnswer);

【讨论】:

  • 不知道,和Anton提供的方案一样。它也可以正常工作,非常感谢您的帮助!
【解决方案3】:

改变这一行:

$("#answers button[data-action='add']").one("click", appendAnswer);

到这里:

$("#answers button[data-action='add']").off("click").one("click", appendAnswer);

【讨论】:

    猜你喜欢
    • 2018-03-18
    • 2015-11-22
    • 2017-01-08
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多