【问题标题】:Running jQuery scripts on DOM elements loaded with AJAX在使用 AJAX 加载的 DOM 元素上运行 jQuery 脚本
【发布时间】:2026-02-09 21:05:02
【问题描述】:

我了解当通过 AJAX 加载 DOM 内容时 jQuery 将不会运行。但我对其中的原因感到困惑。我的理解是,在 jQuery 启动时 DOM 元素不存在,因此它不会找到正确的 ID 或类。

但我有一种情况,即仅在通过 AJAX 加载所有内容之后才调用 jQuery。但是还是不行。

这是我的代码。我试图让函数decorateGains() 在 AJAX 完成后运行。

loadData('7-days'); // Runs the default AJAX for 7 days
function loadData(type){
    var xmlhttp;
    if (window.XMLHttpRequest){xmlhttp=new XMLHttpRequest();}
    else{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");}
    xmlhttp.onreadystatechange=function()
      {
        if (xmlhttp.readyState==4 && xmlhttp.status==200){document.getElementById("home-table").innerHTML=xmlhttp.responseText;}
      }
    xmlhttp.open("GET","actions/get-data-"+type+".php",true);
    xmlhttp.send();
    decorateGains();
}

您可以看到我在 loadData() 函数的末尾包含了对函数 decorateGains() 的调用。

decorateGains() 函数确实运行,因为我可以看到我的控制台消息。然而,它并没有完成它应该完成的任务。

function decorateGains() {
    console.log('here');
    $(".gains").each(function() { 
        var num = +($(this).text());
        if (num > 0) {
            console.log('here');
            $(this).addClass("positive");
        }
        if (num < 0) {
            console.log('here');
            $(this).addClass("negative");
        }
    });
}

(该脚本搜索类为.gains的所有元素,并根据元素的内容添加一个新的positivenegative类。本质上它将.gains元素装饰为红色或绿色取决于数字是负数还是正数)。

【问题讨论】:

  • 您的问题是,ajax 是异步的。所以,DecorateGains(); 在响应到达之前运行。

标签: javascript jquery ajax dom


【解决方案1】:

这是因为 AJAX 调用是异步的。当您调用 decorateGains() 函数时,请求尚未完成(因此新内容尚未附加到 DOM)。在设置innerHTML 之后,您需要在onreadystatechange 处理程序中调用函数:

loadData('7-days'); // Runs the default AJAX for 7 days
function loadData(type) {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            document.getElementById("home-table").innerHTML = xmlhttp.responseText;

            decorateGains(); // <-- move this in here
        }
    }
    xmlhttp.open("GET", "actions/get-data-" + type + ".php", true);
    xmlhttp.send();
}

【讨论】:

  • 谢谢。这是一个很好的解释,并感谢代码示例。我知道是这样的:)
  • @Francesca 完全没问题,很乐意提供帮助。