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
相关产品推荐
相关产品推荐

