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

Django中Ajax仅执行一次问题:删除收藏项后无法再次删除

嘿,这明显是动态元素的事件绑定踩坑了!我来给你捋清楚:

问题根源

第一次页面加载时,那些.substitut删除按钮已经在DOM里了,所以你直接给.substitut绑定click事件完全没问题。但你用$("#fav_list").load()刷新列表后,新生成的按钮是动态添加到DOM中的新元素,它们根本没被绑定过你写的点击事件,自然点了没反应。

解决办法:用事件委托

事件委托就是把事件绑定在一个从页面加载就存在的静态父元素上(比如你的#fav_list,它不会被刷新替换掉),让父元素去监听子元素的点击行为。这样不管子元素是一开始就有,还是后来动态生成的,事件都能被触发。

把你的AJAX代码改成这样就行:

// 绑定到静态父元素#fav_list,监听它下面的.substitut按钮点击
$("#fav_list").on('click', '.substitut', function(event) {
    event.preventDefault();
    var product = $(this).val();
    var url = '/register/delete/';
    $.ajax({
        url: url,
        type: "POST",
        data:{
            'product': product,
            'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val()
        },
        datatype:'json',
        success: function(data) {
            if (data['success'])
                $("#fav_list").load(" #fav_list > *");
        }
    });
});

额外小建议

你现在把{% csrf_token %}塞在按钮标签里,虽然能拿到token,但这种写法有点别扭。建议把csrf token放在页面的<form>里,或者直接放在<body>开头的位置,这样DOM结构更规范,也不容易出问题。如果#fav_list本身也是动态生成的,那就把事件委托绑定到更上层的静态元素(比如$("body")),不过尽量绑定离目标元素最近的静态父元素,性能会更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:07:30