【问题标题】:naturalWidth and naturalHeight returns 0 using onload eventnaturalWidth 和 naturalHeight 使用 onload 事件返回 0
【发布时间】:2016-02-20 11:33:15
【问题描述】:

我已经阅读了无数关于这个问题的答案,我想出了以下内容,但它也不起作用。

function fitToParent(objsParent, tagName) {
    var parent, imgs, imgsCant, a, loadImg;
    //Select images
    parent = document.getElementById(objsParent);
    imgs = parent.getElementsByTagName(tagName);
    imgsCant = imgs.length;

    function scaleImgs(a) {
        "use strict";
        var w, h, ratioI, wP, hP, ratioP, imgsParent;

        //Get image dimensions
        w = imgs[a].naturalWidth;
        h = imgs[a].naturalHeight;
        ratioI = w / h;

        //Get parent dimensions
        imgsParent = imgs[a].parentNode;
        wP = imgsParent.clientWidth;
        hP = imgsParent.clientHeight;
        ratioP = wP / hP;

        //I left this as a test, all this returns 0 and false, and they shouldn't be 
        console.log(w);
        console.log(h);
        console.log(ratioI);
        console.log(imgs[a].complete);

        if (ratioP > ratioI) {
            imgs[a].style.width = "100%";
        } else {
            imgs[a].style.height = "100%";
        }
    }

    //Loop through images and resize them
    var imgCache = [];
    for (a = 0; a < imgsCant; a += 1) {
        imgCache[a] = new Image();
        imgCache[a].onload = function () {
            scaleImgs(a);

            //Another test, this returns empty, for some reason the function fires before aplying a src to imgCache
            console.log(imgCache[a].src);

        }(a);
        imgCache[a].src = imgs[a].getAttribute('src');
    }

}
fitToParent("noticias", "img");

总而言之,问题是事件onload在图像加载之前触发(或者我是这么理解的)。

补充一点:

  • 一开始我不知道父母和孩子的尺寸, 因为它们因在页面上的位置而异。
  • 我不想使用 jQuery。
  • 我尝试了另一个函数,将onload 事件更改为 window,它起作用了,但是调整大小需要很多时间,因为 它等待所有内容加载,使页面看起来更慢, 我就是这样得出结论的 onload 事件。

提前致谢!

编辑:

我做了一个小提琴,这样更容易看问题 https://jsfiddle.net/whn5cycf/

【问题讨论】:

    标签: javascript javascript-events event-handling


    【解决方案1】:

    由于某种原因,该函数在将 src 应用到 imgCache 之前触发

    嗯,原因是你正在立即调用函数:

      imgCache[a].onload = function () {
    
      }(a);
    // ^^^ calls the function
    

    您调用该函数并将undefined(该函数的返回值)分配给.onload

    如果你想使用 IIFE 来捕获 a 的当前值,你必须让它返回一个函数并接受一个将 a 的当前值分配给的参数:

    imgCache[a].onload = function (a) {
      return function() {
        scaleImgs(a);
      };
    }(a);
    

    再看看JavaScript closure inside loops – simple practical example

    【讨论】:

    • 我修改了,还是有问题。给我一分钟,我会搞定的。
    • 我认为问题可能出在您的 scaleImgs 函数上。您可能想要访问imgCache 中的元素,而不是imgs。但不太确定。
    • 我在您的更改中添加了小提琴
    • 您的更改有两个问题:1) IIFE 仍然立即执行,这就是它的目的。 console.log 仍将记录 undefined,因为您在设置 src 之前调用它。您必须在内部函数中移动该调用。 2)您忘记将a 作为参数添加到外部函数。请查看链接以了解 IIFE 的工作原理。
    • 我搞定了,谢谢!我仍然没有完全掌握闭包的概念,但我会继续阅读有关该主题的内容。
    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2010-12-11
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多