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

Laravel项目中jQuery无法通过父级查找定位对应新闻div问题求解

问题原因

核心问题是回调函数的this指向错误:
点击事件回调里的this原本指向触发点击的.del_news删除按钮,但进入jQuery AJAX的success、error回调后,默认this指向的是AJAX请求的配置对象,不再是原删除按钮元素,因此$(this).closest('.news_card')无法匹配到任何元素,后续的淡出、移除逻辑自然不会生效。
另外原有代码中fadeOut的回调逻辑也存在错误:fadeOut方法的回调里this本身就是正在执行动画的.news_card元素,再调用$(this).closest('.news_card')会找不到上层匹配元素,无法执行移除操作。

修复方案

推荐使用「提前存储元素引用」的方案,兼容性最好,逻辑也清晰:
在AJAX请求外提前把要操作的删除按钮、新闻卡片的jQuery对象存下来,回调里直接调用存储的对象即可,不需要依赖this指向。

修复后的完整代码如下:

<!-- 补充优化:自定义属性改为data-前缀符合HTML规范 -->
<div class="news_card" data-news-id="{ID}">
    **(SOME CONTENT....)**
    <a href="javascript:" class="btn_delete del_news"><i class="icon-trash"></i><span>Delete</span></a>
</div>
$(".del_news").on('click', function(event) {
    // 提前存储元素引用,避免this指向问题
    const $delBtn = $(this);
    const $newsCard = $delBtn.closest(".news_card");
    $delBtn.css("pointer-events","none");
    // 用data方法获取自定义属性更规范
    const ld = $newsCard.data("news-id");
    $.ajax({
        type: 'GET',
        url: '{{ url("/news/delete") }}',
        data: {id: ld},
        success: function(response) {
            if(response.status == 1) {
                $newsCard.fadeOut(1200, function() { 
                    // 这里this就是当前动画的news_card,直接移除即可
                    $(this).remove(); 
                });
            }
            $delBtn.css("pointer-events","auto");
        }, 
        error: function (xhr, ajaxOptions, thrownError) {
            console.log(xhr.status);
            console.log(thrownError);
            $delBtn.css("pointer-events","auto");
        }
    });
});

其他可选修复方案:

  • 用ES6箭头函数作为AJAX回调:箭头函数会继承外层作用域的this,不会修改指向
  • 给AJAX配置添加context: this参数,指定所有回调的this指向外层点击事件的this

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:45:03