jquery 事件处理程序在html重新呈现后不再工作

eqzww0vc  于 2023-04-20  发布在  jQuery
关注(0)|答案(2)|浏览(96)

我的js文件中有以下结构:

$.getJSON("data/file.json")

.done(function(data) {
    var loadHTMLfunction =  /* some code */
    loadHTMLfunction();
    
    // updates display based on user filter selection
    $("#select-section").on("change", function() {
        $("article").find(".myClass").remove();
        loadHTMLfunction();
    });

    // text swap event
    $(".summary-link").on("click", function() {
        var el = $(this),
        tmp = el.text();
        el.text(el.data("text-swap"));
        el.data("text-swap", tmp);
    });
})

.fail(function(jqxhr, textStatus, error) {
     // error handling   
});

我的问题是,当页面第一次加载时,我的文本交换事件工作得很好,但一旦用户使用选择事件(该事件是一个选择html元素以更新显示),它就不再工作了。
是我的js文件结构有问题,还是我的代码有问题(或者两者都有!)?

91zkwejq

91zkwejq1#

我觉得你的函数耦合太紧了。一旦$.getJSON.done,你就应该把数据赋值给一个变量,并在 AJAX 调用的作用域之外绑定你的事件处理程序。代码的重构版本可能看起来像这样:

(function() {
    var storedData;

    $.getJSON("data/file.json", function(data) {
        storedData = data;
    });
    .error(function(jqXHR, textStatus, errorThrown) { 
        alert("error: " + textStatus + ", Description: " + jqXHR.responsetext); 
    });

    var loadHTMLfunction = function() {
        // your code
    };

    loadHTMLfunction(); // You ought to tell us what this function is
                        // else we don't know if it's redundant or not 
                        // to run so repetitively.

    $("#select-section").on("change", function() {
        $("article").find(".myClass").remove();
        loadHTMLfunction(); // I feel like this is an issue.
    });

    $(".summary-link").on("click", function() {
        var el = $(this),
        tmp = el.text();
        el.text(el.storedData("text-swap"));
        el.storedData("text-swap", tmp);
    });
}());
yyhrrdl8

yyhrrdl82#

你应该包括

// text swap event
    $(".summary-link").on("click", function() {
        var el = $(this),
        tmp = el.text();
        el.text(el.data("text-swap"));
        el.data("text-swap", tmp);
    });

在函数loadHTMLfunction中。

loadHTMLfunction = function(){
    //your code
    // text swap event
        $(".summary-link").on("click", function() {
            var el = $(this),
            tmp = el.text();
            el.text(el.data("text-swap"));
            el.data("text-swap", tmp);
        });
}

您可能正在执行一些删除元素“.summary-link”的操作,并且您只是第一次绑定事件。

相关问题