【问题标题】:Different result for Image width and height each time in JQueryJQuery中每次图像宽度和高度的不同结果
【发布时间】:2015-06-14 07:22:00
【问题描述】:

这对我来说很奇怪,因为我正在更改在 document.ready() 中运行的加载图像的宽度和高度。 每次函数运行,图片的宽高都不一样。

我使用此代码获取加载图像的宽度和高度:

    var img = document.getElementById('imgLogo');
    var width = img.clientWidth;
    var height = img.clientHeight;

这是代码sn-p:

$(document).ready(function() {
  SetLogo();
});

function SetLogo() {

  var src = 'https://www.gstatic.com/webp/gallery/3.sm.jpg';
  $('#imgLogo').attr("src", src);

  if (src == "") {

    $('#dvimg').addClass("hidden");
  } else {

    $('#dvimg').removeClass("hidden");

    var panel = document.getElementById('dvimg');
    var pwidth = panel.clientWidth;
    var pheigh = panel.clientHeight;

    var img = document.getElementById('imgLogo');
    alert("image w= " + $('#imgLogo').width() + " image H= " + $('#imgLogo').height());


    var ratio = img.clientWidth / img.clientHeight;

    if (img.clientWidth > pwidth) {
      alert('width > pwidth');
      $('#imgLogo').height(pwidth / ratio);
      $('#imgLogo').width(pwidth);

      $('#dvimg').css("padding-top", (pheigh - img.clientHeight) / 2);
      $('#dvimg').css("padding-left", 0);
    } else if (img.clientHeight > pheigh) {

      alert('height > pheigh');

      $('#imgLogo').height(pheigh);
      $('#imgLogo').width(pheigh * ratio);

      $('#dvimg').css("padding-left", (pwidth - img.clientWidth) / 2);

      $('#dvimg').css("padding-top", 0);
    } else {
      alert('else');
      $('#dvimg').css("padding-top", (pheigh - img.clientHeight) / 2);
      $('#dvimg').css("padding-left", (pwidth - img.clientWidth) / 2);

    }

    alert("image heigh after change : " + img.clientHeight + "image width after change : " + img.clientWidth);

  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dvimg" class="col-md-12 panel mbl text-center" style="height: 300px; width: 400px;">
  <img id="imgLogo" src="images/blank.jpg" />
</div>

另外,每个浏览器的结果都不同。

感谢您的任何帮助。

【问题讨论】:

  • 尝试使用 innerWidth 和 innerHeight。

标签: jquery image height client width


【解决方案1】:

图像必须首先加载,这在文档准备就绪时还没有 - 如果它没有被缓存。这就是为什么它在第一次加载页面时返回一个相当随机的数字。

为了始终正确,请在 $(window).on('load', function() { ... }) 中运行函数。

编辑 - 我现在看到一些关于代码的棘手问题。窗口加载后您无法运行整个函数,因为附加 src 发生在函数本身内部。因此,最好将其取出并单独针对徽标的加载(.one().on() 的变体,会触发一次):

$(document).ready(function() {

  var src = 'https://www.gstatic.com/webp/gallery/3.sm.jpg';
  $('#imgLogo').attr("src", src);

  $('#imgLogo').one('load', function() {SetLogo()});

  function SetLogo(){

  ...

  }
});

完整的sn-p:

$(document).ready(function() {

  var src = 'https://www.gstatic.com/webp/gallery/3.sm.jpg';
  $('#imgLogo').attr("src", src);

  $('#imgLogo').one('load', function() {
    SetLogo()
  });

  function SetLogo() {

    if (src == "") {

      $('#dvimg').addClass("hidden");
    } else {

      $('#dvimg').removeClass("hidden");

      var panel = document.getElementById('dvimg');
      var pwidth = panel.clientWidth;
      var pheigh = panel.clientHeight;

      var img = document.getElementById('imgLogo');
      alert("image w= " + $('#imgLogo').width() + " image H= " + $('#imgLogo').height());


      var ratio = img.clientWidth / img.clientHeight;

      if (img.clientWidth > pwidth) {
        alert('width > pwidth');
        $('#imgLogo').height(pwidth / ratio);
        $('#imgLogo').width(pwidth);

        $('#dvimg').css("padding-top", (pheigh - img.clientHeight) / 2);
        $('#dvimg').css("padding-left", 0);
      } else if (img.clientHeight > pheigh) {

        alert('height > pheigh');

        $('#imgLogo').height(pheigh);
        $('#imgLogo').width(pheigh * ratio);

        $('#dvimg').css("padding-left", (pwidth - img.clientWidth) / 2);

        $('#dvimg').css("padding-top", 0);
      } else {
        alert('else');
        $('#dvimg').css("padding-top", (pheigh - img.clientHeight) / 2);
        $('#dvimg').css("padding-left", (pwidth - img.clientWidth) / 2);

      }

      alert("image heigh after change : " + img.clientHeight + "image width after change : " + img.clientWidth);

    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dvimg" class="col-md-12 panel mbl text-center" style="height: 300px; width: 400px;">
  <img id="imgLogo" src="images/blank.jpg" />
</div>

【讨论】:

  • 我根据您的建议更改小提琴。但没有变化。我的意思是代码在每个负载中运行。我不知道为什么在小提琴中,结果有点不同。如果您可以在单独的网页中对其进行测试,我将不胜感激。按 Ctrl+F5 后,新的宽度和高度为 24!这是什么意思?
  • 任何特定的浏览器或设备? FF、IE、Chrome 和 Opera 在我的设置中似乎都可以正常工作。即使在清除缓存和 Ctrl+F5 之后。也粘贴在 Codepen 中。也许您可以提供您所描述内容的链接(以便我可以检查代码)...
  • 在我将“SetLogo”代码移动到 doc.ready() 之后,它大部分时间都可以工作。但是当我按下 Ctrl+F5 时有什么问题?为什么图片反应不好?
  • 您必须提供更多信息 - 浏览器、设备设置,或者可能是可以看到问题的链接,因为我无法复制它。听起来像是特定于设置或可能的服务器端缓存的东西。
  • 我猜它是右边的图像......除了在 Firefox 上调整大小可见之外,我自己没有看到任何异常。在 Windows 7 桌面四种类型的浏览器上进行了多次缓存刷新。
猜你喜欢
  • 2015-05-17
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
相关资源
最近更新 更多