【问题标题】:Unreliable retrieval of properties in images when loading加载时不可靠地检索图像中的属性
【发布时间】:2012-06-08 20:22:20
【问题描述】:

奇怪的问题。我有一组图像,其中包含一些我想在 div 中使用的属性(作为标题)。使用每个,我想获取图像的宽度(和一些其他属性),以正确对齐动态生成的 div(作为图像的标题)。

img = $('img') 
img.each(function(index){
    var width = $(this).width();
    console.log(width);
    // other properties
    $('<div class="caption">Some text</div>').insertAfter($(this));

$(this).next().css({
  'width': width
  // other properties
});

但是,有时 $(this).width() 会得到正确的值,有时会得到 0。当在方向栏中按下返回时表现特别好,但当我按下 Ctrl+R 但仅在 Chrome 中时则不然。它在所有浏览器中的工作方式都不一样,所以很乱。我认为 Jquery 试图在加载图像之前检索 width(),所以我将代码包装在 document.ready(function(){}) 而不是 (function(){})() 但它不起作用无论哪种方式。

会发生什么?作为参考,这些是应用于图像的样式:

display: block;
padding: 4px;
line-height: 1;
max-width: 100%;
margin-left: auto;
margin-right: auto;

所以我想获得计算出的宽度(据我所知,它应该由 .css() 检索,但在这种情况下,不一致)。

问候

【问题讨论】:

  • 查看这个问题的答案:stackoverflow.com/questions/7983278/…
  • 不确定你的意思。宽度()与 CSS('宽度')?
  • .outerWidth() 得到计算出来的尺寸。
  • 不,这根本行不通。

标签: javascript jquery html css image


【解决方案1】:

jQuery 不会等待 $(document).ready() 中的图像。
请尝试使用$(window).load(),如示例 5 中所述 here

【讨论】:

  • $(window).ready$(document).ready 完全相同,请阅读此处:stackoverflow.com/questions/10753306/… 也许您的意思是$(window).load
  • 有趣。 .load() 在 Chrome 中修复了它,但在 Firefox 中没有。它正确设置了宽度(),但我正在谈论的其他属性(左边距,右边距)设置为 0,而在 Chrome 中它们具有正确的值。
  • 不,抱歉……在 Chrome 中还有最后一张图片有点不可靠。
【解决方案2】:

当您运行该代码时,很可能图像并未始终完全加载。尝试确保首先加载图像。

function imgDone(){
    var width = $(this).width();
    console.log(width);
    // other properties
    $('<div class="caption">Some text</div>').insertAfter($(this));
}
$('img').each(function(index){
    if (this.complete || this.readyState = 4)
        imgDone.apply(this);
    else
        $(this).load(function(){
            imgDone.apply(this);
        });
});

【讨论】:

  • 好,我会试试的。这似乎是问题,因为根据 Andreas 的建议, .load 在 Chrome 中修复了它,但在具有其他属性的 Firefox 中没有修复它。
  • 太好了,现在一直在 Chrome 中工作(我认为),但由于某种原因,即使我删除了与宽度相关的所有内容(可能我做了一个错误,因为这没有意义。
  • 不,你是对的。正如我所想,我犯了一个愚蠢的错误,我没有设置 width: 100% 所以图像溢出了很多。然而我不明白你的代码的第二部分......你说,检查每张图片,看看它是否已经完全加载。如果有,请执行 Jquery 部分或其他任何操作,但如果没有...什么? $(this).load 不等同于 this.complete || this.readyState 或有什么区别?。
  • .load 在图像上使用时将在图像完成加载时触发。 complete 和 readystate 条件检查图像是否已经加载,在这种情况下,加载事件在某些情况下可能不会触发(取决于添加加载事件与设置 src 值的顺序)。您也许可以摆脱 if 语句并简单地使用 .load(onDone),确保在 IE8 中测试它
  • 这真的应该是if条件下的赋值吗?
猜你喜欢
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多