能否为AJAX加载的DIV元素使用removeClass方法?
解决AJAX加载元素使用removeClass的问题
当然可以给AJAX加载的DIV元素使用removeClass方法!你的代码思路没问题,但有个上下文指向错误导致功能失效,我来帮你修正并解释清楚:
问题根源
在$.get的回调函数里,$(this)已经不再指向原来的.message元素了——回调函数的执行上下文和外部each循环里的上下文是完全独立的,所以你调用$(this).removeClass(...)其实是在操作一个无关的对象,自然看不到效果。
修复后的代码
我们只需要在each循环里先把当前的.message元素引用保存到一个变量中,之后在回调里直接使用这个变量即可:
setInterval(function() { $('.message').each(function() { // 先把当前的message元素存起来,避免上下文丢失 var $currentMessage = $(this); var message_id = $currentMessage.data('id'); if ($currentMessage.hasClass('message-not-read')) { $.get('message-set-read.php?message-id=' + message_id, function(data) { if (data == 'is-set-read') { // 使用提前保存的元素引用操作 $currentMessage.removeClass('message-not-read'); } }); } }); }, 5000);
额外优化建议
为了避免重复请求(比如5秒内前一次请求还没完成,下一轮询又触发),可以给元素添加一个"处理中"的标记类,防止重复处理:
setInterval(function() { $('.message').each(function() { var $currentMessage = $(this); var message_id = $currentMessage.data('id'); // 只有未读且未在处理中的消息才会触发请求 if ($currentMessage.hasClass('message-not-read') && !$currentMessage.hasClass('processing')) { $currentMessage.addClass('processing'); $.get('message-set-read.php?message-id=' + message_id, function(data) { if (data == 'is-set-read') { $currentMessage.removeClass('message-not-read'); } }) // 请求成功或失败都要移除处理标记 .always(function() { $currentMessage.removeClass('processing'); }); } }); }, 5000);
这样修改后,AJAX加载的.message元素就能正常被移除message-not-read类了!
内容的提问来源于stack exchange,提问作者medk
相关产品推荐
相关产品推荐

