javascript - 当我单击时,通过 on 的单击事件会一次又一次附加单击事件

标签 javascript jquery html

我有以下 html

<div class="connect">
                <ul>
                    <li><a href="#">Assign a Task</a></li>
                    <li><a attr="viewCard" href="#">View Card</a></li>
                    <li><a href="#">Edit</a></li>
                </ul>
            </div>

我写了一些 javascript

$MyContacts = function () {

    var attachEvents = function () {
        $("#ContactProfile").on("click", clickedOnContactProfileCard);

    };

    var clickedOnContactProfileCard = function (event) {
        if (event.target.localName.toLowerCase() == "a") {

            var currObj = $(event.target);

            alert(currObj.attr("attr").toLowerCase());
            if (currObj.attr("attr").toLowerCase() === "viewcard") {
                currObj.click(function () {
                    alert("aaa");
                    $("#dialog-form").dialog({
                        resizable: false,
                        zIndex: 9999,
                        fontSize: 5,
                        modal: true,
                        height: 300,
                        width: 350,
                        buttons: {
                            "Save": function () { }
                        },
                        Cancel: function () {
                            $(this).dialog("close");
                        },
                        close: function () {

                        }
                    });
                });
            }
        }
    };

    var returnElement = {
        attachEvents: attachEvents
    };

    return returnElement;
}();

当我第一次单击“viewCard”链接时,它在警报中仅显示“viewcard”。当我第二次单击时,它会在警报中显示“aaa”并打开对话框。当我第三次单击时,警报中显示“aaa”两次。当我第三次单击时,有时会在警报中显示“viewcard”,然后在警报中显示两到三次“aaa”。

你能帮我解决我犯的错误吗

最佳答案

您多次绑定(bind)事件。因此你得到了这个结果。您可以使用.off()删除事件处理程序。

您的直接解决方案是

currObj.off('click').click(function () { 

而不是

currObj.click(function () {

注意:我还建议您使用 data-* 前缀属性

<li><a attr="viewCard" href="#">View Card</a></li>

使用

<li><a data-attr="viewCard" href="#">View Card</a></li>

可以使用.data()检索

<小时/>

但是如果我的控件是动态的,那么我如何仅使用 .click() 附加事件。

您需要使用Event Delegation 。您必须使用.on()使用委托(delegate)事件方法。

一般语法

$(document).on(event, selector, eventHandler);

理想情况下,您应该将 document 替换为最接近的静态容器。

Delegated events have the advantage that they can process events from descendant elements that are added to the document at a later time.

关于javascript - 当我单击时,通过 on 的单击事件会一次又一次附加单击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24415836/

相关文章:

javascript - 未捕获类型错误 : Cannot read property, JS 在页面渲染之前执行

javascript - 按键 - 转义不起作用

html - 如何使旋转木马字幕出现在顶部?

javascript - 何时在 JavaScript 中使用 self

Javascript onclick,如何为某些元素设置不同的 alpha?

javascript - 仅在当前单击的 Div 上叠加图像 - Javascript

html - 如何(以编程方式)在 HTML 表格条目之间绘制箭头?

javascript - 动态更改 CTA 按钮链接(在 iOS 或 Android 或网页上)?

javascript - 为什么可以使用 .length 检查 Javascript 中是否存在数组

html - href 中的 3 个跨度与 img 垂直对齐