jquery data() 方法并不总是有效?

发布于 2024-10-08 14:28:02 字数 1852 浏览 1 评论 0原文

我在创建可靠的 jquery 代码(将图像大小调整为其父 div 的宽度)时遇到了非常严重的问题。有时它有效,有时却不起作用。起初我以为 IE 只是打扰我,但有时 safari、firefox 或 chrome 也不会触发我的方法。

    $(".post-body img").each(function() {  
        $(this).data('width', $(this).width());
        $(this).data('height', $(this).height());
    });

我将宽度和高度宽度数据方法保存在我的 window.load - 函数中。

之后,我调用 setimgwidth() 函数。

function setimgwidth() {
    var bw = $('.post-body').width();
    $(".post-body img").each(function() {   
            if (bw < $(this).data('width')) {
                $(this).attr( 'width', Math.round(bw) );
                //calculate ratio height
                var newHeight = (bw / $(this).data('width')) * $(this).data('height');
                $(this).attr( 'height', Math.round(newHeight) );
            }
    });
}

所以我检查父 div 是否小于其内部的图像,图像应调整为父 div 的宽度。

我只是不明白为什么这种方法并不总是有效。有时图像会调整大小,有时不会。

你看到什么奇怪的了吗?有什么你会做得更好的吗? 还有其他方法吗?

谢谢

编辑:

jQuery(function($){//document ready

    $(window).load(function(){

        //Save the original image width
        $(".post-body p img, .post-body .wp-caption img").each(function() {  
            $(this).data('width', $(this).width());
            $(this).data('height', $(this).height());
        });

        //window resize event
        $(window).resize(function() {
            setimgwidth();
        });

        //set image width inside of .post-body
        function setimgwidth() {
            $(".post-body p img, .post-body .wp-caption img").each(function() {
                console.debug($(this).data('width'));
                console.debug($(this).data('height'));
            });
        }

        //call image-resize functions onload
        setimgwidth();

    });

});//document ready

控制台总是告诉我图像的宽度和高度为0。

i'm having really bad problems in creating reliable jquery code that resizes images to the width of it's parent div. sometimes it's working sometimes just not. at first i thougth IE is just bugging me, however there are times that safari, firefox or chrome are not firing my method as well.

    $(".post-body img").each(function() {  
        $(this).data('width', $(this).width());
        $(this).data('height', $(this).height());
    });

i'm saving the width and height width the data method in my window.load - function.

after that, i'm calling the setimgwidth() function.

function setimgwidth() {
    var bw = $('.post-body').width();
    $(".post-body img").each(function() {   
            if (bw < $(this).data('width')) {
                $(this).attr( 'width', Math.round(bw) );
                //calculate ratio height
                var newHeight = (bw / $(this).data('width')) * $(this).data('height');
                $(this).attr( 'height', Math.round(newHeight) );
            }
    });
}

so i'm checking if the parent div is smaller than the image inside of it, the image should resize to the width of the parent div.

I just cannot find out, why this method is not ALWAYS working. Sometimes the images resize, sometimes not.

do you see anything weird? anything you would do better?
some other methods?

thank you

edit:

jQuery(function($){//document ready

    $(window).load(function(){

        //Save the original image width
        $(".post-body p img, .post-body .wp-caption img").each(function() {  
            $(this).data('width', $(this).width());
            $(this).data('height', $(this).height());
        });

        //window resize event
        $(window).resize(function() {
            setimgwidth();
        });

        //set image width inside of .post-body
        function setimgwidth() {
            $(".post-body p img, .post-body .wp-caption img").each(function() {
                console.debug($(this).data('width'));
                console.debug($(this).data('height'));
            });
        }

        //call image-resize functions onload
        setimgwidth();

    });

});//document ready

console always tells me that the width and height of the image is 0.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倒数 2024-10-15 14:28:02

在一个地方您使用 $(this).attr('width');,而在另一个地方您使用 $(this).width()。尝试 .width().height(),我相信您应该在这两个地方使用它们:

$(".post-body img").each(function() {  
    $(this).data('width', $(this).width());
    $(this).data('height', $(this).height());
});

$(".post-body img").each(function() {   
        if (bw < $(this).data('width')) {
            $(this).width(Math.round(bw));
            //calculate ratio height
            var newHeight = (bw / $(this).data('width')) * $(this).data('height');
            $(this).height(Math.round(newHeight));            
        }
});

另外(也许不相关)您不应该更改尺寸后要为每个图像设置数据宽度和高度属性吗?

$(".post-body img").each(function() {   
        if (bw < $(this).data('width')) {
            $(this).width(Math.round(bw));
            //calculate ratio height
            var newHeight = (bw / $(this).data('width')) * $(this).data('height');
            $(this).height(Math.round(newHeight));
            $(this).data("width", Math.round(bw));
            $(this).data("height", newHeight);
        }
});

最后,我希望您按照 @Emmett 在他的评论中建议的那样存储加载时的图像尺寸:

$(".post-body img").load(function() {  
    $(this).data('width', $(this).width());
    $(this).data('height', $(this).height());
});

记住 width()height() 返回实际内容的宽度和高度,无论 CSS 属性如何,因此只有在内容/图像或其他内容完全加载后才应捕获这些值。

In one place you are using $(this).attr('width');, whereas in another you are using $(this).width(). Try .width() and .height(), which I believe are the ones you should be using, in both places:

$(".post-body img").each(function() {  
    $(this).data('width', $(this).width());
    $(this).data('height', $(this).height());
});

$(".post-body img").each(function() {   
        if (bw < $(this).data('width')) {
            $(this).width(Math.round(bw));
            //calculate ratio height
            var newHeight = (bw / $(this).data('width')) * $(this).data('height');
            $(this).height(Math.round(newHeight));            
        }
});

Also (perhaps not relevant) shouldn't you be setting the data width and height attributes for each image after you change their dimensions?

$(".post-body img").each(function() {   
        if (bw < $(this).data('width')) {
            $(this).width(Math.round(bw));
            //calculate ratio height
            var newHeight = (bw / $(this).data('width')) * $(this).data('height');
            $(this).height(Math.round(newHeight));
            $(this).data("width", Math.round(bw));
            $(this).data("height", newHeight);
        }
});

And finally, I hope you are storing the image dimensions onload as @Emmett suggested in his comment:

$(".post-body img").load(function() {  
    $(this).data('width', $(this).width());
    $(this).data('height', $(this).height());
});

Remember that width() and height() return the actual content width and height, regardless of CSS properties, so those values should only be captured once the content/images or whatever have been fully loaded.

清君侧 2024-10-15 14:28:02

代码审查(这不是答案)

我重构了您的代码。我相信现在它的可读性要高得多。

function setImgWidth() {
    var b = $(".post-body");
    var bw = b.width();

    b.find("img").each(function() {
            var t = $(this);
            var tw = t.data("width");
            var th = t.data("height");

            if ( bw < tw ) {
                t
                    .width(Math.round(bw))
                    .height(Math.round((bw / tw) * th));
            }
    });
}

Code-review (This is not an answer)

I re-factored your code. I believe it is considerably more readable now.

function setImgWidth() {
    var b = $(".post-body");
    var bw = b.width();

    b.find("img").each(function() {
            var t = $(this);
            var tw = t.data("width");
            var th = t.data("height");

            if ( bw < tw ) {
                t
                    .width(Math.round(bw))
                    .height(Math.round((bw / tw) * th));
            }
    });
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文