Javascript 从函数本身调用函数

Javascript 从函数本身调用函数,javascript,jquery,Javascript,Jquery,容器中有几个元素。它们的所有事件都在函数events中处理 单击容器内的一个按钮,我就用AJAX请求的响应替换容器的html function events() { $(".btn").on("click", function() { ... }); $(".txt").on("keyup", function() { ... }); $(".btn2").on("click", function() {

容器中有几个元素。它们的所有事件都在函数events中处理

单击容器内的一个按钮,我就用AJAX请求的响应替换容器的html

function events() {
    $(".btn").on("click", function() {
     ...
    }); 

    $(".txt").on("keyup", function() {
     ...
    });

    $(".btn2").on("click", function() {
                var xmlhttp;
                if (window.XMLHttpRequest) {
                    xmlhttp = new XMLHttpRequest();
                }
                xmlhttp.onreadystatechange = function() {
                    if (xmlhttp.readyState == 4) {
                       $(".container").html(xmlhttp.responseText); 
                       events(); // ***
                    }
                }
                url = 'handlers/gethtml.ashx';
                xmlhttp.open("GET", url, true);
                xmlhttp.send(null);
        });
}
现在,我需要用事件重新绑定所有控件,以便在更改html$.container.htmlxmlhttp.responseText;我调用函数本身,因为新的html包含具有相同事件的相同控件


这会导致堆栈溢出吗?我有一些性能问题,所以我想知道这是否是原因。另外,是否有任何解决方法,或者更优雅的方法来实现这一点?

使用事件委派,然后无需重新绑定事件,因为它也将处理动态元素

通过使用jquery加载url内容,可以进一步缩短代码

function events() {
    var ct = $(".container");
    ct.on("click", ".btn", function() {
    }); 

    ct.on("keyup", ".txt", function() {
    });

    ct.on("click", ".btn2", function() {
        ct.load('handlers/gethtml.ashx')
    }

使用事件委派,则无需重新绑定事件,因为它也将处理动态元素

通过使用jquery加载url内容,可以进一步缩短代码

function events() {
    var ct = $(".container");
    ct.on("click", ".btn", function() {
    }); 

    ct.on("keyup", ".txt", function() {
    });

    ct.on("click", ".btn2", function() {
        ct.load('handlers/gethtml.ashx')
    }

尝试使用事件委派,无需再次绑定事件

$(".container").on("click",".btn2", function() {...});

尝试使用事件委派,无需再次绑定事件

$(".container").on("click",".btn2", function() {...});
打电话就行了。它在范围之内

不过,您需要注意以下几点:

已经存在的元素在第二次运行时将有两个单击处理程序-旧的和新的。例如,要消除它们,请使用“取消绑定”取消绑定所有单击事件。 您可能希望进一步拆分事件创建函数。 打电话就行了。它在范围之内

不过,您需要注意以下几点:

已经存在的元素在第二次运行时将有两个单击处理程序-旧的和新的。例如,要消除它们,请使用“取消绑定”取消绑定所有单击事件。 您可能希望进一步拆分事件创建函数。
$.container.on要好得多。@JamesMontagne不是$.container.on,与var ct=$.container相同;ct.on?@enb081答案已被编辑。它是$document.on.$.container.on要好得多。@JamesMontagne与var ct=$.container不同,它不是$.container.on;ct.on?@enb081答案已被编辑。它是$document.on.if check if window.XMLHttpRequest{如果您没有在else中检查activeX,则没有任何意义。而且您正在使用jQuery,那么您到底为什么不使用$.get?只是想知道-当您使用jQuery时,为什么要使用本机XMLHttpRequest?使用$。ajax@epascarello我对ajax不太了解,只要需要,我就复制相同的代码。从现在开始,我将使用$.gete if检查是否window.XMLHttpRequest{如果您没有在else中检查activeX,则没有任何意义。而且您正在使用jQuery,那么您到底为什么不使用$.get?只是想知道-当您使用jQuery时,为什么要使用本机XMLHttpRequest?使用$。ajax@epascarello我对ajax不太了解,只要需要,我就复制相同的代码。从现在开始,我将使用$.get