代码之家  ›  专栏  ›  技术社区  ›  Centro

jQuery removeClass(),工作原理

  •  1
  • Centro  · 技术社区  · 14 年前

    图像加载

    <img class="imageLoading" scr="someimage.png">
    

    加载这些图像后,我将删除该类(简化代码,无详细信息):

     $('img.imageLoading')
             .each(function(){ $(this)
             .load(function(){ $(this)
             .removeClass('imageLoading');
                                   });});
    

    从视觉上看,我看到这种风格被删除了。但当我再次运行查询时:

    $('img.imageLoading')
    

    通过调试,我看到所有图像(不仅仅是加载的图像)都会返回,也就是说,它的工作原理就像我没有删除已加载图像的类一样。 我查看了页面源代码,发现实际上在HTML中,虽然调用了removeClass(),但并没有删除该类。

    升级版

    我还没有解决这个问题,所以发布一些代码来说明它是如何工作的以及问题所在。 我的代码是这样工作的(不重要的细节被删除):

    页面加载后:

        <script type="text/javascript">
           $(function() { processLoadingImages(); })
       </script>
    

    异步调用后:

    function onRequestComplete(result) {
                var div = document.createElement('div');
                div.innerHTML = result;
                document.getElementById('images').appendChild(div);
                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的图像?我调试了 图像已加载 函数(见上文),并且它总是为所有图像调用。

    5 回复  |  直到 14 年前
        1
  •  3
  •   kgiannakakis    14 年前

    在浏览器中查看代码时,可以看到服务器发送的原始代码。您应该看到DOM的一个实例来验证类是否存在。在Firefox中使用Firebug可以很容易地做到这一点。

    除非重新加载了页面,否则新查询不应与imageloading类删除的图像匹配。还要检查运行removeClass方法的代码是否按预期运行。Firebug是测试这种行为的好工具。

        2
  •  3
  •   Samuel De Backer    14 年前

    尝试 .removeClass('imageLoading'); 代替 .removeClass('imageloading');

        3
  •  3
  •   rahul    14 年前

    使用调试实用程序进行检查,如 firebug 观察结果。使用javascript对DOM所做的更改不会反映在页面源代码中。

        4
  •  1
  •   Reigel Gallarde    14 年前

    这种行为是故意的吗 应用视觉变化,但 在HTML中未删除类属性

    回答:

    使用firefox中的firebug,或google chrome中的web开发工具,您可以看到这些更改。。。但不是原始代码的改变。。。

        5
  •  0
  •   Centro    14 年前

    我很抱歉无事生非。我刚刚错误地将jQuery对象传递到子例程中:

    removeImageLoadingClasses(this)
    

    而不是

    removeImageLoadingClasses($(this))
    

    所以现在没事了。