You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态创建元素无法响应show/hide函数的技术求助

问题排查与解决方案

你遇到的问题核心原因是Ajax成功回调函数里的this指向已经不是触发事件的原元素了,导致$(this).data("seq")无法获取到正确的sequence值,自然找不到对应的输入框和文本元素,所以显示状态没有变化。下面给你几种解决方法,以及额外的验证步骤:

方法一:提前保存原元素的引用

在发起Ajax请求之前,把当前元素的引用存到一个变量里,这样在回调函数里就能正常访问它:

// 先保存当前元素的引用和sequence值
var $currentElement = $(this);
var targetSeq = $currentElement.data("seq");

$.ajax({
    url : '/section/projects',
    type: "GET",
    data: {
        "action": "update_deadline",
        "sequence": targetSeq,
        "deadline": $currentElement.val(),
    },
    success: function(data) {
        console.log("success");
        // 直接使用提前保存的sequence值
        $("#deadline_input_" + targetSeq).hide();
        $("#deadline_text_" + targetSeq).show();
    },
    error: function(err) {
        alert("There was an error updating the Project");
    }
});

方法二:设置Ajax的context选项

jQuery的Ajax配置里有个context参数,可以指定回调函数里this的指向,把它设为当前元素即可:

$.ajax({
    url : '/section/projects',
    type: "GET",
    context: this, // 关键:指定回调里的this指向触发事件的原元素
    data: {
        "action": "update_deadline",
        "sequence": $(this).data("seq"),
        "deadline": $(this).val(),
    },
    success: function(data) {
        console.log("success");
        // 现在这里的this就是原元素了,可以正常获取sequence值
        $("#deadline_input_" + $(this).data("seq")).hide();
        $("#deadline_text_" + $(this).data("seq")).show();
    },
    error: function(err) {
        alert("There was an error updating the Project");
    }
});

额外验证步骤

如果用了上面的方法还是没效果,可以做以下检查:

  • 在success回调里打印targetSeq(或$(this).data("seq"))的值,确认它和你动态生成元素时的data[i].data.sequence完全一致;
  • 打印$("#deadline_input_" + targetSeq),看控制台输出的jQuery对象长度是否为1,确认元素确实存在(比如有没有拼写错误,deadline_input是否和生成时的id完全匹配);
  • 可以尝试直接写死一个已知的sequence值(比如$("#deadline_input_1").hide()),看是否能生效,排除选择器以外的问题。

内容的提问来源于stack exchange,提问作者charlie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 12:07:31