我的页面上有图片。用户可以通过单击按钮将更多图像添加到页面上。新图像是异步添加的。最初,页面上的每个图像都使用一个特殊的类,以便在加载图像时使用。加载图像后,该类将被删除。 每个正在加载的图像都有 imageLoading 类:
<img class="imageLoading" scr="someimage.png">
加载这些图像后,我删除了该类(没有详细信息的简化代码):
$('img.imageLoading')
.each(function(){ $(this)
.load(function(){ $(this)
.removeClass('imageLoading');
});});
在视觉上,我看到样式已被删除。但是当我再次运行查询时:
$('img.imageLoading')
我通过调试看到返回了所有图像,而不仅仅是加载图像,即它的工作方式就像我没有删除已加载图像的类一样。 我查看了页面源代码,发现实际上在 HTML 中,尽管调用了 removeClass(),但该类并未被删除。
这种设计行为是否应用了所有视觉更改但未在 HTML 代码中删除类属性?如果是这样,在这种情况下如何解决。或者,我可能错过了什么。
UPD 源代码
我还没有解决问题,所以发布一些代码来说明它是如何工作的以及问题出在哪里。 我的代码以这种方式工作(删除了不重要的细节):
加载图片处理:
页面加载后:
<script type="text/javascript">
$(function() { processLoadingImages(); })
</script>
异步调用后:
function onRequestComplete(result) {
var div = document.createElement('div');
div.innerHTML = result;
document.getElementById('images').appendChild(div);
processLoadingImages();
}
通过processLoadingImages 函数处理图像:
function processLoadingImages() {
$('img.loadingImage').each(function() {
if (!imageLoaded($(this)[0])) {
$(this).hide()
.load(function() {
removeImageLoadingClasses(this);
$(this).fadeIn();
});
}
else {
removeImageLoadingClasses(this);
}
});
}
function removeImageLoadingClasses(jqueryObj) {
jqueryObj.removeClass('loadingImage');
jqueryObj.parents('div').removeClass('loadingImageContainer');
}
function imageLoaded(img) {
if (!img.complete)
return false;
if (typeof img.naturalWidth != 'undefined' && img.naturalWidth == 0)
return false;
return true;
}
如您所见,对于每个图像都有一个 div 容器,其中包含一个类,该类已为加载的图像删除。 我如何检查查询是否返回所有图像,甚至是那些调用了 removeClass 的图像?我调试了 imageLoaded 函数(见上文),它总是为所有图像调用。
最佳答案
当您在浏览器中查看代码时,您会看到服务器发送的原始代码。您应该看到一个 DOM 实例以验证该类是否存在。您可以在带有 Firebug 的 Firefox 中轻松做到这一点。
除非您重新加载了页面,否则新查询不应匹配已删除图像加载类的图像。还要检查运行 removeClass 方法的代码是否按预期运行。 Firebug 是测试此类行为的绝佳工具。
关于jQuery removeClass(),它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051723/