当live()调用时,JQuery click()事件触发两次

时间:2012-01-19 04:08:28

标签: jquery

http://pastebin.com/1MGTtzij这是我的完整html文档,下面是简短版本:

    $(document).ready(function () {
        $("#myDiv").append($("<input />", {
                            type : "button",
                            id : "myButton1",
                            value : "Click me first!"
                        }));
        $("#myButton1").live("click", function () {
            var a = 1;
            $("#myButton2").click(function () {
                alert(a);
            });
        });
    });

使用HTML代码:

    <div id="myDiv"></div>
    <input type="button" id="myButton2" value="Click me!" />

页面停止加载并完全显示后,您将看到2个按钮先点击我!点击我!,请在我之后执行:

  1. 点击先点按我! - 没有任何反应 - 确定
  2. 点击点击我! - 提醒1 - 确定
  3. 点击先点按我! - 没有任何反应 - 确定
  4. 点击点击我! - 提醒1 - 提醒1 ???????????? 所以我认识到,如果我点击先点击我 N次,我会收到(N + 1)个提醒。我该如何解决?
  5. 谢谢你们所有人!

3 个答案:

答案 0 :(得分:2)

每次在按钮1上调用单击处理程序时,您都会在按钮2上添加一个新的单击处理程序。这就是它增加的原因。

$("#myButton1").live("click", function () {
    var a = 1;
    // Don't add a new handler here. Move this outside of the `live` call
    $("#myButton2").click(function () {
        alert(a);
    });
});

我已将variable移动到两个按钮的点击处理程序,并将点击处理程序设置移到外面。查看有效的example

答案 1 :(得分:0)

每次单击myButton1时,都会向myButton2添加一个新的.click处理程序。

如果您真的想这样做,可以在$("#myButton2").unbind('click');来电之前执行:$("#myButton2").click

答案 2 :(得分:-1)

这是因为每次clickclick me first!按钮时,点击处理程序都会附加到Click me按钮,并且会继续添加。移动代码以将click事件处理程序附加到外部。试试这个

    $(document).ready(function () {
        $("#myDiv").append($("<input />", {
                            type : "button",
                            id : "myButton1",
                            value : "Click me first!"
                        }));
        $("#myButton1").live("click", function () {
            var a = 1;

        });
        $("#myButton2").click(function () {
                alert(a);
        });
    });