Javascript/jQuery弹出循环和添加

Javascript/jQuery弹出循环和添加,javascript,jquery,html,Javascript,Jquery,Html,首先,我对编程很陌生,所以请温柔一点。堆栈溢出对我来说是一个极好的资源,所以感谢所有的贡献者 这一个我无法破解,而且它是一个很难搜索的项目,正如你可能从神秘的标题中可以看出的 无论如何,我有一个jQuery弹出函数,它可以从events.register控件调用。本质上,每当用户单击地图时,它都会向web服务发送请求,获取数据,填充表单,然后用户可以与表单交互并将数据保存回SQL 它运行得非常好,我对它的进展感到高兴 其中一个功能是更改表中的值,我希望用户得到一个提示,以确保他们不会意外地保存他

首先,我对编程很陌生,所以请温柔一点。堆栈溢出对我来说是一个极好的资源,所以感谢所有的贡献者

这一个我无法破解,而且它是一个很难搜索的项目,正如你可能从神秘的标题中可以看出的

无论如何,我有一个jQuery弹出函数,它可以从events.register控件调用。本质上,每当用户单击地图时,它都会向web服务发送请求,获取数据,填充表单,然后用户可以与表单交互并将数据保存回SQL

它运行得非常好,我对它的进展感到高兴

其中一个功能是更改表中的值,我希望用户得到一个提示,以确保他们不会意外地保存他们不打算保存的内容。它在刷新后第一次工作得很好,但是每次之后它都会添加一个确认,然后再次添加,直到最后在第五次之后,有5个确认一个接一个地出现。一旦用户点击它们,代码就可以正常运行,我得到了预期的结果

我只打了一次确认电话(我想是吧?),但是,是的,我迷路了,这是我的函数,如果很难阅读或格式不好,很抱歉:

function popup() {
        j = jQuery.noConflict();
        j(document).ready(function() {
            //open popup
            j("#detailsform").height(250);
            j("#detailsform").fadeIn(1000);
            positionPopup();
            document.getElementById("condition").value = getCondition;
            j("#selCatHead").hide();
            j("#cats").hide();
            //dispose tree
            j("#dispose").click(function() {
                if (confirm("Are you sure?")) {
                    disposetree();
                }
                else { return false; };
            });
            //save defect
            j("#savedef").click(function() {
                saveDef();
            });
            //fade in defects
            j("#adddefect").click(function() {
                j("#detailsform").height(400);
                j("#selCatHead").fadeIn(1000);
                j("#cats").fadeIn(1000);
            });
            //fade out popup
            j("#close").click(function() {
                j("#detailsform").fadeOut(500);
            });
        });          // close document ready function

        //position the popup at the center of the page
        function positionPopup() {
            if (!j("#detailsform").is(':visible')) {
                return;
            }
            j("#detailsform").css({
                left: (j(window).width() - j('#detailsform').width()) / 2,
                top: (j(window).width() - j('#detailsform').width()) / 7,
                position: 'absolute'
            });
        } // close positionPopup function

        //maintain the popup at center of the page when browser resized
        j(window).bind('resize', positionPopup);

    }; // close popup function
编辑:多亏了@jfriend00,每次都从弹出调用中删除了函数并关闭了处理程序,例如:

function popup() {
        j = jQuery.noConflict();
        j(document).ready(function() {
            //open popup
            j("#detailsform").height(250);
            j("#detailsform").fadeIn(1000);
            //dispose
            j("#dispose").off();
            j("#dispose").click(function() {
                disposeClickHandle();
            });
            //save
            j("#savedef").off();
            j("#savedef").click(function() {
                saveDef();
            });
        }); 
然后:

function disposeClickHandle() {
        if (confirm("Are you sure?")) {
            disposetree();
        }
        else { return false; };
    };  

您应该只安装一次单击处理程序。如果您多次安装,它将触发多次


因此,每次调用
popup()
函数时,它都会安装另一个单击处理程序。然后,当您单击时,单击处理程序将触发多次。您应该将您的单击处理程序安装移到您多次调用的函数之外,并将其放入一个初始化函数中,该函数在开始时只调用一次,或者您可以在操作后删除单击处理程序,以便再次安装时,只安装一次。

谢谢您的回复@jfriend00!谢谢你的时间。你的意思是在弹出窗口中每个元素只点击一次(function()),还是整个函数只点击一次?如果是这样,当用户点击一个元素时,触发其他函数的方法是什么?再次感谢!如果我得到了它,我将对它进行破解并返回。@MorganEllingham-only call
。点击(fn)
每个元素调用一次。如果您多次调用它,那么它会在单击内容时多次调用您的回调函数。再次感谢@jfriend00。我已经完成了您的两项建议,将函数移到弹出调用之外,并在每次安装之前关闭了单击函数。我希望这是ri唉!现在很好用。